处理重命名:SVN与混帐与善变(Handling renames: svn vs. git vs.

2019-07-21 11:39发布

如何这些VCS的处理重命名?

我发现了很多矛盾的信息,指出Git跟踪LOC(行代码),而不是文件,重命名将因此有它没有任何意义。

Answer 1:

  • Git不会跟踪重命名所有,但采用启发式合并等过程中重新发现它们
  • 水银曲目重命名(起源版本,原始文件被记录),并合并过程中使用这些信息。 所以,你必须明确地告诉汞柱关于与重命名hg mv ,或使用hg addremove --similarity自动发现。 已经有一些谈论合并过程中加入启发式过。
  • SVN跟踪重命名,但是我不知道合并期间,它与他们有多好交易(实际上从未测试过)。


Answer 2:

混帐

Git是在它不做重命名跟踪 ,这意味着它并不需要通过使用SCM命令来完成重命名被告知改名(或运行自动检测脚本标记命名已提交之前)不同,并且不保存在资源库中的资料,但它重命名检测 。 这意味着,它发现使用重命名文件名和文件内容的相似性基于启发式算法,两者合并过程中,以及当经由请求的diff -M选项(或使用被配置diff.renames配置选项)。

这种方法的优点如下:

  • 重命名并不需要被明确地标记(或检测):在重命名可以来自一个补丁,或可以做争夺文件管理器或图形接口
  • 相似性检测算法可以得到改善,并且在提交如在检测重命名前它们标记提交,并保存在存储库此信息的情况下的时间不冷冻 它也更容易对付重命名检测失误,如果他们没有在历史上冻结
  • 它遵循的Git ophilosophy,这是重要的内容; 怎么看git的怪 (和图形前端,以它像“混帐GUI怪”) 可以按照跨文件边界的代码块的运动,这东西比文件的重命名wholesame更通用。
  • 相同的机制负责合并过程中处理的重命名; 使用重命名的检测手段,它可以为撤并最终基于3个提交完成,并且也没有必要认真遵循历史,记录每个重命名 - 或文件的规范名称的非分布式概念

需要注意的是pathspec过滤不重命名检测以及工作; 如果你想跟着一个文件的历史跨越重命名使用“ git log --follow <filename>



Answer 3:

在实践中:

Git的自动检测重命名。 (顺便说一句,我听说,当你从一个文件移动功能,另一种混帐可以检测要求。 我最初的测试似乎表明,这种情况并非如此,但是。)

与Mercurial,你必须明确地告诉它重命名,无论是由hg mv ,或--similarity的选项hg addremove ,或TortoiseHg的“猜重命名”选项,或某些工具如VisualHg就会向重命名为您服务。 如果你想使用水银Git的方法,我写了一个扩展,以检测在提交时重命名 ,但它是在目前非常实验阶段。

Subversion不会在所有处理重命名 它记录了一个命名为被删除一个文件,并添加另一个文件。 这意味着,例如,如果爱丽丝更改文件和Bob重命名它,你就会得到一个树冲突。 发生这种情况无论你正在做全面的分支与合并或干脆svn update 。 重命名跟踪计划在颠覆1.8,将于明年今年某个时候。



Answer 4:

您有权听到那种。

Git的操作上的文件,而不是文件本身的内容,因此重命名在技术上是毫无意义的。 到Git,重命名看起来像文件中的消失和文件B出现了相同的内容,但A.混帐是搞清楚当一个文件实际上已经被更名实际上是相当不错的。

试试看:重命名文件,然后运行“git的RM使用oldName”和“混帐添加NEWNAME”通知Git阶段的变化,然后运行“git的状态”,看看有什么混帐认为它在做什么 - 你会看到,它告诉您的文件已被重命名。 我不知道后来那意味着什么,虽然。 看看与“混帐秀”的提交,你不会看到一个重命名的任何提及,只是一堆从一个路径中删除,并添加到另一行。

或者,你也可以使用“git的MV”命令来重命名文件。 它不会改变的git如何看待的操作,它只是有效地做“MV使用oldName NEWNAME”,“混帐RM使用oldName”和一步到位“混帐添加NEWNAME”。

有关概述,水银,请参阅拐的答案 。

SVN,在另一方面,不能检测重命名,但必须与“SVN MV”命令来告诉他们。 当被告知,但是,它跟踪改称“一流”的变化,因此观看的changelog时后,你会看到的变化是一个重命名。

我不会建议基于对这一功能的git或水银选择SVN,虽然。 有两种工具之间更大,更重要的差异。 我会首先决定是否要一个分布式版本控制系统(GIT或水银)或集中式版本控制系统(SVN)。



Answer 5:

大约GIT中还有一两件事,还没有被提到,除了使用启发式,以确定是否重命名已经发生:

如果文件甚至整个目录树被重命名,复制,或移动,并没有下以任何方式修改,则该文件或树实际上是存储在仓库里的同一个对象,并且不占用任何额外的空间。

如果你修改它,那么它存储为一个新的对象,一如往常。

我不知道Hg和SVN,但我怀疑他们面向的变更表的架构意味着他们不同的表现在这种情况下。 它并没有真正对使用任何影响,但它可能给你理由,以避免移动或复制你的资料库里面巨大的树木。



Answer 6:

Git跟踪内容,而不是文件。 我不知道有关善变,但SVN必须被明确地告知改名



文章来源: Handling renames: svn vs. git vs. mercurial