回答:
特定のSHAと現在のコミットの間で変更されたファイルの場合:
git diff --name-only <starting SHA> HEAD
または、変更されたがまだコミットされていないファイルを含める場合:
git diff --name-only <starting SHA>
より一般的には、次の構文は、2つのコミット(SHAまたは他の名前で指定)の間に変更されたファイルを常に通知します。
git diff --name-only <commit1> <commit2>
git diff --name-only <SHA> <SHA>^
--name-status
代わりにフラグを使用--name-only
すると、ファイルのリストを取得して、AddedやModifiedなどの変更ステータスを確認できます。
--name-status
彼らに何が起こったのかを示して
ステージングされていない追跡された変更済みファイルをすべてリストするには:
git diff --name-only
すべてのステージングされた追跡変更ファイルをリストするには:
git diff --name-only --staged
ステージングされたおよびステージングされていないすべての追跡された変更済みファイルをリストするには:
{ git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
追跡されgit status
ていないすべてのファイル(によって一覧表示されているファイルなので、無視されたファイルは含まない)を一覧表示するには:
git ls-files --other --exclude-standard
これをシェルスクリプトで使用していて、これらのコマンドが何かを返したかどうかをプログラムで確認したい場合は、git diff
の--exit-code
オプションが役立ちます。
多くのファイルを追加/変更/削除したとき(最後のコミット以降)、それらの変更を時系列で確認したいと思います。
そのために私は使用します:
ステージングされていないすべてのファイルを一覧表示するには:
git ls-files --other --modified --exclude-standard
各ファイルの最終更新日を取得するには:
while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done
xargs -0 stat -c '%y %n' --
古いものから新しいものに並べ替えるには:
sort
エイリアスを使用すると、使いやすくなります。
alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done|sort'
または(ruvimのおかげで短くて効率的)
alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'
例えば:
username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd
これで、変更内容を古いものから最近のものまで確認できます。
xargs
シングルコールを使わないのstat
ですか?完全なワンライナー:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
2つのコミット(追加または変更のみ)の間に内容が変更されたファイルのリストが必要なため、以下を使用しました。
git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>
git diffのドキュメントにあるさまざまなdiff-filterオプション:
diff-filter = [(A | C | D | M | R | T | U | X | B)…[*]]
追加された(A)、コピーされた(C)、削除された(D)、変更された(M)、名前が変更された(R)ファイルのタイプ(つまり、通常のファイル、シンボリックリンク、サブモジュールなど)が変更された(T)、統合されていない(U)、不明(X)、またはペアリングが解除されている(B)。フィルター文字の任意の組み合わせ(なしを含む)を使用できます。*(All-or-none)を組み合わせに追加すると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。
また、これらの大文字を除外して除外することもできます。例--diff-filter = adは、追加および削除されたパスを除外します。
ステータスもリストしたい場合(例:A / M)、に変更--name-only
し--name-status
ます。
ステージングされていない変更済みのリストはgit status
、grep
次のようなコマンドを使用して取得できます。のようなものgit status -s | grep M
:
root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
M src/.../file1.js
M src/.../file2.js
M src/.../file3.js
....