En git, ¿hay alguna forma de mostrar archivos guardados sin seguimiento sin aplicar el alijo?


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

Author: Max Nanasy, 2012-10-02

5 answers

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

Puedes ver solo la parte "no rastreada" del alijo a través de:

git show stash@{0}^3

O, solo el árbol" sin seguimiento " en sí, a través de:

git show stash@{0}^3:

O, un archivo "no rastreado" en particular en el árbol, vía:

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 staged+unstaged+untracked vs "current". ie: git show stash@{0} no se puede hacer para incluir los archivos sin seguimiento. Esto se debe a que el objeto árbol del stash commit en sí, conocido como stash@{0}:, no incluye ningún cambio del tercer padre "no escalonado".

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

 82
Author: Will Palmer,
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
2012-10-02 04:59:46

Puedes listar todas las confirmaciones de stash con el siguiente comando:

git rev-list -g stash

Dado que los stashes se representan como una confirmación de fusión de 3 vías de HEAD, el índice y una confirmación "raíz" sin padre de archivos sin seguimiento, los stashes de archivos sin seguimiento se pueden enumerar canalizando la salida anterior a lo siguiente:

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

Aplicaciones útiles de lo anterior:

Mostrar solo archivos no rastreados y guardados

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

por supuesto, eliminar el --stat para ver el contenido de la file.

Encuentra un archivo específico

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

Archivos Grep 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 alijos

git rev-list -g stash | git rev-list --stdin | xargs git show --stat
 16
Author: Steve,
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-05-17 13:55:04

Para listar los archivos no rastreados en el alijo:

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

Para mostrar una diferencia completa de todos los archivos no rastreados (con contenido):

git show stash@{0}^3


Estos comandos leen el último (más reciente) alijo. Para los alijos anteriores, aumente el número detrás del " alijo@", por ejemplo stash@{2} para el segundo del último alijo.

La razón por la que esto funciona es que git stash crea una confirmación de fusión para cada alijo, que puede ser referenciada como stash@{0}, stash@{1} etc. El primer padre de esto commit es la CABEZA en el momento del alijo, el segundo padre contiene los cambios a los archivos rastreados, y el tercero (que puede no existir) los cambios a los archivos no rastreados.

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

 4
Author: wisbucky,
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
2015-12-29 14:18:41

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 -"

Toma un único argumento del que quieres ver el stash. Tenga en cuenta que todavía lo presentará en dos listas consecutivas.

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

 4
Author: Randall,
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:03:07

Una solución alternativa: Los archivos de almacenamiento provisional antes de almacenarlos harán que git stash show -p funcione como se esperaba.

git add .
git stash save

Nota: De esta manera le da el poder de agregar porciones interactivas también, aquí está cómo.
Precaución: Asegúrese de que no ha preparado previamente el trabajo, o no será capaz de distinguirlo.
Esto puede ser útil.

 1
Author: new_lido,
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
2016-10-07 10:11:51