web-dev-qa-db-ja.com

git diff --statが完全なファイルパスを表示するようにする

git diff --statを実行すると、一部のファイルはリポジトリベースからのフルパスでリストされますが、一部のファイルは次のようにリストされます。

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

つまり、パスは...で始まり、短いパスのみが表示されます。

スクリプトで簡単に処理できるように、git diffにすべてのファイルの完全なファイルパスを一覧表示したいと思います。常にフルパスを表示するためにgit diffを取得する方法はありますか

90
Badri

Bashユーザーの場合、$COLUMNS変数を使用して、利用可能な端末幅を自動的に埋めることができます。

git diff --stat=$COLUMNS

非常に長いパス名は引き続き切り捨てられる場合があります。この場合、--stat-graph-widthを使用して+++/---パーツの幅を縮小できます。たとえば、これは端末の幅の1/5に制限します。

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

より一般的な解決策として、tput colsの出力を使用して端子幅を決定できます。

15
John Mellor

スクリプト処理の場合、次のいずれかを使用することをお勧めします。

# 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オプションと組み合わせると、堅牢なスクリプト処理に便利になります。

15
cmbuckley

オプションがあります--name-onlygit diff --name-only。このオプションは、showstashなどの他のgitコマンドでもサポートされています。

このオプションではパスは短縮されません。

1
Yevhen Pavliuk

次の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(-)
0
user151841

私が見つけた簡単な解決策はこれを行うことでした:(* 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)/{}"
0
Javier Buzzi