代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

mercurial subrepos,如何控制要用于子repo的变更集?

  •  3
  • Lasse V. Karlsen  · 技术社区  · 15 年前

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

    如何指定/控制要用于特定子报告的变更集?

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

    class library                    application
    o    fourth commit               o   second commit, added a feature
    |                                |
    o    third commit                o   initial commit
    | 
    | o  second commit
    |/
    o    initial commit
    

    现在,我希望类库作为我的应用程序的一个子报告,但是由于最长分支(以第四个提交结束的分支)的不成熟,我希望临时使用“第二个提交”技巧。

    假设可能的话,我该如何配置它呢?

    这是一个批处理文件,它设置了上述两个repos+,并将库添加为子报告。

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

    [C:\Temp] :test
    ...
    v4
    

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

    有谁能告诉我是否可以做我想做的,如果可以,我需要做什么才能将子报告锁定到正确的变更集?

    批处理文件:

    @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
    

    编辑 :好的,我得到了答案,谢谢。 @VonC ,我将以下部分添加到批处理文件中, rem == clone == 行,然后重新执行它,现在它将子报告锁定到正确的变更集。

    rem == lock ==
    cd app\lib
    hg update 1
    cd ..
    hg commit -m "lock to second commit"
    cd ..
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   VonC    15 年前

    未测试,但您应该能够进入子报告,将其内容更新到正确的提交中。( hg update ,返回一个级别(在主项目中)并提交。
    应该更新 .hgsubstate 以正确的承诺。

    (极端的工作环境, update that .hgsubstate yourself ,但不建议这样做。)

    所有的想法 hg subrepos (或git子模块)是通过引用 固定的 给定子回购的ID。如果在创建子报告时没有给定ID,那么将选择最新的ID(在您的情况下是v4),但您可以签出所需的任何ID。

    事实上, this thread 甚至抱怨:

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

    这样你就可以:

    • 在子回购中记录一些变化。
    • 更新 HgPb态 子报告的新状态(ID)的主项目。
        2
  •  3
  •   Ry4an Brase    15 年前

    如果没有明确选择,子回购版本将不会被升级,因此您所要做的就是按照您最初想要的方式进行设置。在最初创建子repo时,只需使用一个“-r”参数来克隆到您想要的变更集:

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

    注意第三行的修改。

    推荐文章