¿Cómo se guarda un archivo no rastreado?


Tengo cambios en un archivo, además de un nuevo archivo, y me gustaría usar git stash para guardarlos mientras cambio a otra tarea. Pero git stash solo almacena los cambios en el archivo existente; el nuevo archivo permanece en mi árbol de trabajo, saturando mi trabajo futuro. ¿Cómo puedo guardar este archivo no rastreado?

 967
Author: svick, 2009-05-07

11 answers

Actualización 17 de mayo 2018:

Las nuevas versiones de git ahora tienen git stash --all que almacena todos los archivos, incluidos los archivos no rastreados e ignorados.
git stash --include-untracked ya no toca archivos ignorados (probado en git 2.16.2).

Respuesta original abajo:

Advertencia, hacer 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 para almacenar archivos sin seguimiento sin ponerlos en escena.

Agregue (git add) el archivo y comience a rastrearlo. Entonces stash. Dado que todo el contenido del archivo es nuevo, se almacenará, y puede manipularlo según sea necesario.

 1238
Author: sykora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 19:26:41

A partir de git 1.7.7, git stash acepta la opción --include-untracked (o short-hand -u). Para incluir archivos no rastreados en su alijo, use cualquiera de los siguientes comandos:

git stash --include-untracked
git stash -u

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

 357
Author: John Kary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-05 20:10:37

Añadir el archivo al índice:

git add path/to/untracked-file
git stash

Todo El contenido del índice, además de cualquier unstaged cambios en los archivos existentes, todos en el alijo.

 58
Author: skiphoppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-07 15:57:37

En git bash, escondiendo de archivos sin seguimiento se logra mediante el comando

git stash --include-untracked

O

git stash -u

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

Git stash elimina de tu espacio de trabajo cualquier archivo sin seguimiento o sin confirmar. Y puedes revertir git stash usando los siguientes comandos

git stash pop

Esto volverá a colocar el archivo en su espacio de trabajo local.

Mi experiencia

Tuve que realizar una modificación en mi archivo gitIgnore para evitar movimiento de .classpath y .project files into remote repo. No se me permite mover esto modificado .gitIgnore en repositorio remoto a partir de ahora.

.classpath y .los archivos de proyecto son importantes para eclipse, que es mi editor de Java.

En primer lugar agregué selectivamente el resto de los archivos y confirmé para staging. Sin embargo, el empuje final no se puede realizar a menos que el modificado .gitIgnore fiels y los archivos no rastreados viz. .proyecto y .classpath no están guardados.

I usado

 git stash 

Para guardar el modificado .Archivo gitIgnore.

Para guardar.classpath y .archivo de proyecto, usé

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 ubicación de trabajo en eclipse. Procedí a completar el procedimiento para enviar los archivos confirmados a remoto. Una vez que esto se hizo con éxito, usé

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 este cepillos a un lado conceptos erróneos.

 44
Author: DolphinJava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 13:01:26

Como se ha dicho en otra parte, la respuesta es git add el archivo. por ejemplo:

git add path/to/untracked-file
git stash

Sin embargo, la pregunta también se plantea en otra respuesta: ¿Qué pasa si realmente no desea agregar el archivo? Bueno, por lo que puedo decir, tienes que hacerlo. Y la siguiente voluntad 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, ¿qué puedes hacer? Bueno, usted tiene que añadir realmente el archivo, sin embargo, puede efectivamente un-añadir 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 de git add (es decir, con un archivo sin seguimiento llamado path/to/untracked-file; además de cualquier otro cambio que pueda haber tenido en los archivos rastreados).

Otra posibilidad para un flujo de trabajo sobre 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 mencionó en un comentario de @mancocapac, es posible que desee agregar --exclude-standard al comando git ls-files (entonces, git ls-files -o --exclude-standard).]

... que también podría ser fácilmente scripted even incluso los alias harían (presentados en sintaxis zsh; ajustar según sea necesario) [también, acorté el nombre del archivo para que todo se ajuste a 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 de shell o función, para permitir que se proporcionen parámetros a git stash, en caso de que no desee pop sino apply, y / o quiera poder especificar un alijo específico, en lugar de simplemente tomar la parte superior una. Tal vez esto (en lugar del segundo alias, arriba) [espacio en blanco despojado para caber sin desplazamiento; volver a agregar para una 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}

Que por supuesto pondrías en tu .zshrc o equivalente para hacer existir a largo plazo.

Esperemos que esta respuesta sea útil para alguien, poniendo todo junto en una sola respuesta.

 18
Author: lindes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 06:27:26

En la versión 2.8.1 de git: seguir funciona para mí.

Para guardar archivos modificados y sin seguimiento en el alijo sin un nombre

git stash save -u

Para guardar archivos modificados y no rastreados en el alijo con un nombre

git stash save -u <name_of_stash>

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

git stash pop

git stash apply stash@{0}
 8
Author: user1012513,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 09:23:22

Pude guardar solo los archivos no rastreados 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}

La última muestra el alijo de los archivos rastreados, dejando así solo los archivos no rastreados guardados.

 5
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 22:33:33

Hay varias respuestas correctas aquí, pero quería señalar que para nuevos directorios enteros, 'git add path' NO trabajo. Así que si tienes un montón de archivos nuevos en untracked-path y haces esto:

git add untracked-path
git stash "temp stash"

Esto se guardará 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 untracked-path es el único camino que estás escondiendo, el alijo "temp stash" será un alijo vacío. La forma correcta es agregar la ruta completa, no solo el nombre del directorio (es decir, end la ruta con un'/'):

git add untracked-path/
git stash "temp stash"
 1
Author: DrStrangepork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 23:59:24

Pensé que esto podría resolverse diciéndole a git que el archivo existe, en lugar de enviar todo el contenido al área de preparación, y luego llamar a git stash. Araqnid describe 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, esto último no funciona:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
 0
Author: Andrew Grimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:53

Simplemente puede hacerlo con el siguiente comando

git stash save --include-untracked

O

git stash save -u

Para más información sobre git stash Visite esta publicación (Haga clic aquí)

 0
Author: shubham mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-28 07:35:42

Solía reflexionar y desear la misma característica. Pero con el tiempo, me di cuenta de que realmente no es necesario. Cuando se almacena, está bien dejar los nuevos archivos. Nada "malo" puede pasarles (cuando revisas algo más, git se equivocará y no sobrescribirá el archivo sin seguimiento existente)

Y dado que normalmente el intervalo de tiempo entre git stash y git stash pop es bastante pequeño, necesitará el archivo sin seguimiento rápidamente de nuevo. Así que diría que el inconveniente de que el archivo aparezca en git status mientras estás trabajando en algo más (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 de lo contrario costaría tratar de agregar el archivo sin seguimiento a su alijo.

 -6
Author: Dieter_be,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-18 09:12:14