Mercurial subrepo,如何控制我要用于subrepo的变更集?

Mercurial subrepo,如何控制我要用于subrepo的变更集?,mercurial,changeset,subrepos,Mercurial,Changeset,Subrepos,我正在阅读Subrepo,并在本地运行了一些测试,到目前为止似乎工作正常,但我有一个问题 如何指定/控制要用于特定子回购的变更集 例如,假设我有以下两个项目: class library application o fourth commit o second commit, added a feature | | o third commit

我正在阅读Subrepo,并在本地运行了一些测试,到目前为止似乎工作正常,但我有一个问题

如何指定/控制要用于特定子回购的变更集

例如,假设我有以下两个项目:

class library                    application
o    fourth commit               o   second commit, added a feature
|                                |
o    third commit                o   initial commit
| 
| o  second commit
|/
o    initial commit
现在,我想将类库作为我的应用程序的子库,但由于最长分支(最后作为第四次提交的分支)还不成熟,我想暂时使用“第二次提交”技巧

假设这是可能的,我该如何进行配置呢

下面是一个批处理文件,用于设置上述两个repo+并将库添加为子repo

如果运行批处理文件,它将输出:

[C:\Temp] :test
...
v4
从最后一行可以看到,它验证类库中文件的内容,即第四次提交时的“v4”。我希望它是“v2”,并保持为“v2”,直到我准备从类库存储库中取出一个新版本为止

有人能告诉我是否可以做我想做的事情,如果可以,我需要做什么才能将subrepo锁定到正确的变更集

批处理文件:

@echo off
if exist app rd /s /q app
if exist lib rd /s /q lib
if exist app-clone rd /s /q app-clone


rem == app ==
hg init app
cd app
echo program>main.txt
hg add main.txt
hg commit -m "initial commit"
echo program+feature1>main.txt
hg commit -m "second commit, added a feature"
cd ..

rem == lib ==
hg init lib
cd lib
echo v1>lib.txt
hg add lib.txt
hg commit -m "initial commit"
echo v2>lib.txt
hg commit -m "second commit"
hg update 0
echo v3>lib.txt
hg commit -m "third commit"
echo v4>lib.txt
hg commit -m "fourth commit"
cd ..

rem == subrepos ==
cd app
hg clone ..\lib lib
echo lib = ..\lib >.hgsub
hg add .hgsub
hg commit -m "added subrepo"
cd ..

rem == clone ==
hg clone app app-clone

type app-clone\lib\lib.txt

编辑:好的,我得到了我的答案,谢谢,我在批处理文件的
rem==clone=
行上方添加了以下部分,并重新执行它,现在它将子repo锁定到正确的变更集

rem == lock ==
cd app\lib
hg update 1
cd ..
hg commit -m "lock to second commit"
cd ..

未测试,但您应该能够进入子repo,将其内容更新为正确的提交(),返回一个级别(在主项目中)并提交。
这将使用正确的提交更新
.hgsubstate

(极端解决方法,但不建议这样做。)

Git(或Git子模块)的全部思想是允许通过引用给定子repo的固定id进行依赖关系管理。如果在创建subrepo时没有提供id,则会选择最新的id(在您的示例中为v4),但您可以签出所需的任何id

事实上,他们甚至抱怨:

现在,提交递归地尝试在提交当前存储库之前提交子存储库

这使您能够:

  • 记录次级回购中的一些变化
  • 使用subrepo的新状态(id)更新主项目的
    .hgsubstate

如果您没有明确选择这样做,您的次级回购修订将不会提前,因此您所要做的就是按照您最初的意愿进行设置。最初创建子回购时,只需使用“-r”参数克隆到您想要的变更集:

rem == subrepos ==
cd app
hg clone -r CHANGESETYOUWANT ..\lib lib
echo lib = ..\lib >.hgsub
hg add .hgsub
hg commit -m "added subrepo"
cd ..

请注意第三行的修改。

我添加了一个新的批处理文件,最终克隆了应用程序项目,以显示克隆将下拉最新版本的lib。我明白你的意思。如果我将子repo更新为特定变更集,然后提交主存储库,.hgsubstate更改(我注意到有一个更改,但不太理解/连接)实际上是指向子repo的特定变更集id的链接,因此如果我随后将主repo拉到另一个目录中,然后它也会将子repo更新为相同的变更集?@Lasse:这就是全部的想法:在主项目中记录一个精确的依赖项,以便其他人在拉取相同的“主项目”时重用,因此产生了
.hgsubstate
文件。谢谢,这创造了奇迹,我会在我的答案底部添加一些东西,以防其他人想要我执行的确切命令来测试这个。没有立即看到你的答案。它确实涵盖了subrepo创建部分的正确修订+1没问题,你的答案是第一位的,而且是正确的。我只是抄近路。