0

我有一个项目的不同版本的 zip,例如:

  • project_v1.zip
  • project_v2.zip
  • project_v3.zip
  • project_v4.zip

其中没有任何.svn内容,但我们知道 v2 是从 v1 开发的,v3 是从 v2 开发的,v4 是从 v3 开发的

我正在使用pythonsvn command-line解压缩每个文件并使用其内容创建一个标签,但我不确定如何重新创建一个主干,在其历史记录中您可以看到代码如何从 v1 更改为 v4 到 v2 和 v3。

我需要以编程方式执行此操作,因为我们在多个项目中存在相同的问题,而且我们没有时间手动合并或处理冲突,因此脚本必须无人看管。

我正在尝试这个:

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 树干中与最后一个标签进行比较时,我发现它们有一些差异

4

1 回答 1

0

我不会帮助使用 python 脚本,但这些步骤应该很容易自动化:

  1. 创建project目录并将文件解压缩project_v1.zip到其中。
  2. 将目录中的所有内容添加到 svn ( svn add *) 并提交到主干。
  3. 从主干创建v1标签。
  4. project目录中删除除.svn目录之外的所有内容并将文件解压缩project_v2.zip到其中。
  5. 您需要添加所有未版本控制的文件并从存储库中删除所有丢失的文件。您可以使用这些命令来发挥作用,或者只是浏览svn status输出并在 python 中逐个运行svn add或运行每个文件(请参阅SVN 中的结果代码是什么意思?)。svn delete
  6. 提交对主干的更改并创建v2标签。
  7. 转到第 4 步并重复,直到添加每个项目版本。

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

于 2018-04-25T16:48:07.503 回答