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

137voto

torek Points 25463

Par défaut git diff tronque sa sortie pour la faire tenir dans un terminal à 80 colonnes.

Vous pouvez passer outre en spécifiant des valeurs à l'aide de l'option --stat option :

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

Par exemple, en fixant la valeur de sortie à un très grand nombre :

git diff --stat=10000

Notez que cela produit le chemin relatif à la racine du dépôt git.

(Pour les scripts, vous pouvez utiliser git diff-tree directement puisqu'il s'agit plutôt d'une commande de "plomberie", bien que je pense que vous vous en sortirez bien dans les deux cas. Notez que vous avez besoin du même texte supplémentaire avec --stat lors de l'utilisation de git diff-tree . La différence essentielle entre l'utilisation du git diff l'avant en "porcelaine", et le git diff-tree commande de plomberie, c'est que git diff recherche vos paramètres configurés pour des options comme diff.renames pour décider s'il faut faire une détection de renommage. Eh bien, ça, plus la partie frontale git diff fera l'équivalent de git diff-index si vous comparez un commit avec l'index, par exemple. En d'autres termes, git diff lit votre configuration et invoque automatiquement la bonne plomberie .)

9 votes

Git diff --numstat est identique à diff-tree

1 votes

Notez que pour limiter la largeur de la dernière partie (+++/---) vous pouvez utiliser un fichier séparé --stat-graph-width=... interrupteur. Notez également que le fait de régler les --stat-graph-width= y --stat-name-width= n'est pas suffisant, vous devez également définir --stat-width= assez grand pour couvrir les deux.

0 votes

@jakub.g : bon point. En creusant un peu dans les sources de git, je me suis rendu compte qu'il a été mis en place avec git 1.7.10.

31voto

cbuckley Points 10401

Pour le traitement des script, 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

Chacune d'entre elles devient plus pratique pour un traitement robuste des script lorsqu'elle est combinée avec la fonction -z qui utilise l'option NUL comme terminateurs de champ.

0 votes

D'après mes tests, vous ne recevez pas le chemin complet de la ressource en utilisant ces commandes. Pour l'instant, je ne vois que des chemins relatifs pour les fichiers supprimés. Je ne sais pas si c'est seulement le cas pour ces fichiers.

1 votes

Tous les outpu retourneront des chemins relatifs à git rev-parse --show-toplevel . Le problème original se référait aux chemins tronqués, ce qui est un problème dans diffstats, particulièrement pour les longs noms de fichiers ou une faible valeur de --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 dépôt.

19voto

John Points 2117

Pour les utilisateurs de Bash, vous pouvez utiliser l'option $COLUMNS pour remplir automatiquement la largeur disponible du terminal :

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 partie +++/--- à l'aide de la commande --stat-graph-width par exemple, cela la limite à 1/5 de la largeur de la borne :

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

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

2 votes

Existe-t-il un moyen de mondialiser --stat=$COLUMNS,$COLUMNS ? C'est fou de devoir le taper à chaque fois.

0 votes

@Rudie add export COLUMNS à votre ~/.bashrc et dans votre ~/.gitconfig sous [alias] , ajouter smart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"

0 votes

@user151841 Cela ne change que diff . Je veux que cela fonctionne aussi pour les fusions et les extractions, etc. (Je ne peux même pas le faire manuellement ici.) Je ne pense pas que GIT le supporte.

8voto

yevhen Points 316

Il y a une option --name-only : git diff --name-only . Cette option est également supportée par d'autres commandes git comme show et stash .

Les chemins ne sont pas raccourcis avec cette option.

0 votes

Il y a également une option correspondante pour git diff-tree mais il y a d'autres options que vous devez spécifier comme git diff-tree --name-only -r --no-commit-id HEAD . Voir ma réponse stackoverflow.com/a/67330880/1507124 pour plus d'informations

3voto

Javier Buzzi Points 2107

Une solution simple que j'ai trouvée est de faire ceci : (ne fonctionne que sur *nix, désolé pas 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'est pas très belle sur osx.

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

1 votes

J'ai trouvé que juste en utilisant --relative m'a énormément aidé. (J'utilise déjà le --stat options de largeur.

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