有人在我们的中央存储库中提交。我们如何还原呢?

时间:2011-01-24 16:56:48

标签: mercurial

我们正在使用一个本地中央存储库,每个人都推送和拉动。直到最近,此存储库仅包含.hg文件夹。然后有人继续直接在中央存储库中创建了一个没有父级(parent = -1)和子级的“孤岛”变更集。正确的方法是将其添加到本地存储库并推送更改。

有没有办法让中央存储库的工作副本返回到只包含.hg并且不与特定变更集关联的状态?

4 个答案:

答案 0 :(得分:7)

命令:

hg update null

将存储库的工作目录更新到第一次提交之前的点,因此工作目录中没有文件,hg parents显示-1

如果你不想要它,你仍然需要删除提交,但这是一个单独的问题。

答案 1 :(得分:3)

由于这是您的本地中央存储库,并且这些是编辑历史记录的命令,请采取一切预防措施,例如首先在存储库的副本上尝试。

  

回滚存储库中的最后一个事务。

  

hg strip rev从存储库中删除rev版本及其所有后代。

  • 另见:

https://www.mercurial-scm.org/wiki/EditingHistory

  

如果您立即(或很快)抓住了您的错误,您可以使用 hg strip REV 来回滚最新(一个或多个)更改。 ...

编辑:以原始形式回答问题。 OP已经编辑了这个问题。

答案 2 :(得分:0)

只需删除.hg文件夹以外的所有内容。

答案 3 :(得分:0)

如果我正确理解发生了什么,有人会更改到存储库目录并将单个文件作为“添加文件”提交,而无需先从活动目录中检出任何更改集。

您最终得到的是以下历史记录图:

0:a43f   1:2843   2:bc81   3:2947
 o ------ o ------ o ------ o

4:228f
 o

其中,变更集 4:228f 将“ null id ”作为其父变更集。

根据您是否要保留变更集4:228f,您可以遵循以下策略之一:

选项1:在没有违规变更的情况下克隆存储库

您可以创建存储库的新克隆,将版本3:2947指定为目标版本。这会将更改3:2947及其所有祖先变更集提取到新存储库中。由于违规变更集未链接到变更集3:2947的祖先,因此它不会成为新克隆的一部分。

我建议先保存旧存储库,然后将所有内容移到新克隆中,例如您保存在.hg/目录中的任何特定于存储库的安装文件。

如果您当前的存储库位于/work/repo/foo,则执行此操作的一种方法是:

$ cd /work/repo
$ mv foo foo.bak
$ hg clone -r 2947 foo.bak newfoo

现在复制所有.hg/个设置文件,例如您的原始.hg/hgrc文件:

$ cp foo.bak/.hg/hgrc newfoo/.hg/hgrc

最后移动新的foo存储库:

$ mv newfoo foo

选项2:克隆存储库并保留 rebase 更改

执行与以前相同的操作,但在移动newfoo存储库之前,请使用“ hg export ”命令从旧存储库中提取有问题的更改的副本。然后查看newfoo树中最末端变更集的工作副本,并将违规变更的文件更改导入为当前历史记录图表的正常变更集。

因此,在mv newfoo foo之前,输入以下内容保存违规更改的补丁:

$ cd /work/repo/foo.bak
$ hg export -r 228f --git > /tmp/patchfile.diff

然后您可以签出新存储库的最新版本,并在当前历史记录之上重新导入补丁:

$ cd /work/repo/newfoo
$ hg update --clean tip
$ hg import /tmp/patchfile.diff

如果违规变更集只是添加了一个新文件,那么这应该可以正常工作,您已准备好移动新的存储库!

在进行最终重命名之前,删除新存储库的工作副本文件可能是个好主意:

$ cd /work/repo/newfoo
$ hg update --clean null