【问题标题】:Anyway to automatically merge or concatenate hgtags (Mercurial)?无论如何要自动合并或连接 hgtags (Mercurial)?
【发布时间】:2011-07-06 15:55:55
【问题描述】:

我们正在尝试运行一个 chron 作业,该作业自动将单独的 CVS 模块转换为 mercurial 模块,最后将这些转换后的 mercurial 模块合并到一个单一的 mercurial 存储库中。

我一直在尝试寻找在没有用户窗口提示的情况下自动合并 .hgtags(来自转换后的 hg 存储库)的方法(因此在 chron 作业中使用)。

有没有办法告诉 mercurial 在使用 hg merge 时只获取本地文件并将其附加到传入文件中?

感谢您提供任何信息或任何建议

【问题讨论】:

  • 只是出于好奇,您为什么要使用 cron 作业转换 CVS 存储库?
  • @Oben:增量转换。我从 SVN->Hg 做同样的事情(减去回购组合。)

标签: mercurial merge dvcs merge-conflict-resolution .hgtags


【解决方案1】:

只有在 .hgtags 文件中存在冲突时才会出现窗口提示,这种情况应该很少见。不过,这可能是一个可行的想法。

Mercurial 允许您使用与内部工具不同的合并工具,有关详细信息,请参阅MergeToolConfiguration。您还可以通过命令行使用--tool 选项更改合并工具(请参阅hg merge --help)。

也许您可以编写一些小程序作为 .hgtags 的特殊合并工具,该工具完全符合您的要求,即将本地文件附加到传入文件。然后,您可以修改 hgrc 以在合并 .hgtags 时使用这个新工具。

我从未尝试过这个解决方案,这只是一个想法,但也许它会对你有所帮助。

【讨论】:

    【解决方案2】:

    是的,您可以像 Krtek 描述的那样设置merge tool。我刚刚试了一下,效果很好:

    [merge-tools]
    merge-tags.executable = cat
    merge-tags.args = $local $other | sort -u >> $output
    
    [merge-patterns]
    .hgtags = merge-tags
    

    把它放在服务器上的.hg/hgrc 文件中,以后的合并只会附加标签。发生的事情是hg merge 将执行

    cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags
    

    cat 的第一个参数是 .hgtags 文件的本地版本,第二个参数是您要合并的版本。

    我对输出进行排序并使输出唯一,以避免重复两个文件中常见的行。只要您只添加标签,就可以正常工作 - 但如果您还删除标签,那么.hgtags 文件中的行顺序很重要,因此您不能像这样对其进行排序。 请参阅my extended answer 处理这种情况。

    这是我的测试环节。我首先创建一个有两个头的存储库:

    $ hg init
    $ echo a > a.txt
    $ hg add a.txt
    $ hg commit -m a
    $ echo b > b.txt
    $ hg add b.txt
    $ hg commit -m b
    $ hg tag b
    $ hg update 0
    0 files updated, 0 files merged, 2 files removed, 0 files unresolved
    $ echo c > c.txt
    $ hg add c.txt
    $ hg commit -m c
    created new head           
    $ hg tag c
    

    分支在graphlog extension的输出中可见:

    @  changeset:   4:54c5397a23a4
    |  tag:         tip
    |  user:        Martin Geisler <mg@aragost.com>
    |  date:        Wed Mar 02 11:45:20 2011 +0100
    |  summary:     Added tag c for changeset aff5fe9be7d9
    |
    o  changeset:   3:aff5fe9be7d9
    |  tag:         c
    |  parent:      0:0db5fae8b6cc
    |  user:        Martin Geisler <mg@aragost.com>
    |  date:        Wed Mar 02 11:45:17 2011 +0100
    |  summary:     c
    |
    | o  changeset:   2:a9af8514a64e
    | |  user:        Martin Geisler <mg@aragost.com>
    | |  date:        Wed Mar 02 11:45:02 2011 +0100
    | |  summary:     Added tag b for changeset 0518533f37f6
    | |
    | o  changeset:   1:0518533f37f6
    |/   tag:         b
    |    user:        Martin Geisler <mg@aragost.com>
    |    date:        Wed Mar 02 11:44:44 2011 +0100
    |    summary:     b
    |
    o  changeset:   0:0db5fae8b6cc
       user:        Martin Geisler <mg@aragost.com>
       date:        Wed Mar 02 11:44:33 2011 +0100
       summary:     a
    

    .hgtags 文件中存在冲突:

    $ hg cat -r 2 .hgtags
    0518533f37f6f37edbea5b46d9af2192f69ddecd b
    $ hg cat -r 4 .hgtags
    aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c
    

    但合并仍然是非交互式的:

    $ hg merge
    merging .hgtags
    1 files updated, 1 files merged, 0 files removed, 0 files unresolved
    (branch merge, don't forget to commit)
    

    您可以看到文件是如何附加的:

    $ cat .hgtags
    aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c
    0518533f37f6f37edbea5b46d9af2192f69ddecd b
    

    【讨论】:

    【解决方案3】:

    这是一个简单的python合并工具。它还尝试维护 .hgtags 文件中现有的行顺序。

    同样的警告适用于马丁的回答。

    import sys
    from heapq import merge
    
    local = sys.argv[1]
    other = sys.argv[2]
    output = sys.argv[3]
    
    merged_tags = merge(file(local).readlines(), file(other).readlines())
    
    unique_tags = []
    for tag in merged_tags:
        if tag not in unique_tags:
            unique_tags.append(tag)
    
    file(output, 'w').writelines(unique_tags)
    

    【讨论】:

      【解决方案4】:

      sort -mu 给了我想要的。此命令不排序,但删除重复项。

      sort -u打破时间顺序。

      【讨论】:

        【解决方案5】:

        https://stackoverflow.com/a/9783478/1183010中的建议:

        hgtags.merge.template: changeset = "{tags}" tag = "{node} {tag}\n"

        [合并工具] hgtags.executable = hg hgtags.args = log -r "tagged()" --style hgtags.merge.template > $output hgtags.premerge = False

        [合并模式] .hgtags = hgtags

        为我们工作。

        【讨论】:

          猜你喜欢
          • 2011-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-12
          • 2011-04-10
          • 1970-01-01
          • 2011-01-03
          • 1970-01-01
          相关资源
          最近更新 更多