维基百科解释了自动重命名检测:
简而言之,给定修订版N中的文件,修订版N-1中的同名文件是其默认祖先.但是,当修订版N-1中没有同名文件时,Git会搜索仅存在于修订版N-1中的文件,并且与新文件非常相似.
重命名检测显然归结为类似的文件检测.这个算法记录在哪里吗?很高兴知道自动检测到哪种变换.
精简版:
如果没有仔细研究
git源代码,我在哪里可以找到git用于将内容块与特定跟踪路径名相关联的启发式的完整描述?
详细版本:
在下面的(Unix)shell演示交互中,两个文件a和b" git-commit已经"被修改,以便(有效地)将大部分a内容传输到b最后,最后两个文件再次被提交.
要寻找的关键是第二个的输出git commit以线结束
rename a => b (99%)
Run Code Online (Sandbox Code Playgroud)
即使没有重命名文件(通常意义上)(!?!).
在演示演示之前,这个简短的描述可能会让您更容易理解.
该文件的内容a和b通过组合这三个辅助文件,内容产生../A,../B和../C.象征性地,状态a和b可以表示为
../A + ../C -> a
../B -> b
Run Code Online (Sandbox Code Playgroud)
就在第一次提交之前,和
../A -> a
../B + ../C -> b
Run Code Online (Sandbox Code Playgroud)
就在第二个之前.
好的,这是演示.
首先,我们展示的辅助文件的内容../A,../B以及../C:
head ../A ../B ../C
# ==> ../A <==
# ... …Run Code Online (Sandbox Code Playgroud) git diff --no-index --no-prefix --summary -U4000 目录1 目录2
这按预期工作,因为它返回两个目录之间所有文件的差异。添加的文件按预期输出,删除的文件也会产生预期的 diff 输出。
但是,由于 diff 将文件路径考虑为文件名的一部分,因此两个不同目录中具有相同名称的文件会导致 diff 输出带有重命名标志,而不是更改。
有没有办法告诉 git 不考虑 diff 中的完整文件路径,而只查看文件名,就好像文件来自同一目录一样?
有没有办法让 git 真正知道不同目录中同一文件的副本是否确实被重命名?我不明白如何,除非它有一种以某种方式比较文件 md5 的方法(可能是一个错误的猜测,哈哈)。
使用分支而不是目录可以轻松解决此问题吗?如果可以,上面列出的命令的分支版本是什么?