Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git在我们的Java项目中检测到重命名/移动很差-怎么办?_Java_Git_History_Rename - Fatal编程技术网

git在我们的Java项目中检测到重命名/移动很差-怎么办?

git在我们的Java项目中检测到重命名/移动很差-怎么办?,java,git,history,rename,Java,Git,History,Rename,我读过很多关于git如何巧妙地检测文件何时被重命名或移动的文章,你不应该(或不能)做任何事情来帮助它完成这类任务。不幸的是,我们的项目中有很多问题,在移动文件后,git历史记录将由一行组成。下面是我最近看到的一个例子中的一个模式: 原始类别: package a.b.c.d.e.f.X; [four imports] public interface A extends B { void f(String id, int index) throws MyException; @An

我读过很多关于git如何巧妙地检测文件何时被重命名或移动的文章,你不应该(或不能)做任何事情来帮助它完成这类任务。不幸的是,我们的项目中有很多问题,在移动文件后,git历史记录将由一行组成。下面是我最近看到的一个例子中的一个模式:

原始类别:

package a.b.c.d.e.f.X;

[four imports]

public interface A extends B {
  void f(String id, int index) throws MyException;

  @Annotation
  class AImpl extends C implements A {
    @OtherAnnotation
    public void f(String id, int index)
      throws MyException {
        Map<String, Object> inputs = new HashMap<String, Object>();
        inputs.put("a", id);
        inputs.put("b", index);
        execute(inputs);
    }

    @Override
    public String g() {
      return "xxxx.yyyy";
    }
  }
}
a.b.c.d.e.f.X包;
[四项进口]
公共接口A扩展了B{
void f(字符串id,int索引)抛出MyException;
@注释
类AImpl扩展了C,实现了{
@其他注释
公共void f(字符串id,整数索引)
抛出我的异常{
映射输入=新的HashMap();
输入。输入(“a”,id);
投入。投入(“b”,指数);
执行(输入);
}
@凌驾
公共字符串g(){
返回“xxxx.yyyy”;
}
}
}
移动后的类:

package a.b.c.d.e.f.Y;

[six imports, two new compared to original]

public interface A extends B {
  void f(MyIdObject idobject, int index) throws MyException;

  @Annotation
  class AImpl extends D implements A {
    @OtherAnnotation
    public void f(@ParameterAnnotation([some stuff]) MyIdObject idobject, int index) throws MyException {
        Map<String, Object> inputs = new HashMap<>();
        inputs.put("c", idobject.getId());
        inputs.put("b", index);
        execute(inputs);
    }

    @Override
    public String g() {
      return "yyyy";
    }
  }
}
a.b.c.d.e.f.Y包;
[进口6件,与原装相比新增2件]
公共接口A扩展了B{
void f(MyIdObject-idobject,int-index)抛出MyException;
@注释
类AImpl扩展了D,实现了{
@其他注释
public void f(@parameternotation([some stuff])MyIdObject idobject,int index)抛出MyException{
映射输入=新的HashMap();
inputs.put(“c”,idobject.getId());
投入。投入(“b”,指数);
执行(输入);
}
@凌驾
公共字符串g(){
返回“yyy”;
}
}
}
总结:类文件被移动到另一个目录/包(不同于一个级别-请参见包名称),添加了导入,在此处声明和实现的方法中更改了参数,在方法头中删除了换行符,在方法内部更改了字符串,HashMap实例化更改为使用菱形表示法,g()中的返回值更改

大多数标识符和字符串都已更改以保护无辜者-它们通常是10-20个字符。我还没有编译这篇文章,所以如果有任何错误,我很抱歉-我希望你能理解

由于这是某些框架重构的一部分,因此在同一个提交中,有一组类按照此模式进行了更改,它们因字符串内容、放入hashmap的字符串数量和“f”方法名称而有所不同

所以我想我可以看到git在这里遇到了什么困难——尽管这个特殊的重命名本身是显而易见的,但当它与具有类似内容的文件的其他重命名混合在一起时,git无法确定哪个是哪个?文件名(未更改)是否应该足够提示

我的印象是,既然git应该完美地处理这个问题,那么就没有办法让git更好地处理这个问题了?当我们进行重构以使其更好地工作时,我们是否可以做些什么?我们现在能做些什么吗

特别是:我希望能够在每次提交中看到文件的差异,包括完成重命名的文件。我习惯于在IntelliJ中加载git历史记录,他双击一个提交,这将显示在该提交中所做的更改。我明白了,在IntelliJ中可能不可能得到我想要的东西,但是对于一个历史被这样中断的文件,我该如何在命令行或其他地方做到这一点呢

我们可能不想做的事情:1)每次重命名提交一次,2)一次重命名提交+另一次内容更改提交


如果您对Java设计感兴趣,请给我发一封PM-让我们保留关于git的帖子。:)

尝试使用这些附加的
git日志--按照以下步骤操作:

-M[]

--查找重命名[=]

如果生成差异,则检测并报告每次提交的重命名。有关遍历历史记录时重命名的以下文件,请参见--follow。如果指定了n,则它是相似性索引的阈值(即与文件大小相比的添加/删除量)。例如,-M90%意味着Git应该考虑删除/添加对是重命名的,如果超过90%的文件没有改变。如果没有%符号,数字将作为分数读取,前面有一个小数点。即,-M5变为0.5,因此与-M50%相同。类似地,-M05与-M5%相同。要将检测限制为精确重命名,请使用-M100%

-C[]

--查找副本[=]

检测副本以及重命名。另请参见--更难找到副本。如果指定了n,则其含义与-M相同

--更难找到副本

出于性能原因,默认情况下,-C选项仅在副本的原始文件在同一变更集中修改时才查找副本。此标志使命令检查未修改的文件作为副本源的候选文件。对于大型项目来说,这是一项非常昂贵的操作,因此请谨慎使用。提供多个-C选项具有相同的效果


如果我可以问的话,为什么你需要跟踪重命名/删除“这么多”?我想能够用IntelliJ调出文件的历史记录,看看发生了什么,例如一年前/5年前。嗯,我明白了。。。我也使用IDEA,但它没有与git log相同的功能--很遗憾,请遵循
。编辑:很抱歉,我没有看到您在这里谈论差异。@TV'sFrank,您似乎编辑了您的评论(我的收件箱显示了不同的文本),因此很难理解您在建议的方法中遇到的困难。是的,对不起,我先编辑,然后发现我在说废话,所以我又编辑了一次。我看不出你的方法有什么问题——我还没有彻底检查过