如何找到原始名称已知的重命名文件的新路径?

时间:2012-04-17 13:34:02

标签: git refactoring git-bash

考虑使用以下用例:

我正在我的本地分支上工作,而重构已在主分支上完成。现在,一些文件(类)已重命名和/或移动到新位置。合并时,由于缺少类,我会收到大量的导入错误。

--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命令来获取已应用于特定文件的所有重命名?

2 个答案:

答案 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";
}