¿Cómo escondes un archivo no rastreado?
Pregunta
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 por sí solo oculta solo los cambios en el archivo existente; el nuevo archivo permanece en mi árbol de trabajo, abarrotando mi trabajo futuro. ¿Cómo guardo este archivo no rastreado?
Solución
Actualización 17 de mayo de 2018:
Las nuevas versiones de git ahora tienen git stash --all
que oculta todos los archivos, incluidos los archivos no rastreados e ignorados.
git stash --include-untracked
ya no toca los 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 guardar archivos sin rastrear sin organizarlos.
Agregue ( 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.
Otros consejos
A partir de git 1.7.7, git stash
acepta la opción --include-rastreado
(o -u
abreviado). Para incluir archivos sin seguimiento en su escondite, use cualquiera de los siguientes comandos:
git stash --include-untracked
git stash -u
Agregue el archivo al índice:
git add path/to/untracked-file
git stash
Todo el contenido del índice, más cualquier cambio no escalonado a los archivos existentes, todo entrará en el alijo.
En git bash, el almacenamiento de archivos no rastreados se logra mediante 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 confirmado de su espacio de trabajo. Y puede revertir git stash usando los siguientes comandos
git stash pop
Esto colocará el archivo nuevamente en su espacio 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.
En primer lugar, agregué selectivamente el resto de los archivos y me comprometí para la puesta en escena. Sin embargo, el empuje final no se puede realizar a menos que el archivo .gitIgnore modificado se encuentre y los archivos no rastreados, a saber. .project y .classpath no están escondidos.
Utilicé
git stash
para guardar el archivo .gitIgnore modificado.
Para guardar el archivo .classpath y .project, utilicé
<*>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. Continué completando el procedimiento para enviar los archivos comprometidos a control remoto. Una vez que esto se hizo con éxito, usé
<*>Esto pegó los mismos archivos en mi espacio de trabajo. Esto me devolvió mi capacidad de trabajar en el mismo proyecto en eclipse. Espero que esto deje de lado las ideas falsas.
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é sucede si realmente no desea agregar el archivo? Bueno, por lo que puedo ver, tienes que hacerlo. Y lo siguiente NOT 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, ¿qué puedes hacer? Bueno, realmente debe agregar el archivo, sin embargo , puede anular la agregación 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
(es decir, con un archivo no rastreado llamado ruta / a / untracked-file
; más cualquier otro cambio que pueda haber tenido para rastrear 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 comando git ls-files
( entonces, git ls-files -o --exclude-standard
).]
... que también podría ser fácil de escribir, incluso los alias funcionarían (presentado en sintaxis zsh; ajustar según sea necesario) [también, acorté el nombre del archivo para que todo se ajuste 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 este último podría ser mejor como un script o función de shell, para permitir que los parámetros se suministren a git stash
, en caso de que no desee pop
pero apply
, y / o quiere poder especificar un alijo específico, en lugar de solo tomar el primero. Quizás esto (en lugar del segundo alias, arriba) [espacio en blanco despojado para ajustarse sin desplazarse; volver a 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 oculto, p. ej. unstashall apply stash @ {1}
o unstashall pop stash @ {1}
Que, por supuesto, pondría en su .zshrc
o equivalente para que exista a largo plazo.
Espero que esta respuesta sea útil para alguien, ya que reúne todo en una sola respuesta.
En git versión 2.8.1: lo siguiente funciona para mí.
Para guardar archivos modificados y sin seguimiento en un alijo sin nombre
git stash save -u
Para guardar archivos modificados y sin seguimiento en un alijo 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}
Pude esconder 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}
El último muestra el alijo de los archivos rastreados, dejando solo los archivos no rastreados.
Si desea guardar archivos sin seguimiento, pero mantener los archivos indexados (los que está a punto de confirmar, por ejemplo), simplemente agregue la opción -k
(mantener el índice) a la - u
git stash -u -k
Simplemente puede hacerlo con el siguiente comando
git stash save --include-untracked
o
git stash save -u
Para obtener más información acerca de git stash Visita esta publicación (haz clic aquí)
supongamos que el archivo nuevo y sin seguimiento se llama: " views.json " ;. si desea cambiar de sucursal ocultando el estado de su aplicación, generalmente escribo:
git add views.json
Entonces:
git stash
Y sería escondido. Entonces puedo cambiar de rama con
git checkout other-nice-branch
Hay varias respuestas correctas aquí, pero quería señalar que para los directorios completos nuevos, 'git add path'
NOT trabajo. Entonces, si tiene un montón de archivos nuevos en untracked-path y haga 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 untracked-path es la única ruta que está escondiendo, el alijo " alijo temporal " Será un alijo vacío. La forma correcta es agregar la ruta completa, no solo el nombre del directorio (es decir, finalizar la ruta con un '/'):
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 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, este último no funciona:
$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Solía ??reflexionar y desear la misma característica. Pero con el tiempo, noté que realmente no es necesario. Cuando guardas, está bien dejar los nuevos archivos. Nada "malo" puede sucederles (cuando revisas algo más, git producirá un error y no sobrescribirá el archivo sin seguimiento existente)
Y como generalmente el período de tiempo entre el git stash
y el git stash pop
es bastante pequeño, necesitará el archivo sin seguimiento rápidamente nuevamente.
Entonces, diría que la inconveniencia de que el archivo aparezca en git status
mientras está trabajando en otra cosa (entre git stash
y git stash pop
) es más pequeño que las molestias causadas por el trabajo y la atención necesaria que de lo contrario costaría intentar agregar el archivo no rastreado a su escondite.