Mercurial subrepo,如何控制我要用于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
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
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没问题,你的答案是第一位的,而且是正确的。我只是抄近路。