136 votes

Faire en sorte que git diff --stat affiche le chemin complet du fichier

Sur l'action git diff --stat certains fichiers sont listés avec le chemin complet de la base de dépôt mais certains fichiers sont listés comme :

.../short/path/to/filename.  

C'est-à-dire que le chemin commence par ... et seul le chemin court est montré.

Je voudrais git diff de lister le chemin complet de tous les fichiers pour qu'il soit facilement traité par un script. Y a-t-il un moyen d'obtenir git diff pour toujours montrer le chemin complet

2voto

CervEd Points 146

git diff est une commande en porcelaine (facile à utiliser). Pour les scripts, vous voudrez probablement utiliser la commande de plomberie correspondante git diff-tree .

Vous pouvez obtenir git diff-tree pour afficher les chemins complets, relatifs au dépôt git, en utilisant une combinaison de la commande --name-only , -r et --no-commit-id options.

Exemples

Chemins des fichiers modifiés dans le "dernier" (le HEAD ) de la branche courante.

git diff-tree --name-only -r --no-commit-id HEAD

Chemins des fichiers dans la dernière livraison sur le serveur main branche

git diff-tree --name-only -r --no-commit-id main

Chemins d'accès aux fichiers des trois derniers commits sur le fichier main branche

git diff-tree --name-only -r main main~3

Chemins des fichiers du dernier commit sous le chemin src/

git diff-tree --name-only -r --no-commit-id main src/

Chemins absolus des fichiers modifiés dans le dernier commit de la branche courante.

git diff-tree --name-only -r --no-commit-id --line-prefix=`git rev-parse --show-toplevel`/ HEAD

Explication

git diff-tree compare les blobs de deux arborescent objets.

Un commit est un treeish qui pointe vers les objets du référentiel Root. Les répertoires sont également treeish alors que les fichiers sont blobs .

Running git diff-tree HEAD va comparer les gouttes de HEAD et HEAD~1 et contiennent la différence en blobs du dépôt Root. Pour voir tous les fichiers modifiés qui ne sont pas dans le Root, nous devons descendre dans le répertoire treeish objets. Pour ce faire, on utilise la fonction -r (comme dans recurse).

Notez que cela permet de comparer deux répertoires arbitraires dans des commits arbitraires.

Par défaut, si un seul commettre est spécifié, il est comparé à son parent. Par exemple, si vous exécutez git diff-tree HEAD est équivalent à git diff-tree HEAD HEAD~1 . Si vous n'avez spécifié qu'un seul commit comme arborescent l'identifiant du commit parent est affiché. Utilisation de --no-commit-id permet de s'en débarrasser.

git-diff-tree imprime beaucoup d'informations que nous ne voulons pas (identifiants, permissions, si c'est un ajout, une suppression, une modification). Nous voulons juste le nom, donc nous utilisons --name-only .

Si nous voulons des chemins absolus, nous devons préfixer toutes les lignes en utilisant quelque chose comme git rev-parse --show-toplevel . Cela permet d'obtenir le chemin absolu du référentiel, sans la terminaison / . Nous l'ajoutons donc.

--line-prefix=`git rev-parse --show-toplevel`/

0voto

user151841 Points 3371

J'ai créé l'alias git suivant :

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Il lit le nombre de colonnes à partir de l tput cols commande. Par défaut, elle effectue une comparaison avec master mais vous pouvez éventuellement spécifier une autre branche.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-1voto

Alex Spurling Points 6086

J'ai découvert que le comportement de diff --stat a changé quelque part autour de git 1.7.10. Auparavant, il raccourcissait les chemins de fichiers à une largeur fixe par défaut - il affiche maintenant autant que la fenêtre de votre terminal le permet. Si vous rencontrez ce problème, assurez-vous d'effectuer une mise à jour vers la version 1.8.0 ou une version plus récente.

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