git diff --statに完全なファイルパスを表示させる


104

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

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

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

私は希望git diffそれが簡単にスクリプトで処理されるため、すべてのファイルの完全なファイルパスを一覧表示します。git diff常に完全なパスを表示する方法はありますか

回答:


108

git diffコマンドは、オプションの値をとるために--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>.

(スクリプティングの場合git diff-tree、「配管」コマンドに近いので、直接使用することもできますが、どちらの方法でも問題ないと思います。--statを使用する場合と同じ追加のテキストが必要git diff-treeです。git diff「磁器」を使用することの本質的な違い"フロントエンド、およびgit diff-treeplumbコマンドは、名前の変更の検出を行うかどうかを決定するgit diffオプションなどの構成済み設定を検索しますdiff.renames。まあ、それに加えて、フロントエンドgit diffgit diff-index、コミットとインデックスを比較する場合と同等のことを行いますたとえば、言い換えるgit diff と、設定読み取り、適切な配管を自動的に呼び出します。)


6
git diff --numstatはdiff-treeと同じ
cmcginty 2012

1
最後の部分(+++ / ---)の幅を制限するには、別の--stat-graph-width=...スイッチを使用できることに注意してください。注意も高く設定することを--stat-graph-width=しては--stat-name-width=十分ではありません、あなたも設定しなければならない--stat-width=2をカバーするために十分な大きさを。
jakub.g 2014

@ jakub.g:良い点。gitソースを少し掘り下げた結果、これはgit 1.7.10で導入されました。
torek 14

4
これをグローバル化する方法はありますか?毎回それを入力するのはおかしいです。
Rudie

@Rudie:ああ、いいえ:値diff.statGraphWidthを設定するために使用できる構成変数があります--stat-graph-widthが、その他はデフォルトで端末の幅になります。(したがって、別の答え:「はい、ターミナルウィンドウを1000列幅にしてください」:
torek

22

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

# 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

これら-zNUL、フィールドターミネータとして使用するオプションと組み合わせると、堅牢なスクリプト処理にさらに便利になります。


私のテストによると、これらのコマンドを使用してリソースの完全なパスを受け取ることはできません。今のところ、削除されたファイルの相対パスのみが表示されます。これがこれらのファイルにのみ当てはまるかどうかはわかりません。
GCallie 2017

1
すべての出力はからの相対パスを返しますgit rev-parse --show-toplevel。元の問題は、特に長いファイル名やの値が小さい場合のdiffstatsの問題である、切り詰められたパスに関するものでした--stat-name-width。上記のコマンドはパスを切り詰めませんが、リポジトリルートからの相対パスであるにもかかわらず、要求に応じて「フル」パスを表示します。
cmbuckley 2017

18

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

git diff --stat=$COLUMNS

非常に長いパス名でも切り捨てられる可能性があります。この場合、を使用して+++ / ---パーツの幅を減らすことができます。--stat-graph-widthたとえば、これにより端子の幅の1/5に制限されます。

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

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


2
グローバル化する方法はあります--stat=$COLUMNS,$COLUMNSか?毎回それを入力するのはおかしいです。
Rudie

追加@Rudie export COLUMNSあなたに~/.bashrc、そしてあなたの中~/.gitconfigの下で[alias]、追加smart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841それだけが変わるdiff。マージやプルなどにも使用できます。(手動で行うこともできません。)GITがサポートしていないと思います。
ルディー

@Rudieさて、プルまたはマージが完了したら、以前のハッシュと新しいハッシュを比較できます。
user151841

2
@ user151841もちろんですが、マージすると統計の概要が表示されます。パラメータ/構成なし。すべての「stat summaries」が同じ設定を使用しているとすばらしいでしょう。
ルディー

4

オプションがあります--name-onlygit diff --name-only。オプションは、のような他のgitコマンドによってサポートされていますshowし、stash

オプションを使用してもパスは短くなりません。


0

次の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

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

-1

私はdiff --statの動作がgit 1.7.10の周りのどこかで変更されていることを発見しました。以前はデフォルトでファイルパスが固定幅に短縮されていました。ターミナルウィンドウで可能な限り表示されるようになりました。この問題が発生している場合は、必ず1.8.0以降にアップグレードしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.