考虑使用以下用例:
我正在我的本地分支上工作,而重构已在主分支上完成。现在,一些文件(类)已重命名和/或移动到新位置。合并时,由于缺少类,我会收到大量的导入错误。
--A--B--C--D--E-- (master)
\ \
F--G--H--I--J (topic)
在A
中,F--G--H--I
中使用了旧名称。
在B--C--D--E
中,文件被重构,导致E
中的新文件名。这包括链式重命名,如
B: path/to/File.java
-> C: path/to/BetterName.java
-> D: better/package/BetterName.java
-> E: final/package/FinalName.java
由于我的分支上缺少重构,现在将J
中的结果与许多(编译)错误合并。 (因为我仍然引用path.to.File
而不是final.package.FinalName
为了修复破坏的构建,我需要知道旧类的新名称。
是否有git命令来获取已应用于特定文件的所有重命名?
答案 0 :(得分:0)
Git应该找到文件的重命名。但是,如果该文件在该文件中有50%或更多行更改,则不再将其视为重命名。如果您愿意,可以更改此阈值。
这是执行此操作的命令:
git log -M --diff-filter=R --stat
它只会显示重命名。如果您想将阈值更改为默认值50%以外的其他值,您只需将数字添加到M选项:
git log -M90 --diff-filter=R --stat
如果内容更改不超过10%,只会将文件视为重命名
<强>更新强>
要跳过所有中间步骤,请改用diff。 Git会为你重命名:
git diff -M --diff-filter=R --name-status ..master | cut -f2-
当你在主题分支上时。
然后你可以通过管道来制作一堆sed指令来调整你的引用。
答案 1 :(得分:-1)
我在网上找不到令人满意的答案,所以我写了一个(笨拙的)脚本来逐个浏览日志(通过重命名重命名)
使用上面的示例脚本提供了以下输出:
$ git history path/to/File.java
<强>
final/package/FinalName.java
强>
我将脚本添加到~.bashrc
并在我的全局git配置中添加了alias.history=!bash -ic 'git_file_history "$@"' -
选项
#! /bin/sh
### Takes a filename as parameter ($1)
### Echoes all filenames related to $1
function git_file_history() {
loc_var=$1;
old=""
while [ "$loc_var" != "$old" ] && [ "$loc_var" != "" ]
do
old=$loc_var;
#echo $loc_var;
hashes=$(git log --format="%P %H" -1 --follow -- $loc_var);
status=$(git diff --name-status --find-renames $hashes | grep $loc_var);
awks=`echo $status | awk '{print $3}'`
loc_var=$awks;
done
echo "$loc_var";
}