从版本化的ZIP重建SVN
我有不同版本的项目ZIP,例如:从版本化的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变化的 我需要以编程的方式来做这件事,因为我们在几个项目中遇到了同样的问题,我
- 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 Add*
)并提交到主干中v1
标记project
目录中删除除.svn
目录以外的所有内容,并将project\u v2.zip
中的文件解压缩到该目录中svn status
output,然后在python中为每个文件逐个运行svn add
或svn delete
(请参阅)v2
标记请注意,第2步和第3步与第4步、第5步和第6步相比是多余的,所以您可以跳过它-从空目录中删除所有内容是没有意义的,但python脚本不应该抱怨。:) 您是否尝试创建工作副本,将第一个版本解压缩到工作副本(需要svn添加),提交工作副本,解压缩下一个版本,将其复制到工作副本(可能需要svn添加),提交工作副本,等等?这还不够好,因为当您解压缩project_v2.zip到project_v1时,会添加或覆盖在v1和v2之间更改的文件,但不会删除在v1和v2之间删除的文件