【问题标题】:Making mercurial subrepositories behave like subversion externals使 mercurial 子存​​储库表现得像颠覆外部
【发布时间】:2010-04-03 05:05:23
【问题描述】:

FAQ 和 hginit.com 对帮助我从 svn 过渡到 hg 非常有用。

但是,当谈到以 subversion 的外部方式使用 Hg 的子存储库功能时,我已经尝试了所有方法,但无法复制 svn 外部的良好行为。

这是我想做的最简单的例子:

  1. 初始化“lib”存储库 这个存储库永远不会被用作独立的;它总是包含在 main 中 存储库,作为子存储库。

  2. 初始化一个或多个包括存储库 为了简单起见,我将“初始化”一个名为“main”的存储库

  3. 让“main”包含“lib”作为子存储库

  4. 重要的是 - 以下是我无法工作的地方: 当我修改“main/lib”中的文件并推送修改时, 然后该更改被推送到“lib”存储库——而不是副本 在“主要”内部。

命令行胜于雄辩。我在这个主题上尝试了很多变化,但这里是要点。如果有人可以在命令行中回复,我将永远感激不尽!

1。初始化“lib”存储库

$ cd /home/moi/hgrepos ## 我在主服务器上存储 hg 存储库的位置

$ hg 初始化库

$ echo "foo" > lib/lib.txt

$ hg 添加库

$ hg ci -A -m "初始化库" 库

2。初始化“主”存储库,并包含“lib”作为子存储库

$ cd /home/moi/hgrepos

$ hg init main

$ echo "foo" > main/main.txt

$ hg 添加主目录

$ cd main

$ hg clone ../lib 库

$ echo "lib=lib" > .hgsub

$ hg ci -A -m "初始化主程序" .

这一切都很好,但是当我克隆“主”存储库并制作本地 修改“main/lib”中的文件,并推送它们,更改被推送到“main/lib”, 不要“解放”。

在命令行 ESE 中,这是问题:

$ /home/moi/hg-test

$ hg clone ssh://moi@www.moi.com/hgrepos/lib lib

$ hg clone ssh://moi@www.moi.com/hgrepos/main main

$ cd main

$ echo foo >> lib/lib.txt

$ hg st

M lib.txt

$ hg com -m "修改后的 lib.txt,来自主仓库" lib.txt

$ hg 推

推送到 ssh://moi@www.moi.com/hgrepos/main/lib

hg 的最后一行输出显示了问题。

这表明我对 lib 中的文件的副本进行了修改,而不是对 lib 存储库中的文件进行了修改。如果它按我希望的那样工作,那么推送将是 hgrepos/lib,而不是 hgrepos/main/lib。即,我会看到:

$ hg 推

推送到 ssh://moi@www.moi.com/hgrepos/lib

如果你能用术语回答这个问题

命令行而不是英文,

我将永远感激不尽!

提前谢谢你!

艾米丽在波特兰

【问题讨论】:

  • 艾米丽,我很高兴它成功了。如何选择我的答案?这是花时间在 SO 上帮助的通常奖励。您对答案的修改通常会进入对我的评论或对您的问题进行“更新”编辑,而不是答案本身。
  • 实际上,看看你的 ssh:// 指令,你想多了。按照我设置本地子存储库设置的步骤后,您可以通过 ssh 克隆“主”存储库,而 mercurial 将在远程存储库上创建整个主/库设置,同时进行拉取。这就是 subrepos 的真正承诺——一个克隆就可以获得多个嵌套的 repos。

标签: mercurial


【解决方案1】:

问题在于您的 .hgsub 文件。它指向 lib repo 的位置,所以如果 lib 是 main 的兄弟,它应该是:

lib=../lib

您的 hg add libhg add main 行也没有意义。那些被添加到 main 和 lib 之外的 repo 中?您在/home/moi/hgrepos 中运行它们。

这是你的脚本,做了一些调整:

+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone main main-clone
updating to branch default
pulling subrepo lib
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
pushing to /home/ry4an/hgtest/main
pushing subrepo lib
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files

要通过 ssh:// 执行此操作,您只需进行一次更改。克隆主 repo 时将 hg clone main main-clone 更改为 hg clone ssh://host/hgtest/main main-clone -- 克隆 main 会自动克隆 lib -- 这就是 subrepo 的好处。

这是一个工作日志:

+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone ssh://localhost/hgtest/main main-clone
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 0c:58:d6:d3:d3:16:14:ee:3b:be:01:bc:c7:3c:92:0b.
Are you sure you want to continue connecting (yes/no)? yes
ry4an@localhost's password: 
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 3 changes to 3 files
updating to branch default
pulling subrepo lib
ry4an@localhost's password: 
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
remote: Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
ry4an@localhost's password: 
pushing to ssh://localhost/hgtest/main
pushing subrepo lib
ry4an@localhost's password: 
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

【讨论】:

    【解决方案2】:

    糟糕,对于上一个答案中的格式感到抱歉。又来了,格式化了!

    因此,这是大多数人将面临的两种情况:

    A) 在完全本地的情况下使用子存储库。 本质上,这是 Ryan 的解决方案。 我想只有单独工作的开发人员会在这条船上。

        cd /home/moi/hgrepos
        hg init lib
        cd lib
        echo foo > lib.txt
        hg ci -A -m Init
    
        cd /home/moi/hgrepos
        hg init main
        cd main
        echo foo > main.txt
        echo lib = ../lib > .hgsub
        hg clone ../lib
        hg add .hgsub main.txt
        hg ci -m Init
    
        cd /home/moi/hgrepos
        hg clone main main-clone
        cd main-clone/lib
        echo "Modified while on main trunk" >>lib.txt
        hg commit -m "Modified lib.txt, while on main trunk"
        hg push
        cd /home/moi/hgrepos/lib
        hg update
        1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    
        cat lib.txt
        foo
        Modified while on main trunk
    

    ---------------------------------------------- ------------------

    B) 通过 ssh 使用子存储库。
    我想大多数在团队中工作的开发人员都会在这条船上。

    1) 设置库

    cd /home/moi/hgrepos
    hg init lib
    cd lib
    echo foo > lib.txt
    hg ci -A -m Init
    

    2) 设置主目录

    cd /home/moi/hgrepos
    hg init main
    cd main
    echo foo > main.txt
    echo lib=ssh://moi@www.moi.com/hgrepos/lib > .hgsub
    hg clone ssh://moi@www.moi.com/hgrepos/lib lib
    hg add .hgsub main.txt
    hg ci -m Init
    

    3) 将 lib 克隆到 hgtest 目录

    cd /home/moi/hgtest
    hg clone ssh://moi@www.moi.com/hgrepos/lib lib
    

    4) 将 main 克隆到 hgtest 目录

    cd /home/moi/hgtest
    hg clone ssh://moi@www.moi.com/hgrepos/main main
    

    5) 在主干上修改 lib.txt

    cd /home/moi/hgtest/main/lib
    echo "Modified while on main trunk" >>lib.txt
    hg commit -m "Modified lib.txt, while on main trunk"
    hg push
    

    6) 验证 lib.txt 在 lib 存储库中是否已更改

    cd /home/moi/hgtest/lib
    hg pull
    hg update
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    cat lib.txt
    foo
    Modified while on main trunk
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      相关资源
      最近更新 更多