我分叉了一个repo并更改了文件A.现在上游repo中的文件A已移动到子目录.我正在尝试将上游仓库合并到我的前叉.
Git认为文件A在其原始位置被删除,并且在新的子目录中创建了一个新文件(这也可能是因为他们将文件向上游移动的方式).
我希望在新位置对此文件进行修改,尽可能减少影响,提交和提交的历史记录.任何人都可以帮我解决这个问题吗?
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/C
和D
.这意味着道路A
已经消失,但新的道路B/gronk
已经出现.然后Git将记住这些路径(最多重命名限制值),并将内容12345:A
与内容进行比较67890:B/gronk
.如果文件"足够相似",git将声明12345:A
重命名为67890:B/gronk
.
我不确定git是如何确定文件是50%,或75%,或类似/不同的.我已经看到相似性索引是基于"块"而不是线(尽管通常的diff输出是面向行的).