web-dev-qa-db-fra.com

Faire que git diff --stat montre le chemin complet du fichier

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

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

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

Je voudrais que git diff indique le chemin d'accès complet de tous les fichiers pour qu'il soit facilement traité par un script. Existe-t-il un moyen pour que git diff affiche toujours le chemin complet?

77
Badri

La commande git diff 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 les scripts, vous voudrez peut-être utiliser git diff-tree directement car il s’agit plutôt d’une commande de "plomberie", bien que je suppose que tout ira bien pour vous. Notez que vous avez besoin du même texte supplémentaire avec --stat lorsque vous utilisez git diff-tree. La différence essentielle entre le git diff "porcelaine" frontal et la commande git diff-tree de plomberie indiquent que git diff recherche dans les paramètres configurés des options telles que diff.renames afin de décider si la détection de changement de nom doit être effectuée. Eh bien, plus le frontal git diff fera l'équivalent de git diff-index si vous comparez un commit avec l’index, par exemple, c’est-à-dire que git diff lit votre config et appelle automatiquement la bonne tuyauterie .)

83
torek

Pour les utilisateurs Bash, vous pouvez utiliser la variable $COLUMNS pour renseigner automatiquement la largeur de terminal disponible:

git diff --stat=$COLUMNS

Les noms de chemins très longs peuvent encore être tronqués; dans ce cas, vous pouvez réduire la largeur de la partie +++/--- 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 cols pour déterminer la largeur du terminal.

12
John Mellor

Pour le traitement de 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

Celles-ci deviennent plus pratiques pour un traitement de script robuste lorsqu'elles sont combinées à l'option -z, qui utilise NUL comme terminateurs de champ.

12
cmbuckley

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 commande tput cols. La valeur par défaut diffère de master, mais vous pouvez éventuellement spécifier une autre branche.

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

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)/{}"
0
Javier Buzzi

Il existe une option --name-only: git diff --name-only. L'option est également supportée par d'autres commandes git telles que show et stash.

Les chemins ne sont pas raccourcis avec l’option.

0
Yevhen Pavliuk