132 votes

Dans git, y a-t-il un moyen d'afficher les fichiers cachés non suivis sans appliquer la cachette ?

Si je cours git stash -u je peux cacher des fichiers non tracés. Cependant, ces fichiers non tracés n'apparaissent pas du tout dans l'application git stash show stash@{0} . Existe-t-il un moyen d'afficher les fichiers cachés non suivis sans appliquer la cachette ?

170voto

Will Palmer Points 2614

Les fichiers non suivis sont stockés dans le troisième parent d'un commit stash. (Ce n'est pas réellement documenté, mais c'est assez évident à partir de Le commit qui a introduit la fonctionnalité -u, 787513... et la façon dont le le reste de la documentation pour git-stash les phrases des choses... ou simplement en faisant git log --graph 'stash@{0}' )

Vous pouvez visualiser uniquement la partie "non suivie" de la cachette via :

git show 'stash@{0}^3'

ou, juste l'arbre "non tracé" lui-même, via :

git show 'stash@{0}^3:'

ou, un fichier particulier "non suivi" dans l'arbre, via :

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

Il n'y a malheureusement pas de bon moyen d'obtenir un résumé des différences entre tous les états staged+unstaged+untracked par rapport à l'état "actuel", par exemple : git show 'stash@{0}' ne peut pas inclure les fichiers non suivis. Ceci est dû au fait que l'objet arbre du commit de la cachette lui-même, appelé stash@{0}: ne comprend pas les changements apportés par le troisième parent "non mis en scène".

Cela est dû à la façon dont les stocks sont réappliqués : les fichiers suivis peuvent être facilement appliqués comme des correctifs, alors que les fichiers non suivis ne peuvent être appliqués, en théorie, que comme des "fichiers entiers".

27voto

Steve Points 857

Vous pouvez lister tous les commits de la cachette avec la commande suivante :

git rev-list -g stash

Puisque les stocks sont représentés comme un commit de fusion à 3 voies de HEAD, l'index, et un commit "Root" sans parent de fichiers non suivis, les stocks de fichiers non suivis peuvent être listés en passant la sortie ci-dessus dans la suivante :

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

Applications utiles de ce qui précède :

Afficher uniquement les fichiers non tracés et cachés

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

Bien sûr, retirez le --stat pour voir le contenu des fichiers.

Trouver un fichier spécifique

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

Grep des fichiers non suivis

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

Liste du contenu de toutes les cachettes

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

16voto

wisbucky Points 829

Pour lister les fichiers non suivis dans la cachette :

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

Pour afficher un diff complet de tous les fichiers non suivis (avec le contenu) :

git show stash@{0}^3

Ces commandes lisent la dernière réserve (la plus récente). Pour les stocks antérieurs, incrémentez le nombre derrière le "stash@", par exemple stash@{2} pour le second de la dernière réserve.

La raison pour laquelle cela fonctionne est que git stash crée un commit de fusion pour chaque stash, qui peut être référencé en tant que stash@{0} , stash@{1} etc. Le premier parent de ce commit est le HEAD au moment de la mise en cachette, le second parent contient les modifications des fichiers suivis, et le troisième (qui peut ne pas exister) les modifications des fichiers non suivis.

Cela s'explique en partie par le page de manuel sous "Discussion .

6voto

Randall Points 830

Pour voir tous les fichiers de la cachette (suivis et non suivis), j'ai ajouté cet alias à ma configuration :

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

Il faut un seul argument de la cachette que vous voulez voir. Notez qu'elle sera toujours présentée dans deux listes consécutives.

Le site if...fi section change l'argument bash 1 à 0 si aucun n'a été passé.

6voto

new_lido Points 111

Une solution de contournement : La mise en attente des fichiers avant de les stocker rendra git stash show -p fonctionnent comme prévu.

git add .
git stash save

Note : Cette façon de faire donne le pouvoir d'ajouter des portions interactives aussi, voici comment .
Attention : Assurez-vous que vous n'avez pas de travaux déjà mis en scène, sinon vous ne pourrez pas les distinguer.
Cela peut être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X