web-dev-qa-db-ja.com

gitリポジトリ内のすべてのファイルの最終更新日を取得する方法

私はgitリポジトリ内の単一ファイルの最終更新日を取得する方法を知っています:

git log -1 --format="%ad" -- path/to/file

現在リポジトリに存在するすべてのファイルに対して同じことを行う簡単で効率的な方法はありますか?

70

簡単な答えは、各ファイルを反復処理して、その変更時間を表示することです。つまり、

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

これにより、次のような出力が得られます。

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

明らかに、この時点では単なるbashスクリプトなので、これを制御できます。自由にカスタマイズして、心ゆくまでお楽しみください。

80
Andrew M.

このアプローチは、スペースを含むファイル名でも機能します。

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

出力例:

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

末尾に| sortを追加すると、出力を変更タイムスタンプでソートできます。

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort
24

これは、Andrew M.の答えの小さな微調整です。 (私は彼の答えについてコメントすることができませんでした。)

スペースを含むファイル名をサポートするために、最初の$ filenameを二重引用符で囲みます

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

出力例:

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

Andrewのソリューション(ls-treeに基づく)がベアリポジトリで機能することを感謝します! (これはls-filesを使用するソリューションには当てはまりません。)

6
Kevin G.

WindowsとPowerShellを使用している私たちにとって、Andrew Mの答えは、コンピューターで読み取り可能なTweakです。

git ls-tree -r --name-only HEAD | ForEach-Object { "$(git log -1 --format="%ai" -- "$_")`t$_" }

出力例:

2019-05-07 12:00:37 -0500   .editorconfig
2016-07-13 14:03:49 -0500   .gitattributes
2019-05-07 12:00:37 -0500   .gitignore
2018-02-03 22:01:17 -0600   .mailmap
1
James Skemp

魚を使う人のために、Andrew Mの回答の魚のシェルバージョンを以下に示します。

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

簡単にアクセスできるように、これを魚の機能として保存します。

1
Kevin Cherepski