gitリポジトリ内の単一ファイルの最終変更日を取得する方法を知っています。
git log -1 --format="%ad" -- path/to/file
現在リポジトリに存在するすべてのファイルに対して同じことを行う簡単で効率的な方法はありますか?
gitリポジトリ内の単一ファイルの最終変更日を取得する方法を知っています。
git log -1 --format="%ad" -- path/to/file
現在リポジトリに存在するすべてのファイルに対して同じことを行う簡単で効率的な方法はありますか?
回答:
簡単な答えは、各ファイルを反復処理し、その変更時間を表示することです。すなわち、
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スクリプトなので、これを制御できます。したがって、心のコンテンツに合わせて自由にカスタマイズしてください。
git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
このアプローチは、スペースを含むファイル名でも機能します。
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
これは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ファイルを使用するソリューションには当てはまりません。)
これは、魚を使用する人のための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
簡単にアクセスできるように、これをフィッシュ関数として保存します。
WindowsとPowerShellを使用している私たちにとって、Andrew Mの答えは、コンピューターが読み取り可能な微調整を加えたものです。
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