如何防止git认为我做了重命名


77

我有两个文件index.htmltemplate.html。我大部分时间都index.html移入了template.html,现在git认为我在添加两个文件时都进行了重命名。在特定情况下是否可以防止这种情况发生?


25
Git实际上并没有存储它认为您进行了重命名的事实。实际的对象数据库仅存储项目的完整快照,没有diff / rename / move的概念。Git说您已重命名文件的事实来自数据库的后期分析。
2013年

5
@JacobGroundwater哦,我知道了,所以没关系。谢谢。:)
Kit Sunde

Answers:


22

有一个“可接受的”答案,但是它没有给出如何回答该问题的任何提示。

来自git-log(1)和git-diff(1)的正确答案是:

   --no-renames
       Turn off rename detection, even when the configuration
       file gives the default to do so.

4
虽然这在某些用例中可行,但最初的原始问题是“在特定情况下是否可以防止这种[重命名检测]?” 在〜/ .gitconfig中使用的标志会在所有位置将其关闭,在命令行中则用于整个当前运行。即使相似性指数> = 99%的项目也不会被视为重命名,这通常不是人们期望的,并且可能违反最小惊讶原则。但是,该标志肯定有用例,否则将不存在。感谢您在这里指出!
托德·雅各布斯

62

为什么Git认为您的文件是副本

Git跟踪内容,而不是文件名。因此,如果两个文件的内容基本相似,则git会认为您已复制或重命名了该文件。如果阅读git-log(1),您将学到:

相似性指标是未更改的行的百分比,而相似性指标是已更改的行的百分比。它是一个四舍五入的整数,后跟一个百分号。因此,相似性索引值100%保留给两个相等的文件,而相似性100%意味着没有旧文件中的任何行进入新文件。

因此,假设您的相似性索引为100%,git会认为这是副本。最好的选择是添加一条有意义的日志消息或注释(有关更多信息,请参见git-notes(1))以解释如果您认为git做的不正确,会发生什么情况。

调整相似度指数

您也可以尝试调整git用于考虑将其复制或重命名的值。git-log(1)的手册说:

-M[<n>], --find-renames[=<n>]

If generating diffs, detect and report renames for each commit. For
following files across renames while traversing history, see --follow. If
n is specified, it is a threshold on the similarity index (i.e. amount
of addition/deletions compared to the file’s size). For example, -M90%
means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.

-C[<n>], --find-copies[=<n>]    

Detect copies as well as renames. See also --find-copies-harder.
If n is specified, it has the same meaning as for -M<n>.

同样,这不会帮助你,如果这些文件大多是相似的,但你当然可以使用这些值来调整如何,他们需要类似是为了被认为是副本或重命名。你的旅费可能会改变。


5
想指出的是,这个答案比其他问题的答案更有帮助和更具描述性
Kyle Kochis 2015年

1
提交之前的这两个阶段的过程将起作用:git reset歧义文件,git commit,git add歧义文件,git commit。
罗勒·穆萨

21

如果您刚好在提交之前,并且“您对git生气感到难过”,那么只需撤消添加以您重命名的歧义文件git的方式执行提交,然后再次添加歧义文件并提交:

git reset ambiguous_file_git_thought_you_renamed
git commit
git add ambiguous_file_git_thought_you_renamed
git commit

这对我有用。

仔细检查,未重命名:

git diff --name-status -C HEAD^^ HEAD
M       ambiguous_file_git_thought_you_renamed
M       original_file

开头的“ M”表示已修改,“ R”表示已重命名。注意此处没有重命名。


3
为了将更改包括在同一提交中,第二个是否git commit需要具有--amend标志?我添加了标志,这对我有用,绕过了重命名检测。
BillyBBone'5

1
如果它们以相同的提交结束,则在某些时候某些事情将决定它们被重命名。真正防止这种情况的唯一方法是将它们永久保留在单独的提交中。
Miral

0

如果您修改了文件A,B和C;并删除文件D,E和F;git认为D被重命名为A或类似的东西。

最简单的解决方案是将文件修改和删除分为两个提交。


-1

避开git认为它是“一个”提交中的重命名。

  1. 暂存并提交不会触发错误重命名的更改
  2. 暂存导致git认为它已重命名并提交的其余文件 git commit --amend

1
这并不能正常工作。它仍然认为我已经编辑了其中一个文件。通过使用,--edit我可以在提交消息的(新)注释中查看其想法。
iconoclast
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.