Faire de git diff --stat afficher le chemin complet du fichier

104

En faisant, git diff --statcertains fichiers sont répertoriés avec le chemin complet de la base du référentiel, mais certains fichiers sont répertoriés comme suit:

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

C'est le chemin qui commence par ...et seul le chemin court est affiché.

Je voudrais git difflister le chemin complet du fichier pour tous les fichiers pour qu'il soit facilement traité par un script. Y a-t-il un moyen pour que je puisse git difftoujours montrer le chemin complet

Badri
la source

Réponses:

109

La git diffcommande prend des valeurs facultatives pour --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Pour le script, vous voudrez peut-être utiliser git diff-treedirectement car il s'agit plus d'une commande de "plomberie", même si je pense que tout ira bien dans les deux cas. Notez que vous avez besoin du même texte supplémentaire --statlors de l'utilisation git diff-tree. La différence essentielle entre l'utilisation de la git diff"porcelaine" "front-end, et la git diff-treecommande de plomberie, est qui git diffrecherche vos paramètres configurés pour des options telles que diff.renamesdécider de faire ou non la détection de changement de nom. Eh bien, plus le front-end git difffera l'équivalent de git diff-indexsi vous comparez un commit avec l'index , par exemple. En d'autres termes, git diff lit votre configuration et invoque automatiquement la bonne plomberie .)

Torek
la source
6
git diff --numstat est le même que diff-tree
cmcginty
1
Notez que pour limiter la largeur de la dernière partie (+++ / ---), vous pouvez utiliser un --stat-graph-width=...commutateur séparé . Notez également que le réglage haut --stat-graph-width=et --stat-name-width=ne suffit pas, vous devez également régler --stat-width=suffisamment grand pour couvrir les deux.
jakub.g
@ jakub.g: bon point. Basé sur un peu de fouille dans la source git, cela est entré avec git 1.7.10.
torek
4
Y a-t-il un moyen de mondialiser cela? Taper à chaque fois est fou.
Rudie
@Rudie: hélas, non: il y a une variable de configuration que diff.statGraphWidthvous pouvez utiliser pour définir la --stat-graph-widthvaleur, mais les autres par défaut sont la largeur de votre terminal. (Donc, réponse alternative: "oui, faites simplement votre fenêtre de terminal de 1000 colonnes de large" :-))
torek
22

Pour le traitement des scripts, il peut être préférable d'utiliser l'un des éléments suivants:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Celles-ci deviennent plus pratiques pour un traitement de script robuste lorsqu'elles sont combinées avec l' -zoption, qui utilise NULcomme terminateurs de champ.

cmbuckley
la source
Selon mes tests, vous ne recevez pas le chemin complet de la ressource en utilisant ces commandes. Pour l'instant, je ne vois que les chemins relatifs pour les fichiers supprimés. Je ne sais pas si ce n'est le cas que pour ces fichiers.
GCallie
1
Tous les outpu renverront des chemins relatifs à git rev-parse --show-toplevel. Le problème d'origine faisait référence aux chemins tronqués, ce qui est un problème dans les diffstats, en particulier pour les noms de fichiers longs ou une valeur faible pour --stat-name-width. Les commandes ci-dessus ne tronqueront pas les chemins, mais afficheront le chemin "complet" comme demandé, bien que toujours relatif à la racine du référentiel.
cmbuckley
18

Pour les utilisateurs de Bash, vous pouvez utiliser la $COLUMNSvariable pour remplir automatiquement la largeur de borne disponible:

git diff --stat=$COLUMNS

Les noms de chemin très longs peuvent encore être tronqués; dans ce cas, vous pouvez réduire la largeur de la pièce +++ / --- en utilisant --stat-graph-width, par exemple cela la limite à 1/5 de la largeur du terminal:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Pour une solution plus générique, vous pouvez utiliser la sortie de tput colspour déterminer la largeur du terminal.

John Mellor
la source
2
Existe-t-il un moyen de mondialiser --stat=$COLUMNS,$COLUMNS? Taper à chaque fois est fou.
Rudie
@Rudie ajouter export COLUMNSà votre ~/.bashrc, et dans votre ~/.gitconfigsous [alias], ajoutersmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 Cela change seulement diff. Je veux que cela fonctionne pour les fusions et les tirages, etc. (Je ne peux même pas le faire manuellement.) Je ne pense pas que GIT le supporte.
Rudie
@Rudie Eh bien, une fois l'extraction ou la fusion terminée, vous pouvez faire la différence entre le hachage précédent et le nouveau.
user151841
2
@ user151841 Bien sûr, mais la fusion donne déjà un résumé des statistiques. Sans paramètres / config. Ce serait génial si tous les «résumés de statistiques» utilisaient la même configuration.
Rudie
4

Il y a une option --name-only: git diff --name-only. L'option est également prise en charge par d'autres commandes git comme showet stash.

Les chemins ne sont pas raccourcis avec l'option.

Yevhen Pavliuk
la source
0

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 la tput colscommande. Il diffère par défaut master, mais vous pouvez éventuellement spécifier une autre branche.

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

Une solution simple que j'ai trouvée était de faire ceci: (ne fonctionne que sur * nix, désolé pas d'osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Cette version fonctionne pour les deux, mais elle n'a pas fière allure sur osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Javier Buzzi
la source
-1

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

Alex Spurling
la source