如何这些VCS的处理重命名?
我发现了很多矛盾的信息,指出Git跟踪LOC(行代码),而不是文件,重命名将因此有它没有任何意义。
如何这些VCS的处理重命名?
我发现了很多矛盾的信息,指出Git跟踪LOC(行代码),而不是文件,重命名将因此有它没有任何意义。
hg mv
,或使用hg addremove --similarity
自动发现。 已经有一些谈论合并过程中加入启发式过。 Git是在它不做重命名跟踪 ,这意味着它并不需要通过使用SCM命令来完成重命名被告知改名(或运行自动检测脚本标记命名已提交之前)不同,并且不保存在资源库中的资料,但它重命名检测 。 这意味着,它发现使用重命名文件名和文件内容的相似性基于启发式算法,两者合并过程中,以及当经由请求的diff -M
选项(或使用被配置diff.renames
配置选项)。
这种方法的优点如下:
需要注意的是pathspec过滤不重命名检测以及工作; 如果你想跟着一个文件的历史跨越重命名使用“ git log --follow <filename>
”
在实践中:
Git的自动检测重命名。 (顺便说一句,我听说,当你从一个文件移动功能,另一种混帐可以检测要求。 我最初的测试似乎表明,这种情况并非如此,但是。)
与Mercurial,你必须明确地告诉它重命名,无论是由hg mv
,或--similarity
的选项hg addremove
,或TortoiseHg的“猜重命名”选项,或某些工具如VisualHg就会向重命名为您服务。 如果你想使用水银Git的方法,我写了一个扩展,以检测在提交时重命名 ,但它是在目前非常实验阶段。
Subversion不会在所有处理重命名。 它记录了一个命名为被删除一个文件,并添加另一个文件。 这意味着,例如,如果爱丽丝更改文件和Bob重命名它,你就会得到一个树冲突。 发生这种情况无论你正在做全面的分支与合并或干脆svn update
。 重命名跟踪计划在颠覆1.8,将于明年今年某个时候。
您有权听到那种。
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)。
大约GIT中还有一两件事,还没有被提到,除了使用启发式,以确定是否重命名已经发生:
如果文件甚至整个目录树被重命名,复制,或移动,并没有下以任何方式修改,则该文件或树实际上是存储在仓库里的同一个对象,并且不占用任何额外的空间。
如果你修改它,那么它存储为一个新的对象,一如往常。
我不知道Hg和SVN,但我怀疑他们面向的变更表的架构意味着他们不同的表现在这种情况下。 它并没有真正对使用任何影响,但它可能给你理由,以避免移动或复制你的资料库里面巨大的树木。
Git跟踪内容,而不是文件。 我不知道有关善变,但SVN必须被明确地告知改名