Mercurial 如果我们将错误的项目推送到另一个远程存储库,会发生什么?

Mercurial 如果我们将错误的项目推送到另一个远程存储库,会发生什么?,mercurial,dvcs,Mercurial,Dvcs,假设我们有一个名为main的项目,然后我们有一个名为analytics的项目,在Bash中,我们在analytics工作目录下,意外地推送到main远程存储库,那么analytics中的所有文件都将添加到main项目中,这是可逆的吗?您将收到Mercurial的投诉,推送将中止。看起来是这样的: # create main repo: % hg init main % touch main/a.txt % hg -R main commit --addremove -m main adding

假设我们有一个名为
main
的项目,然后我们有一个名为
analytics
的项目,在Bash中,我们在
analytics
工作目录下,意外地推送到
main
远程存储库,那么
analytics
中的所有文件都将添加到
main
项目中,这是可逆的吗?

您将收到Mercurial的投诉,推送将中止。看起来是这样的:

# create main repo:
% hg init main
% touch main/a.txt
% hg -R main commit --addremove -m main
adding a.txt

# create analytics repo
% hg init analytics
% touch analytics/a.txt
% hg -R analytics commit --addremove -m analytics
adding a.txt

# try the push:
% hg -R analytics push main
pushing to main
searching for changes
abort: repository is unrelated
> hg histedit <rev>

Mercurial根据两个存储库的根节点知道它们是否相关。也就是说,如果存储库A和B共享一个公共根节点,则它们是相关的。

如果
main
是本地存储库,则可以导航到
main
并执行A以删除有问题的提交。您也可以从基于服务器的
main
进行histedit,但是如果任何其他用户创建了克隆,当他们推送到main时,他们将重新添加更改

histedit是一个Hg扩展,它没有与Hg捆绑在一起。安装后,您可以这样使用它:

# create main repo:
% hg init main
% touch main/a.txt
% hg -R main commit --addremove -m main
adding a.txt

# create analytics repo
% hg init analytics
% touch analytics/a.txt
% hg -R analytics commit --addremove -m analytics
adding a.txt

# try the push:
% hg -R analytics push main
pushing to main
searching for changes
abort: repository is unrelated
> hg histedit <rev>
>编辑

哪里是违规行为的开始。Histedit将生成一个从提交到提示的提交列表。在此列表中,您可以向histedit指示要保留提交、编辑注释或删除提交。Drop应该可以做到这一点。

你为什么不自己试试呢?看看我的答案,看看测试这些东西有多容易:-)Mercurial怎么知道?比如说,如果两个项目只有一个文件是
index.html
,那么它如何知道哪个项目是哪个项目?或者,如果两个项目都恰好有一个文件位于同一路径,例如
config/database.yml
我不确定是否有此评论-我只是用两个本地repo尝试了此操作,从CLI中没有警告。我知道陆龟会发出一些警告,但这些警告可以通过选择“强制推送”选项来避免。有趣的是,hg怎么知道它们是无关的?是否通过使用版本号(长版本号)来检查它们是否来自同一个“根”?事实上,我可以推到John的机器上,或者推到登台,推到测试,或者从测试到登台,这似乎是任意的。@Marting:好吧,我收回这一点:)我重试了,看到了与你相同的警告。然而,就相关回购而言,这些问题有很多价值。例如,即使有相关的RePOS,也有一些时候你不想推动变化(即:在开发的中间等)。我已经更新了答案,当两个存储库相关时提到。