我在一个代码库迷宫中迷失了方向,里面有一堆文件因为不太好的rebase而被重新添加,而它们的旧版本已被重命名。
无论如何,我想列出所有曾经被重命名的文件,也就是列出所有提交中的已重命名文件。
我在一个代码库迷宫中迷失了方向,里面有一堆文件因为不太好的rebase而被重新添加,而它们的旧版本已被重命名。
无论如何,我想列出所有曾经被重命名的文件,也就是列出所有提交中的已重命名文件。
--summary
was clipping the file names for me. I used this command instead:
git whatchanged -M5 <commit-hash>..HEAD | grep R100
- derpedy-doogit 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_b
被添加并且它们的相似度足够高(默认是50%),则认为file_a
和file_b
在两个修订版本之间被“重命名”。请注意,这意味着查找重命名需要更多的计算。
这也意味着,经常只有遍历整个修订版本范围才能检测到重命名。除非在该范围内重命名基本上是唯一的更改,例如在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:
只显示旧名称 <tab>
新名称,不包括正常的 git-log
主题等。-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$
你可以看到,在 Git 版本 2.38.0
和 2.39.0
之间,有几个文件被移动到了 oss-fuzz/
目录中。
git log --follow
来自这个问题 - johnMagit reflog
(或分支,或其他什么)并从那里重新提交你的提交,以便你不会陷入这种境地? - James