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?
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 .)
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.
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.
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(-)
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)/{}"
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.