我们正在使用一个本地中央存储库,每个人都推送和拉动。直到最近,此存储库仅包含.hg文件夹。然后有人继续直接在中央存储库中创建了一个没有父级(parent = -1)和子级的“孤岛”变更集。正确的方法是将其添加到本地存储库并推送更改。
有没有办法让中央存储库的工作副本返回到只包含.hg并且不与特定变更集关联的状态?
答案 0 :(得分:7)
命令:
hg update null
将存储库的工作目录更新到第一次提交之前的点,因此工作目录中没有文件,hg parents
显示-1
。
如果你不想要它,你仍然需要删除提交,但这是一个单独的问题。
答案 1 :(得分:3)
由于这是您的本地中央存储库,并且这些是编辑历史记录的命令,请采取一切预防措施,例如首先在存储库的副本上尝试。
hg rollback
(删除上次存储库更改)
回滚存储库中的最后一个事务。
hg strip
(删除特定修订版)
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,您可以遵循以下策略之一:
您可以创建存储库的新克隆,将版本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
执行与以前相同的操作,但在移动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