web-dev-qa-db-fra.com

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

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

96
Max Nanasy

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

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

git show stash@{0}^3

ou simplement l’arbre "non suivi" lui-même, via:

git show stash@{0}^3:

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

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

Il n'y a malheureusement aucun bon moyen d'obtenir un résumé des différences entre tous les états par étapes + non par étapes + sans suivi par rapport à l'état "actuel". c'est à dire: git show stash@{0} ne peut pas être fait pour inclure les fichiers non suivis. Cela est dû au fait que l'objet arborescent du commit de sauvegarde lui-même, appelé stash@{0}:, n'inclut aucune modification par rapport au troisième parent "non organisé".

Cela est dû à la façon dont les stashes sont réappliqués: les fichiers suivis peuvent être facilement appliqués en tant que correctifs, tandis que les fichiers non suivis ne peuvent être appliqués, en théorie, qu'en tant que "fichiers entiers".

115
Will Palmer

Vous pouvez répertorier toutes les validations de cache avec la commande suivante:

git rev-list -g stash

Étant donné que les stashes sont représentés comme une validation de fusion à 3 voies de HEAD, l'index et une validation "root" sans parent des fichiers non suivis, les stashes de fichiers non suivis peuvent être répertoriés en canalisant la sortie ci-dessus dans ce qui suit:

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 suivis et stockés

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

Bien sûr, supprimez 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 fichiers non suivis

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

Liste de tous les contenus de toutes les cachettes

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

Pour répertorier les fichiers non suivis dans la cachette:

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

Pour afficher une différence complète de tous les fichiers non suivis (avec contenu):

git show stash@{0}^3

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

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é comme stash@{0}, stash@{1} etc. Le premier parent de cette validation est le HEAD au moment du stash, le deuxième parent contient les modifications apportées aux fichiers suivis et le troisième (qui peut ne pas exister) les modifications aux fichiers non suivis.

Ceci est en partie expliqué dans la page de manuel sous "Discussion" .

10
wisbucky

Pour voir tous les fichiers dans la cachette (à la fois 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 dont la cachette que vous souhaitez afficher. Notez qu'il le présentera toujours dans deux listes consécutives.

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

5
Randall

Solution de contournement: le transfert de fichiers avant de les ranger fera git stash show -p fonctionne comme prévu.

git add .
git stash save

Remarque: De cette façon, le pouvoir ajoute également des parties interactives, voici comment .
Attention: Assurez-vous que vous n'avez pas déjà créé de travail, sinon vous ne pourrez pas le distinguer.
Cela peut être utile.

3
weshouman