在 git 存储库中找到最大提交(即引入最多更改的提交,例如计算为添加/删除行数)的方法是什么?
请注意,我真的想要最大的提交,而不是最大的文件,所以git find fat commit在这里没有帮助。
您可以使用
git log --format=format:"%H" --shortstat
。
它会输出类似的内容
b90c0895b90eb3a6d1528465f3b5d96a575dbda2
2 files changed, 32 insertions(+), 7 deletions(-)
642b5e1910e1c2134c278b97752dd73b601e8ddb
11 files changed, 835 insertions(+), 504 deletions(-)
// other commits skipped
看起来像是一个容易解析的文本。
对于任何想要获得最大到最小提交的简单列表(按提交中所做的更改量)的人,我采用了 @max 的答案并对结果进行了解析和排序。
git log --format=format:"%H" --shortstat | perl -00 -ne 'my ($hash, $filesChanged, $insertions, $deletions) = $_ =~ /(?:[0-9a-f]+\n)*([0-9a-f]+)\n(?: (\d+) files? changed,)?(?: (\d+) insertions?...,?)?(?: (\d+) deletions?...)?/sg; print $hash, "\t", $insertions + $deletions, "\n"' | sort -k 2 -nr
这需要所有提交,将每个提交的插入和删除数量加在一起,然后按从最高到最低的顺序对列表进行排序。要仅获取前十个最大的提交,请将
| head -10
添加到末尾。
我的解决方案:
shell脚本:
git log --after="2024-10-01" --pretty=format:"%H - %ad :" --date=format:"%a %b %d %T %Y %z" | while read line
do
commit_hash=$(echo $line | cut -d' ' -f1)
commit_date=$(echo $line | cut -d' ' -f3-)
commit_size=$(git show --format=format: --stat $commit_hash | tail -1 | awk '{print $4}')
echo "$commit_date $commit_size $commit_hash"
done | sort -nr --field-separator=' ' --key=8 | head -20
输出:
四 10 10 09:13:18 2024 +0800 : 28530 dd70787ad5121c0884e1884fa4fdfe4c1b044267
四 11 14 07:14:42 2024 +0800 : 5422 d6adca7d57a04e23e3076181b5a56d370b8fb92b
四 11 14 07:57:02 2024 +0800 : 5327 5cdf72dcb933b5da4e379e31f3a103352446d771
三 10 02 10:36:50 2024 +0800 : 370 af1ca597b18eb1d80d75401819afefaf74ecb9ef