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

Joe*_*der 8 mercurial export

我有一个个人的Mercurial存储库,可以跟踪我正在进行的一些更改.我想与协作者分享这些更改,但是他们没有/不能获得Mercurial,因此我需要发送整个文件集,协作者将在他们的末尾合并.我正在寻找一种方法来提取在两个修订号之间修改的文件子集的"提示"版本.有没有办法在Mercurial中轻松完成此操作?

添加赏金 - 这对我们来说仍然是一种痛苦.我们经常与内部"客户"合作,他们将我们的源代码版本作为.zip,测试一个小的修补程序更容易分发为.zip叠加而不是补丁(因为我们经常不知道他们的文件的状态).

Dan*_*Dan 13

最好的情况是对这些人施加适当的压力以获得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:])
Run Code Online (Sandbox Code Playgroud)

用法是nameofscript.py fromrevision torevision destination.例如,nameofscript.py 45 51 c:\updates.zip

抱歉可怜的命令行界面,但嘿脚本只用了25分钟就写了.

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


Nic*_*zet 10

好.hg export $base:tip > patch.diff将生成一个标准的补丁文件,大多数工具都可以读取.

特别是,GNU patch命令可以将整个补丁应用于以前的文件.还不够吗?我不明白为什么你需要这些文件:对我来说,应用补丁似乎比从zip中提取文件并将它们复制到正确的位置更容易.此外,如果您的协作者有本地更改,您将覆盖它们.您没有使用版本控制工具直接强制其他人手动合并更改,对吧?让我们patch对付的是,诚实:)

  • 我同意发送差异是一个更好的主意.当一个人向另一个人提供更新的(子)文件集时,很容易丢失更改.每当我看到我以前的工作中发送的整个.java文件时,我都会畏缩不前. (2认同)

umo*_*key 6

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

hg status --rev 1 --rev 2 -m -a -n | xargs zip changes.zip
Run Code Online (Sandbox Code Playgroud)