【问题标题】:How can I prevent git from thinking I did a rename如何防止 git 认为我重命名了
【发布时间】:2013-02-08 12:10:45
【问题描述】:

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

【问题讨论】:

  • Git 实际上并没有存储它认为您进行了重命名的事实。实际的对象数据库仅存储您项目的完整快照,并且没有差异/重命名/移动的概念。 Git 说你重命名了一个文件的事实来自对数据库的后期分析。
  • @JacobGroundwater 哦,我明白了,所以没关系。谢谢。 :)

标签: git


【解决方案1】:

为什么 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>.

同样,如果文件大多相似,这对您没有帮助,但您当然可以使用这些值来调整它们需要的相似程度,以便被视为副本或重命名。您的里程可能会有所不同。

【讨论】:

  • 只想指出,这个答案比其他问题的任何答案都更有帮助和描述性
  • 提交前的这两个阶段的过程将起作用:git reset ambiguous file、git commit、git add ambiguous file、git commit。
【解决方案2】:

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

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

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

【讨论】:

  • 虽然这适用于某些用例,但最初的问题是“在特定情况下是否可以防止这种 [重命名检测]?”您使用的标志在 ~/.gitconfig 中或在命令行上的整个当前运行时将其关闭。即使相似性指数 >=99% 的项目也不会被视为重命名,这通常不是人们所期望的,并且可能违反最小意外原则。尽管如此,标志肯定有用例,否则它就不会存在。感谢您在这里指出!
【解决方案3】:

如果您在提交之前的某个时刻并且“您觉得 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”表示重命名。注意这里不存在重命名。

【讨论】:

  • 第二个git commit 是否需要有--amend 标志才能将更改包含到同一个提交中?我添加了标志,这对我有用,可以绕过重命名检测。
  • 如果它们最终在同一个提交中,那么某些时候某些东西会决定它们是重命名的。真正防止这种情况的唯一方法是将它们永久保存在单独的提交中。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2018-10-09
    • 1970-01-01
    • 2018-10-24
    • 2012-02-04
    相关资源
    最近更新 更多