Git合并移动的文件

Sre*_*nis 5 git github

我分叉了一个repo并更改了文件A.现在上游repo中的文件A已移动到子目录.我正在尝试将上游仓库合并到我的前叉.

Git认为文件A在其原始位置被删除,并且在新的子目录中创建了一个新文件(这也可能是因为他们将文件向上游移动的方式).

我希望在新位置对此文件进行修改,尽可能减少影响,提交和提交的历史记录.任何人都可以帮我解决这个问题吗?

tor*_*rek 9

Git总是通过比较有问题的两棵树(或者一棵树和索引,对于不包含git merge自身的情况)来"检测事后"重命名.(Linus Torvalds认为这是一个特征; 例如,请参阅此SO问题.)

在任何情况下,git merge都会运行git的内部差异,启用合并检测,默认的相似性索引为50%,除非你另外配置它​​.1 同样,git diff有一些默认值也是可配置的.如果您git diff --find-renames -M50%在合并库和上游之间手动运行,那么您可能会很好(但请参阅有关配置的脚注1).

如果git 没有检测到重命名,您可能需要调整重命名检测阈值和/或增加git应该考虑的文件数.第一个是选项中的rename-threshold-X(rename-threshold首先出现在git 1.7.4中).有关详细信息,请参阅文档


1您可以merge.renameLimit根据重命名检测设置要考虑的文件数.如果未设置,则当前默认值为1000个文件(但默认值随时间而变化).此外,如果你没有设置它,合并使用diff.renameLimit,所以你可以只设置其中的第二个,并让diff和merge使用这两个值.

文件重命名检测的工作方式有点复杂,但很容易通过示例进行描述.假设Git是比较提交12345与承诺67890,并在12345那里与路径名的文件A,B/C以及D; 但67890也有路径名B/gronk,B/CD.这意味着道路A已经消失,但新的道路B/gronk已经出现.然后Git将记住这些路径(最多重命名限制值),并将内容12345:A与内容进行比较67890:B/gronk.如果文件"足够相似",git将声明12345:A重命名为67890:B/gronk.

我不确定git是如何确定文件是50%,或75%,或类似/不同的.我已经看到相似性索引是基于"块"而不是线(尽管通常的diff输出是面向行的).