从版本化的ZIP重建SVN

从版本化的ZIP重建SVN,svn,command-line,unattended-processing,Svn,Command Line,Unattended Processing,我有不同版本的项目ZIP,例如: project_v1.zip project_v2.zip project_v3.zip project_v4.zip 它们里面没有任何.svn,但我们知道v2是从v1开发的,v3是从v2开发的,v4是从v3开发的 我正在使用python和svn命令行解压每个文件并创建一个包含其内容的标记,但我不确定如何重新创建一个主干,在这个主干中,您可以看到代码是如何从v1到v4再到v2和v3变化的 我需要以编程的方式来做这件事,因为我们在几个项目中遇到了同样的问题,我

我有不同版本的项目ZIP,例如:

  • project_v1.zip
  • project_v2.zip
  • project_v3.zip
  • project_v4.zip
它们里面没有任何
.svn
,但我们知道v2是从v1开发的,v3是从v2开发的,v4是从v3开发的

我正在使用
python
svn命令行
解压每个文件并创建一个包含其内容的标记,但我不确定如何重新创建一个主干,在这个主干中,您可以看到代码是如何从v1到v4再到v2和v3变化的

我需要以编程的方式来做这件事,因为我们在几个项目中遇到了同样的问题,我们没有时间手动合并或处理comflict,所以脚本必须无人参与

我正在尝试这个:

import os
import subprocess
from shutil import copyfile
import filecmp

def run(cmd):
    try:
        r = subprocess.check_output(cmd)
    except:
        print ("\n\n")
        print (" ".join(cmd))
        raise
    return r.decode('cp1252').strip()

def update_svn(zip_content, work_copy, comment):
    for root, dirs, files in os.walk(work_copy, topdown=True):
        dirs[:] = [d for d in dirs if d !=".svn"]
        borrados = set()
        for name in files:
            filename = os.path.join(root, name)
            filename = os.path.relpath(filename, work_copy)
            new_file = zip_content+"\\"+filename
            if not os.path.exists(new_file):
                run(["svn", "delete", work_copy+"\\"+filename, "-m", comment])
        for name in dirs:
            dirname = os.path.join(root, name)
            dirname = os.path.relpath(dirname, work_copy)
            new_dir = zip_content+"\\"+dirname
            if not os.path.exists(new_dir):
                run(["svn", "delete", work_copy+"\\"+dirname, "-m", comment])
                borrados.add(name)
        dirs[:] = [d for d in dirs if d in borrados]

    for root, dirs, files in os.walk(zip_content, topdown=True):
        dirs[:] = [d for d in dirs if d !=".svn"]
        for name in files:
            filename = os.path.join(root, name)
            old_file = work_copy+"\\"+os.path.relpath(filename, zip_content)
            if not os.path.exists(old_file) or not filecmp.cmp(filename, old_file):
                copyfile(filename, old_file)
                run(["svn", "-q", "add", destino])
        for name in dirs:
            dirname = os.path.join(root, name)
            dirname = os.path.relpath(dirname, zip_content)
            old_dir = work_copy+"\\"+dirname
            if not os.path.exists(old_dir):
                run(["svn", "mkdir", old_dir])

    run(["svn", "commit", work_copy, "-m", comment])

但是,当我在svn中将trunk与最后一个标记进行比较时,我发现它们有一些不同之处

我不会对python脚本有所帮助,但这些步骤应该很容易实现自动化:

  • 创建
    project
    目录,并将
    project\u v1.zip中的文件解压缩到其中
  • 将目录中的所有内容添加到svn(
    svn Add*
    )并提交到主干中
  • 从主干创建
    v1
    标记
  • project
    目录中删除除
    .svn
    目录以外的所有内容,并将
    project\u v2.zip
    中的文件解压缩到该目录中
  • 您需要添加所有未版本化的文件,并从存储库中删除所有丢失的文件。您可以使用来执行此魔术,或者只需浏览
    svn status
    output,然后在python中为每个文件逐个运行
    svn add
    svn delete
    (请参阅)
  • 将更改提交到主干并创建
    v2
    标记
  • 转到步骤4并重复,直到添加每个项目版本

  • 请注意,第2步和第3步与第4步、第5步和第6步相比是多余的,所以您可以跳过它-从空目录中删除所有内容是没有意义的,但python脚本不应该抱怨。:)

    您是否尝试创建工作副本,将第一个版本解压缩到工作副本(需要svn添加),提交工作副本,解压缩下一个版本,将其复制到工作副本(可能需要svn添加),提交工作副本,等等?这还不够好,因为当您解压缩project_v2.zip到project_v1时,会添加或覆盖在v1和v2之间更改的文件,但不会删除在v1和v2之间删除的文件