git diff --stat
を実行すると、一部のファイルはリポジトリベースからのフルパスでリストされますが、一部のファイルは次のようにリストされます。
.../short/path/to/filename.
つまり、パスは...
で始まり、短いパスのみが表示されます。
スクリプトで簡単に処理できるように、git diff
にすべてのファイルの完全なファイルパスを一覧表示したいと思います。常にフルパスを表示するためにgit diff
を取得する方法はありますか
Bashユーザーの場合、$COLUMNS
変数を使用して、利用可能な端末幅を自動的に埋めることができます。
git diff --stat=$COLUMNS
非常に長いパス名は引き続き切り捨てられる場合があります。この場合、--stat-graph-width
を使用して+++/---パーツの幅を縮小できます。たとえば、これは端末の幅の1/5に制限します。
git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))
より一般的な解決策として、tput cols
の出力を使用して端子幅を決定できます。
スクリプト処理の場合、次のいずれかを使用することをお勧めします。
# 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
これらはそれぞれ、フィールドターミネータとしてNUL
を使用する-z
オプションと組み合わせると、堅牢なスクリプト処理に便利になります。
オプションがあります--name-only
:git diff --name-only
。このオプションは、show
やstash
などの他のgitコマンドでもサポートされています。
このオプションではパスは短縮されません。
次のgitエイリアスを作成しました。
diffstat = ! "gitdiffstat() { git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"
tput cols
コマンドから列カウントを読み取ります。デフォルトではmaster
に対して差分しますが、オプションで別のブランチを指定できます。
$ git diffstat
.gitalias | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
私が見つけた簡単な解決策はこれを行うことでした:(* nixでのみ動作します、申し訳ありませんがosxはありません)
git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"
このバージョンは両方で機能しますが、osxでは見栄えがよくありません。
git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"