我已经使用Mercurial版本控制系统已经有一段时间了,有几次我看到系统警告我有关不同的重命名。
我所做的是制作一个较大文件的两个不同的后代。例如,我有一个名为HttpRequest
的类,它是CGI.pm
的包装器。后来,当我决定转到PSGI
协议时,我已经制作了这个文件的两个副本,即Cgi.pm
和Psgi.pm
。原始类保留并随着从中继承的新类而变得抽象。
我一直认为这是处理这种情况的首选方法,因为每个文件都保留了它所基于的文件的历史记录。但是,当我将更改推送到远程服务器时,它会告诉我:
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 2 changes to 2 files (+1 heads)
remote: warning: detected divergent renames of lib/HttpRequest.pm to:
remote: lib/HttpRequest/Cgi.pm
remote: lib/HttpRequest/Psgi.pm
这不好吗?我应该采取其他方式吗?
答案 0 :(得分:2)
看起来问题不在于您制作了相同源文件的版本化副本,而是有两个更改集,其中每次将文件重命名为不同的名称,并且这些更改集不在同一个开发行中。这种观察是基于你的拉动创造了一个新的头脑。
所以在这个例子中,Mercurial警告你拉动已经创建了一个新头,因此你的repo有两个头,其中{em}已经被重命名为另一个文件。因此,如果您尝试将这些合并为一个,则必须决定应该坚持哪个更改。
防止这种情况的最简单方法是复制原始文件而不是重命名。更准确地说,第一次时间你可以重命名它,但是在随后的所有情况下你都需要复制它(显然如果你在相同的开发线上这样做,如果你不这样做,那就必要了)稍后合并分歧线。)
您可能还想查看Mercurial的relevant section:权威指南。