[英]How to find all renames in all commits on git?
我迷失在一個 repo 迷宮中,其中有一堆文件被重新添加,而舊版本由於制作的 rebase 不太好而被重命名。
無論如何,我想列出所有在某個時候被重命名的文件,即列出所有提交中的所有重命名文件。
這樣就夠了嗎?
git whatchanged -M5 --summary | grep rename | grep '=>'
這是一個修改后的版本,它將重命名和刪除文件:
git whatchanged -M5 --summary | grep -E 'rename.*=>|delete mode'
這將為您提供當前分支的HEAD的所有重命名,並且它的祖先包括合並的父級直到第一次提交。 -M5將具有相似的文件50%或更多報告為重命名; 這可能是低百分比,但你可以改變它(5讀為.5,或50%所以你可以將它改為M8 80%)。 請注意,如果有很多提交,則需要很長時間。
我建議你限制提交的范圍,例如:
git whatchanged -M5 --summary <commit-id>..HEAD | grep rename | grep '=>'
據我所知,你需要從提交開始,我不知道如何在一次所有分支和標簽中獲得一個全面的重命名文件列表。 如果您要檢查分支分支,或在單個倉庫中使用獨立提交歷史記錄分支,則需要在每個分支上運行建議的命令。
您應該能夠使用--diff-filter選項從日志中獲取該信息。 重命名文件的過濾器是R ,刪除文件的過濾器是D 。
重命名文件:
git log --summary --pretty='format:' --diff-filter=R
刪除的文件:
git log --summary --pretty='format:' --diff-filter=D
重命名+刪除的文件:
git log --summary --pretty='format:' --diff-filter=RD
重要的是要注意 git 中的重命名工作是特殊的。
由於 git 工作方式的基本性質,重命名不會記錄到版本控制系統中。 它們是事后重建的,就像 diff hunks 一樣,通過比較修訂之間文件的二進制內容。
這意味着如果file_a
被刪除, file_a
和file_b
被認為在兩個修訂之間“重命名”,添加file_a
並且它們足夠“相似”。 (我相信默認值為 50%)。 請注意,這意味着查找重命名需要更多的計算。
這也意味着重命名通常只能通過遍歷整個修訂范圍來檢測。 除非,重命名基本上是范圍內的唯一變化,比如HEAD
和HEAD~100
,在這種情況下也可以使用git diff --name-status --diff-filter=R
檢測到。
你不能為此使用git-rev-list
,你需要使用git-log
。
git log --name-status -M90%\
--diff-filter=R --pretty=format: |
sed\
-e '/^$/{N;s@^\n$@@}'\
-e 's@\(^\n\{0,1\}\)R[0-9]\{3\}\t@\1@'
--name-status
, --pretty=format:
只顯示常規git-log
的舊名稱<tab>
新名稱,無主題等。-M90%
,相似如何算作差異-M100%
相同(僅重命名)。--diff-filter=R
,只顯示重命名sed
按摩輸出
-e '/^$/{N;s@^\n$@@}'
從沒有重命名的提交中剝離輸出 (2x+ \n
)-e 's@\(^\n\{0,1\}\)R[0-9]\{3\}\t@\1@'
,將輸出按摩到old_name <tab>
new_name在 Git 項目存儲庫中運行。
$ git log --name-status -M100%\
--diff-filter=R --pretty=format: \
v2.38.0..v2.39.0 |
sed\
-e '/^$/{N;s@^\n$@@}'\
-e 's@\(^\n\{0,1\}\)R[0-9]\{3\}\t@\1@' |
cat -A
fuzz-commit-graph.c^Ioss-fuzz/fuzz-commit-graph.c$
fuzz-pack-headers.c^Ioss-fuzz/fuzz-pack-headers.c$
fuzz-pack-idx.c^Ioss-fuzz/fuzz-pack-idx.c$
你可以看到幾個文件被移動到oss-fuzz/
目錄,在 git 版本2.38.0
和2.39.0
之間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.