Pregunta ¿Cómo escondes un archivo sin seguimiento?


Tengo cambios en un archivo, más un nuevo archivo, y me gustaría usar git stash para guardarlos mientras cambio a otra tarea. Pero git stash solo oculta los cambios en el archivo existente; el nuevo archivo permanece en mi árbol de trabajo, abarrotando mi trabajo futuro. ¿Cómo escondo este archivo sin seguimiento?


932
2018-05-07 15:54


origen


Respuestas:


Actualización 17 de mayo de 2018:

Las nuevas versiones de git ahora tienen git stash --all que almacena 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:

Advertencia, esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.

A partir de la versión 1.7.7, puede usar git stash --include-untracked o git stash save -u esconder archivos sin seguimiento sin organizarlos.

Añadir (git add) el archivo y comience a rastrearlo. Entonces esconder. Como todo el contenido del archivo es nuevo, se guardarán y podrá manipularlo según sea necesario.


1180
2018-05-07 16:02



A partir de git 1.7.7, git stash acepta el --include-untracked opción (o mano corta) -u) Para incluir archivos sin seguimiento en su escondite, use cualquiera de los siguientes comandos:

git stash --include-untracked
git stash -u

Advertencia, esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.


351
2017-07-25 15:49



Agregue el archivo al índice:

git add path/to/untracked-file
git stash

Todo el contenido del índice, más cualquier cambio no evaluado de los archivos existentes, se convertirán en el alijo.


55
2018-05-07 15:57



En git bash, el almacenamiento de archivos sin seguimiento se logra utilizando el comando

git stash --include-untracked

o

git stash -u

http://git-scm.com/docs/git-stash

git stash elimina cualquier archivo sin seguimiento o no asignado de su área de trabajo. Y puedes revertir 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 en el repositorio remoto. No puedo mover este .gitIgnore modificado en repositorio remoto a partir de ahora.

Los archivos .classpath y .project son importantes para eclipse, que es mi editor de Java.

Primero, agregué selectivamente el resto de los archivos y me comprometí a organizarlos. Sin embargo, la inserción final no se puede realizar a menos que los campos modificados .gitIgnore y los archivos no localizados viz. .project y .classpath no están escondidos.

solía

 git stash 

para esconder el archivo .gitIgnore modificado.

Para esconder archivos .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 empujar los archivos comprometidos a remoto. Una vez que esto se hizo con éxito, utilicé

git stash pop

Esto pegó los mismos archivos en mi espacio de trabajo. Esto me devolvió mi habilidad para trabajar en el mismo proyecto en eclipse. Espero que esto haga a un lado los conceptos erróneos.


44
2017-08-28 20:46



Como se ha dicho en otro lugar, 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 el siguiente NO trabajo:

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 debes agregar el archivo, sin embargo, puede deshacerlo de manera efectiva más adelante, 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 que estaba antes del git add (a saber, con un archivo sin seguimiento llamado path/to/untracked-file; además de cualquier otro cambio que haya tenido que realizar un seguimiento de 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 comando (entonces, git ls-files -o --exclude-standard).]

... que también podría ser fácilmente guionado, incluso con alias (presentado en sintaxis zsh, ajustar según sea necesario) [también acorté el nombre del archivo para que todo encaje en la pantalla sin desplazarse en esta respuesta; siéntase libre de 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 este último podría ser mejor como un script o función de shell, para permitir el suministro de parámetros a git stash, en caso de que no quieras pop pero applyy / o desea poder especificar un alijo específico, en lugar de simplemente tomar el superior. Quizás esto (en lugar del segundo alias, arriba) [espacio en blanco desforrado para ajustarse sin desplazamiento; volver a agregar para una mayor legibilidad]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Nota: De esta forma, debe proporcionar un argumento de acción, así como el identificador, si va a proporcionar un identificador de escondite, p. unstashall apply stash@{1} o unstashall pop stash@{1}


17
2018-02-06 02:00



En la versión 2.8.1 de git: siguientes trabajos para mí.

Para guardar archivos modificados y sin seguimiento en stash sin un nombre

git stash save -u

Para guardar archivos modificados y sin seguimiento en escondites con un nombre

git stash save -u <name_of_stash>

Puede usar pop y aplicar más tarde de la siguiente manera.

git stash pop

git stash apply stash@{0}

8
2018-02-20 09:23



Pude esconder sólo 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 no rastreados escondidos.


4
2018-05-06 22:33