代码之家  ›  专栏  ›  技术社区  ›  Joe Schneider

Mercurial-如何创建在两个版本之间更改的文件的.zip文件?

  •  8
  • Joe Schneider  · 技术社区  · 16 年前

    我有一个个人Mercurial存储库,跟踪我正在进行的一些更改。我想与合作者共享这些更改,但是他们没有/无法获得Mercurial,因此我需要发送整个文件集,合作者将在其端合并。我正在寻找一种方法来提取在两个修订号之间修改的文件子集的“tip”版本。在Mercurial中有没有一种方法可以轻松做到这一点?

    增加悬赏 -这对我们来说仍然是一种痛苦。我们经常与以.zip格式发布源代码的内部“客户”合作,测试一个小补丁更容易作为.zip覆盖而不是补丁分发(因为我们通常不知道他们文件的状态)。

    9 回复  |  直到 16 年前
        1
  •  13
  •   Dan    16 年前

    最好的情况是对这些人施加适当的压力,让他们使用Mercurial,但除此之外,补丁可能比压缩的文件集更好,因为补丁将跟踪删除和重命名。如果您仍然需要zip文件,我已经编写了一个简短的脚本来生成zip文件:

    import os, subprocess, sys
    from zipfile import ZipFile, ZIP_DEFLATED
    
    def main(revfrom, revto, destination, *args):
        root, err = getoutput("hg root")
        if "no Merurial repository" in err:
            print "This script must be run from within an Hg repository"
            return
        root = root.strip()
    
        filelist, _ = getoutput("hg status --rev %s:%s" % (revfrom, revto))
        paths = []
    
        for line in filelist.split('\n'):
            try:
                (status, path) = line.split(' ', 1)
            except ValueError:
                continue
            if status != 'D':
                paths.append(path)
    
        if len(paths) < 1:
            print "No changed files could be found."
            return
    
        z = ZipFile(destination, "w", ZIP_DEFLATED)
        os.chdir(root)
        for path in paths:
            z.write(path)
        z.close()
    
        print "Done."
    
    
    def getoutput(cmd):
        p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return p.communicate()
    
    
    if __name__ == '__main__':
        main(*sys.argv[1:])
    

    从修订版到查看目的地,使用的名称为script.py。例如。, nameofscript.py 45 51 c:\updates.zip

    注: 这应该从存储库中的工作目录运行。

        2
  •  10
  •   Nicolas Dumazet    16 年前

    hg export $base:tip > patch.diff 将生成一个标准补丁文件,可供周围大多数工具读取。

    特别是GNU patch 命令可以对以前的文件应用整个修补程序。这还不够吗?我不明白你为什么需要这组文件:对我来说,应用补丁似乎比从zip文件中提取文件并将其复制到正确的位置更容易。 ,如果您的合作者有本地更改,您将覆盖这些更改。您没有使用版本控制工具直接强制其他人合并 这些变化,对吗?让 补丁 老实说,你要处理这个问题:)

        3
  •  6
  •   umonkey    12 年前

    在UNIX中,这可以通过以下方式完成:

    hg status --rev 1 --rev 2 -m -a -n | xargs zip changes.zip
    
        4
  •  3
  •   Alex KeySmith    13 年前

    hgexportfiles extension on bitbucket 更多信息。“导出文件”扩展名适用于给定的修订或修订范围,并在指定目录中创建一组已更改的文件。将目录压缩为脚本的一部分很容易。

        5
  •  1
  •   David Winslow    16 年前

    据我所知,目前还没有一个方便的工具(尽管mercurial插件可能是可行的)。你 使用导出文件集的修补程序 hg export from:to (从何处开始并识别修订。)如果您确实需要tip上所示的整个文件,您可以根据 hg diff --stat -r from:to

     ...
     src/test/scala/RegressionTest.scala                        |  25 +++++++++++++----------
     src/test/scala/SLDTest.scala                               |   2 +-
     15 files changed, 111 insertions(+), 143 deletions(-)
    

    如果所有文件的名称中都没有空格或特殊字符,则可以使用以下内容:

    hg diff -r156:159 --stat | head - --lines=-1 | sed 's!|.*$!!' | xargs zip ../diffed.zip
    

    我将把处理特殊字符作为读者的练习;)

        6
  •  1
  •   OliverS    16 年前

    下面是一个小而难看的bash脚本,至少在Linux环境下可以完成这项工作。这绝对没有检查什么,当您移动了一个文件时,它很可能会中断,但这只是一个开始。

    命令:

    zipChanges.sh REVISION REPOSITORY DESTINATION
    zipChanges.sh 3 /home/hg/repo /home/hg/files.tgz
    

    代码:

    #!/bin/sh
    REV=$1
    SRC_REPO=$2
    DST_ZIP=$3
    
    cd $SRC_REPO
    FILES=$(hg status --rev $1 $SRC_REPO | cut -c3-)
    
    IFS=$'\n'
    FILENAMES=""
    for line in ${FILES}
    do
        FILENAMES=$FILENAMES" \""$SRC_REPO"/"$line"\""
    done
    
    CMD="tar czf \"$DST_ZIP\" $FILENAMES"
    
    eval $CMD
    
        7
  •  1
  •   C Brown    16 年前

    我知道你对这个问题已经有了一些答案,但是我的一个朋友有一个类似的问题,我用VB.Net为他创建了一个简单的程序,也许这对你也有帮助,程序和源代码的副本在下面链接的文章底部。

    http://www.simianenterprises.co.uk/blog/mercurial-export-changed-files-80.html

    虽然这不允许您在此时选择结束修订,但在使用源时添加该修订将非常容易,但是您必须在提取文件之前手动更新到目标修订。

    希望这能帮助您或任何其他想要此功能的人。

        8
  •  1
  •   alessandro    15 年前
        9
  •  0
  •   Brilliand    14 年前

    hg update null
    hg debugsetparents (starting revision)
    hg update (ending revision)
    

    这将删除在这两个修订之间未更改的所有跟踪文件。不过,您必须自己删除任何未跟踪的文件。这样做之后,本地分支机构将处于不一致状态;您可以通过运行 hg debugrebuildstate

    推荐文章