git - trabajar - ¿Cómo esconder un archivo sin seguimiento?
tipos de etiquetas en git (11)
A partir de git 1.7.7, git stash
acepta la opción --include-untracked
(o short-hand -u
). Para incluir archivos sin seguimiento en su alijo, use uno de los siguientes comandos:
git stash --include-untracked
git stash -u
Tengo cambios en un archivo, más un archivo nuevo, y me gustaría usar git stash para guardarlos mientras cambio a otra tarea. Pero el git stash solo esconde los cambios en el archivo existente; el nuevo archivo permanece en mi árbol de trabajo, saturando mi trabajo futuro. ¿Cómo escondo este archivo sin seguimiento?
Agregue el archivo al índice:
git add path/to/untracked-file
git stash
Todo el contenido del índice, más cualquier cambio no organizado en los archivos existentes, lo hará todo en el alijo.
Como se ha dicho en otra parte, la respuesta es git add
el archivo. p.ej:
git add path/to/untracked-file
git stash
Sin embargo, la pregunta también se plantea en otra respuesta: ¿Qué sucede si realmente no desea agregar el archivo? Bueno, por lo que puedo decir, tienes que hacerlo. Y lo siguiente NO funcionará:
git add -N path/to/untracked/file # note: -N is short for --intent-to-add
git stash
esto fallará, como sigue:
path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
¿Entonces que puedes hacer? Bueno, realmente tienes que agregar el archivo, sin embargo , puedes git rm --cached
efectiva más tarde, con git rm --cached
:
git add path/to/untracked-file
git stash save "don''t forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don''t forget to un-add path/to/untracked-file
git stash pop # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file
Y luego puede continuar trabajando, en el mismo estado en el que estaba antes del git add
(es decir, con un archivo sin seguimiento llamado path/to/untracked-file
seguimiento de archivos; más cualquier otro cambio que haya tenido que rastrear a los archivos).
Otra posibilidad para un flujo de trabajo en esto sería algo como:
git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack
[Nota: Como se menciona en un comentario de @mancocapac, es posible que desee agregar --exclude-standard
al git ls-files
(por lo tanto, git ls-files -o --exclude-standard
).]
... lo que también podría ser fácil de escribir, incluso los alias lo harían (presentado en la sintaxis zsh; ajuste según sea necesario) [también, acorté el nombre del archivo para que todo encaje en la pantalla sin desplazarse en esta respuesta; no dude en sustituir un nombre de archivo alternativo de su elección]:
alias stashall=''git ls-files -o > .gftu; git add `cat .gftu`; git stash''
alias unstashall=''git stash pop; git rm --cached `cat .gftu`; rm .gftu''
Tenga en cuenta que esta última podría ser mejor como un script de shell o una función, para permitir que los parámetros se suministren a git stash
, en caso de que no quiera pop
pero se apply
, y / o desee poder especificar un stash específico, en lugar de sólo tomando el primero. Quizás esto (en lugar del segundo alias, arriba) [espacios en blanco reducidos para ajustarse sin desplazarse; re-agregar para mayor legibilidad]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
Nota : En este formulario, debe proporcionar un argumento de acción así como el identificador si va a proporcionar un identificador de alijo, por ejemplo, unstashall apply stash@{1}
o unstashall pop stash@{1}
Lo que, por supuesto, pondrías en tu .zshrc
o equivalente para que existiera a largo plazo.
Esperemos que esta respuesta sea útil para alguien, ya que reúne todo en una sola respuesta.
En git bash, el ocultamiento de archivos sin seguimiento se logra usando el comando
git stash --include-untracked
o
git stash -u
http://git-scm.com/docs/git-stash
git stash elimina cualquier archivo no rastreado o no comprometido de su área de trabajo. Y puedes revertir el git stash usando los siguientes comandos
git stash pop
Esto colocará el archivo nuevamente en su área de trabajo local.
Mi experiencia
Tuve que realizar una modificación en mi archivo gitIgnore para evitar el movimiento de los archivos .classpath y .project al repositorio remoto. No se me permite mover este .gitIgnore modificado en el repositorio remoto a partir de ahora.
Los archivos .classpath y .project son importantes para eclipse, que es mi editor Java.
En primer lugar, agregué selectivamente el resto de los archivos y me comprometí para la puesta en escena. Sin embargo, la inserción final no se puede realizar a menos que los archivos .gitIgnore modificados y los archivos sin seguimiento viz. .project y .classpath no están ocultos.
solía
git stash
para esconder el archivo .gitIgnore modificado.
Para guardar el archivo .classpath y .project, utilicé
git stash --include-untracked
y eliminó los archivos de mi espacio de trabajo. La ausencia de estos archivos me quita la capacidad de trabajar en mi lugar de trabajo en eclipse. Continué con completar el procedimiento para enviar los archivos confirmados al remoto. Una vez hecho esto con éxito, utilicé
git stash pop
Esto volvió a pegar los mismos archivos en mi espacio de trabajo. Esto me devolvió mi capacidad de trabajar en el mismo proyecto en eclipse. Espero que esto elimine los conceptos erróneos.
En la versión 2.8.1 de git: los siguientes trabajos para mí.
Para guardar archivos modificados y sin rastrear en el alijo sin un nombre
git stash save -u
Para guardar archivos modificados y sin rastrear en un alijo con un nombre
git stash save -u <name_of_stash>
Puede utilizar cualquiera de pop y aplicar más adelante de la siguiente manera.
git stash pop
git stash apply stash@{0}
Hay varias respuestas correctas aquí, pero quería señalar que para los directorios completos nuevos, ''git add path''
NO funcionará. Entonces, si tienes un montón de archivos nuevos en ruta sin seguimiento y haces esto:
git add untracked-path
git stash "temp stash"
Esto se esconderá con el siguiente mensaje:
Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty
y si el camino sin seguimiento es el único camino que está ocultando, el "almacenamiento de temperatura" del alijo será un alijo vacío. La forma correcta es agregar la ruta completa, no solo el nombre del directorio (es decir, terminar la ruta con una ''/''):
git add untracked-path/
git stash "temp stash"
Pensé que esto podría resolverse diciéndole a git que el archivo existe, en lugar de comprometer todo su contenido al área de preparación, y luego llamar a git stash
. Araqnid describes cómo hacer lo primero.
git add --intent-to-add path/to/untracked-file
o
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file
Sin embargo, este último no funciona:
$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Pude guardar solo los archivos sin seguimiento haciendo:
git stash save "tracked files I''m working on"
git stash save -u "untracked files I''m trying to stash"
git stash pop stash@{1}
El último muestra el alijo de los archivos rastreados, dejando solo los archivos sin seguimiento al azar.
Simplemente puedes hacerlo con el siguiente comando
git stash save --include-untracked
o
git stash save -u
Para más información sobre el git stash visite este post (haga clic aquí)
Solía reflexionar y desear la misma característica. Pero con el tiempo, me di cuenta de que realmente no es necesario. Cuando se guarda, está bien dejar los nuevos archivos. No les puede pasar nada "malo" (cuando compruebas algo más, git producirá un error y no sobrescribirá el archivo sin seguimiento existente)
Y dado que normalmente el intervalo de tiempo entre el git stash
y el git stash pop
es bastante pequeño, necesitarás el archivo sin seguimiento rápidamente de nuevo. Por lo tanto, diría que el inconveniente de que el archivo aparezca en git status
mientras está trabajando en otra cosa (entre el git stash
y el git stash pop
) es más pequeño que el inconveniente causado por el trabajo y la atención necesaria que de otro modo costaría intente agregar el archivo sin seguimiento a su alijo.
Actualización 17 de mayo de 2018:
Las nuevas versiones de git ahora tienen git stash --all
que esconde todos los archivos, incluidos los archivos sin seguimiento e ignorados.
git stash --include-untracked
ya no toca archivos ignorados (probado en git 2.16.2).
Respuesta original a continuación:
A partir de la versión 1.7.7 puede usar git stash --include-untracked
o git stash save -u
para esconder archivos sin seguimiento sin organizarlos.
Agregue ( git add
) el archivo y comience a rastrearlo. Luego esconderlo. Dado que todo el contenido del archivo es nuevo, se ocultarán y podrá manipularlo según sea necesario.