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

时间:2009-12-09 04:06:24

标签: mercurial export

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

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

9 个答案:

答案 0 :(得分: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:])

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

对于糟糕的命令行界面感到抱歉,但是脚本只花了25分钟才写完。

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:6)

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

hg status --rev 1 --rev 2 -m -a -n | xargs zip changes.zip

答案 3 :(得分:3)

我还提供了一个扩展程序,有关详情,请参阅hgexportfiles extension on bitbucket。导出文件扩展名适用于给定的修订版本或修订版本范围,并在指定的目录中创建一组已更改的文件。将目录压缩为脚本的一部分很容易。

答案 4 :(得分:1)

据我所知,没有一个方便的工具(虽然一个mercurial插件可能是可行的)。你可以导出文件集的补丁,使用hg export from:to(来自和识别修订版的地方。)如果你真的需要在提示中看到的整个文件,你可能可能会同时破解一些东西在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

我会留下处理特殊字符作为读者的练习;)

答案 5 :(得分:1)

这是一个小而丑陋的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

答案 6 :(得分:1)

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

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

虽然目前不允许您选择最终版本,但在使用源代码时添加它会非常容易,但是在提取文件之前必须手动更新到目标版本。 如果需要你甚至可以修改它来创建zip而不是文件夹(这也很好,很容易手动压缩)

希望这对您或任何想要此功能的人有所帮助。

答案 7 :(得分:1)

答案 8 :(得分:0)

我最近遇到了这个问题。我的解决方案:

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

这将删除在这两个修订版之间未更改的所有跟踪文件。但是,您必须自己删除任何未跟踪的文件。执行此操作后,本地分支将处于不一致状态;您可以通过运行hg debugrebuildstate来解决此问题(或者只是删除本地分支,如果您不再需要它)。