【问题标题】:Mercurial - How do I create a .zip of files changed between two revisions?Mercurial - 如何创建在两个版本之间更改的文件的 .zip?
【发布时间】:2009-12-09 04:06:23
【问题描述】:

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

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

【问题讨论】:

    标签: mercurial export


    【解决方案1】:

    最好的情况是对这些人施加适当的压力以获取 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 分钟编写。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我同意发送差异是一个更好的主意。当一个人向另一个人提供更新的(子)文件集时,丢失更改太容易了。每次我在上一份工作中看到通过电子邮件发送的整个 .java 文件时,我都会感到畏缩。
      【解决方案3】:

      在 UNIX 中可以这样做:

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

      【讨论】:

      • -a 添加的文件丢失
      【解决方案4】:

      我还贡献了一个扩展,请参阅hgexportfiles extension on bitbucket 了解更多信息。导出文件扩展适用于给定的修订或修订范围,并在指定目录中创建一组更改的文件。将目录压缩为脚本的一部分很容易。

      【讨论】:

        【解决方案5】:

        据我所知,没有一个方便的工具来解决这个问题(尽管一个 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
        

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

        【讨论】:

          【解决方案6】:

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

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

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

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

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

            【讨论】:

              【解决方案8】:

              【讨论】:

                【解决方案9】:

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

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

                这将删除所有在这两个版本之间未更改的跟踪文件。不过,您必须自己删除所有未跟踪的文件。这样做后,本地分支将处于不一致状态;你可以通过运行hg debugrebuildstate 来解决这个问题(或者如果你不再需要它,直接删除本地分支)。

                【讨论】:

                • 至于为什么我不能使用补丁:有问题的修订大多是新创建的二进制文件,散布在存储库中。补丁是否正确重构了二进制文件?我不知道,但这种方法比弄清楚这一点更容易。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-10-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多