ignorar ignora configurar como cambios archivos archivo git git-stash

ignora - En git, ¿hay alguna manera de mostrar archivos escondidos sin seguimiento sin aplicar el alijo?



ignorar cambios git (5)

Si ejecuto git stash -u , puedo esconder archivos sin seguimiento. Sin embargo, dichos archivos sin seguimiento no aparecen en absoluto con git stash show stash@{0} . ¿Hay alguna forma de mostrar archivos ocultos sin seguimiento sin aplicar el alijo?


Los archivos sin seguimiento se almacenan en el tercer padre de una confirmación de alijo. (Esto no está realmente documentado, pero es bastante obvio desde la confirmación que introdujo la característica -u, 787513 ... , y la forma en que el resto de la documentación de git-stash frases de git-stash cosas ... o simplemente haciendo git log --graph stash@{0} )

Puede ver solo la parte "sin seguimiento" del alijo a través de:

git show stash@{0}^3

o, simplemente el árbol "sin seguimiento" en sí, a través de:

git show stash@{0}^3:

o, un archivo particular "sin seguimiento" en el árbol, a través de:

git show stash@{0}^3:<path/to/file>

Desafortunadamente, no hay una buena manera de obtener un resumen de las diferencias entre todos los estados escalonados + no escalonados + no registrados frente a "actuales". es decir: no se puede hacer que git show stash@{0} incluya los archivos sin seguimiento. Esto se debe a que el objeto de árbol del alijo se compromete a sí mismo, al que se hace referencia como stash@{0}: no incluye ningún cambio del tercer elemento primario "sin instancia".

Esto se debe a la forma en que se vuelven a aplicar los depósitos: los archivos rastreados se pueden aplicar fácilmente como parches, mientras que los archivos sin seguimiento solo se pueden aplicar, en teoría, como "archivos completos".


Para enumerar los archivos sin seguimiento en el alijo:

git ls-tree -r stash@{0}^3 --name-only

Para mostrar una diferencia completa de todos los archivos sin seguimiento (con contenido):

git show stash@{0}^3

Estos comandos leen el último alijo (más reciente). Para depósitos previos, incremente el número detrás del "stash @", por ejemplo stash@{2} para el segundo del último escondite.

El motivo por el que esto funciona es que git stash crea una confirmación de fusión para cada alijo, que se puede referenciar como stash@{0} , stash@{1} etc. El primer padre de este commit es el HEAD en el momento del alijo, el segundo padre contiene los cambios en los archivos rastreados, y el tercero (que puede no existir) los cambios en los archivos sin seguimiento.

Esto se explica en parte en la página de manual en "Discusión" .


Para ver todos los archivos en el alijo (tanto rastreados como no rastreados), agregué este alias a mi configuración:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Se necesita un único argument de qué escondite desea ver. Tenga en cuenta que aún lo presentará en dos listas consecutivas.

La sección if...fi cambia el argumento bash $ 1 a 0 si no se pasó ninguno.


Puede enumerar todas las confirmaciones de stash con el siguiente comando:

git rev-list -g stash

Como los depósitos se representan como una fusión de 3 vías, la confirmación de HEAD, el índice y una confirmación "raíz" sin padres de archivos sin seguimiento, depósitos de archivos sin seguimiento se pueden enumerar canalizando el resultado anterior a lo siguiente:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Aplicaciones útiles de lo anterior:

Mostrar solo archivos ocultos y sin seguimiento

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Por supuesto, elimine el --stat para ver el contenido de los archivos.

Encuentra un archivo específico

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

Grep archivos sin seguimiento

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Listar todos los contenidos de todos los stashes

git rev-list -g stash | git rev-list --stdin | xargs git show --stat


Una solución alternativa: almacenar archivos antes de almacenarlos hará que git stash show -p funcione como se espera.

git add .
git stash save

Nota: De esta manera también se le da poder a la adición de porciones interactivas, así es cómo .
Precaución: asegúrese de no tener un trabajo previamente organizado, o no podrá distinguirlo.
Esto puede ser de utilidad.