在mercurial中跨子子仓库移动文件

时间:2011-10-20 15:31:03

标签: mercurial

是否有人知道如何在保留文件历史记录的同时在suprepos中移动文件

我正在使用hg mv /Product/common/modules/sub-repo1/scripts/filename /Product/common/modules/sub-repo2/scripts/filename

Product是shell级回购,sub-repo1sub-repo2是子回购

抛出错误中止/Product/common/modules/sub-repo2/scripts/filename not under root ..

2 个答案:

答案 0 :(得分:6)

可以通过拼接两个存储库来实现:

  1. 使用filemap转换为新的存储库,该文件图会过滤掉您感兴趣的文件以外的所有内容。hgtip.com上有一个很好的描述。

    echo include my-file > filemap
    hg convert --filemap sourcerepo temprepo
    
  2. 将新存储库拉入现有存储库。这将创建一个完整的新头,它不是来自任何先前的变更集。这也在hgtip.com上有更详细的描述。

    cd destrepo
    hg pull --force temprepo
    
  3. 最后,合并新头。

    hg merge
    
  4. 这是命令行上的一个示例。首先,我们创建一个原始的源存储库:

    $ mkdir sourcerepo
    $ cd sourcerepo
    $ hg init
    $ echo aaa > a
    $ echo bbb > b
    $ hg add a b
    $ hg commit -m first
    $ echo xxx > a
    $ echo yyy > b
    $ hg commit -m second
    

    然后我们创建一个文件映射并将其转换为只包含我们想要的文件的临时存储库:

    $ cd ..
    $ echo include a > filemap
    $ hg convert --filemap filemap sourcerepo temprepo
    initializing destination temprepo repository
    scanning source...
    sorting...
    converting...
    1 first
    0 second
    $ hg glog temprepo/a
    @  changeset:   1:a2c44f396733
    |  tag:         tip
    |  user:        Laurens Holst <...>
    |  date:        Fri Oct 21 13:02:53 2011 +0200
    |  summary:     second
    |
    o  changeset:   0:68090379058b
       user:        Laurens Holst <...>
       date:        Fri Oct 21 13:02:41 2011 +0200
       summary:     first
    

    现在我们创建一个目标存储库:

    $ mkdir destrepo
    $ cd destrepo
    $ echo zzz > z
    $ hg add z
    $ hg commit -m another
    $ hg glog
    o  changeset:   0:890b51ba85c6
       tag:         tip
       user:        Laurens Holst <...>
       date:        Fri Oct 21 13:15:51 2011 +0200
       summary:     another
    

    最后,我们从临时仓库中提取更改并合并:

    $ hg pull --force ../temprepo
    pulling from ../temprepo
    searching for changes
    warning: repository is unrelated
    requesting all changes
    adding changesets
    adding manifests
    adding file changes
    added 2 changesets with 2 changes to 1 files (+1 heads)
    (run 'hg heads' to see heads, 'hg merge' to merge)
    $ hg merge
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    (branch merge, don't forget to commit)
    $ hg commit -m "merge file a from sourcerepo"
    $ ls
    a z
    $ hg glog
    @    changeset:   3:7becd66c019a
    |\   tag:         tip
    | |  parent:      0:890b51ba85c6
    | |  parent:      2:dc9ac503efba
    | |  user:        Laurens Holst <...>
    | |  date:        Fri Oct 21 13:39:51 2011 +0200
    | |  summary:     merge file a from sourcerepo
    | |
    | o  changeset:   2:dc9ac503efba
    | |  user:        Laurens Holst <...>
    | |  date:        Fri Oct 21 13:02:53 2011 +0200
    | |  summary:     second
    | |
    | o  changeset:   1:2a5fa6bd9021
    |    parent:      -1:000000000000
    |    user:        Laurens Holst <...>
    |    date:        Fri Oct 21 13:02:41 2011 +0200
    |    summary:     first
    |
    o  changeset:   0:890b51ba85c6
       user:        Laurens Holst <...>
       date:        Fri Oct 21 13:15:51 2011 +0200
       summary:     another
    

    现在,源存储库中的文件将合并到目标存储库中,同时保留所有更改历史记录!

答案 1 :(得分:3)

你做不到。

您需要按以下步骤执行此操作:

  1. 使用普通文件系统工具将文件从一个存储库复制到另一个存储库
  2. 通过hg add
  3. 将其添加到新存储库中
  4. 通过hg remove
  5. 从旧存储库中删除该文件

    请注意,在此过程中,您将丢失历史记录,因为它将留在旧存储库中,而不会传输到新存储库。如果您需要,还有其他方法涉及通过转换创建仅包含该文件及其历史记录的新存储库,但这是一个不同的主题。

    您无法说服Mercurial一次使用多个存储库,因此没有一个命令可以将其从一个存储库传输到另一个存储库。