svn2git объединяются в репо
У меня очень странная проблема с конвертером svn2git.
У меня есть 2 репозитория SVN (оба SVN 1,7 и разработаны в Windows). Я создал скрипт python3 для автоматической синхронизации репозиториев и отправки его на наш сервер gitlab каждый день (конвертер запускается на виртуальном экземпляре Ubuntu). Все работает просто отлично, но сегодня я вижу, что мои репо испорчены. Первый репо содержит контент из второго репо, а второй репо содержит контент из первого репо. Как это могло быть???
У кого-нибудь есть такая проблема с svn2git? Кто-нибудь знает хороший инструмент для автоматической проверки репо за коммит (svn vs git), чтобы быть уверенным, что каждый коммит просто хорош?
Редактировать: Вот скрипт, который я использую (он немного хакерский:-))
# convert.py
import os,sys,subprocess
__filedir = os.path.dirname(os.path.realpath(__file__))
__migratescript = os.path.join(__filedir,"svn2git_repo/bin/svn2git")
__authors = os.path.join(__filedir,"authors.txt")
__repodir = os.path.join(__filedir,"repos")
class CurDirScope:
def __init__(self,newdir):
self.newdir = newdir
self.olddir = os.getcwd()
def __enter__(self):
self.__chdir((self.newdir))
def __exit__(self,type,value,traceback):
self.__chdir(self.olddir)
def __chdir(self,dir):
if(os.path.exists(dir)):
print("change current directory to {0}".format(dir))
os.chdir(dir)
def gitSVNClone(directory,repo):
dir = os.path.join(__repodir,directory)
print("try clone {0} to {1}".format(repo,dir))
gitpath = os.path.join(dir,".git")
if(os.path.exists(gitpath)):
raise Exception("repo directory does already exists {}".format(gitpath))
print("create directory {0}".format(dir))
os.makedirs(dir)
with CurDirScope(dir) as scope:
cmd = ["svn2git",repo,"--authors=" + __authors]
print("start git svn clone")
rc=subprocess.call(cmd)
print("end of clone")
if(rc != 0):
raise Exception("git svn clone failed - rc: {0}".format(rc))
def syncRepo(directory):
dirs = []
if(directory == "all"):
dirs = os.listdir(__repodir)
else:
dirs =[directory]
if(len(dirs) <= 0):
print("nothing to sync")
return
errors = []
for dir in dirs:
try:
absdir = os.path.join(__repodir,dir)
if(os.path.exists(absdir) == False):
raise Exception("directory does not exists '{0}'".format(absdir))
print(absdir)
with CurDirScope(absdir) as scope:
cmd = ["svn2git","--rebase","--authors=" + __authors]
print("start git repo sync {0}".format(absdir))
print(str(cmd))
rc=subprocess.call(cmd,shell=False)
print("end of sync")
if(rc != 0):
raise Exception("rebase repo failed - rc: {0}".format(rc))
except BaseException as ex:
errors.append(str(ex))
if(len(errors) > 0):
print("# Error: ")
for msg in errors:
print(msg)
raise Exception("{0} error(s) happend".format(str(len(errors))))
def pushRepo(directory,TagsOnly=False):
dirs = []
if(directory == "all"):
dirs = os.listdir(__repodir)
else:
dirs =[directory]
if(len(dirs) <= 0):
print("nothing to push")
return
pushcommand = "--all"
if(TagsOnly):
pushcommand = "--tags"
errors = []
for dir in dirs:
try:
absdir = os.path.join(__repodir,dir)
if(os.path.exists(absdir) == False):
raise Exception("directory does not exists '{0}'".format(absdir))
print(absdir)
with CurDirScope(absdir) as scope:
cmd = ["git","push","origin",pushcommand]
print("start git repo push to origin '{0}'".format(absdir))
print(str(cmd))
rc=subprocess.call(cmd,shell=False)
print("end of push")
if(rc != 0):
raise Exception("push repo {0} failed - rc: {1}".format(dir,rc))
except BaseException as ex:
errors.append(str(ex))
if(len(errors) > 0):
print("# Error: ")
for msg in errors:
print(msg)
raise Exception("{0} error(s) happend".format(str(len(errors))))
if __name__ == "__main__":
try:
args = sys.argv[1:]
print(str(args))
al = len(args)
if(al <= 0):
raise Exception("not enough arguments")
cmd = args[0]
args = args[1:]
al = len(args)
if(os.path.exists(__repodir) == False):
os.makedirs(__repodir)
if(cmd == "clone"):
if(al < 2):
raise Exception("not enough arguments for clone")
dir = args[0]
repo = args[1]
gitSVNClone(dir,repo)
elif(cmd == "sync"):
if(al < 1):
raise Exception("not enough arguments for sync")
dir = args[0]
syncRepo(dir)
elif(cmd == "push" or cmd == "pushtags"):
if(al < 1):
raise Exception("not enough arguments for sync")
tagsonly = False
if(cmd == "pushtags"):
tagsonly = True
dir = args[0]
pushRepo(dir,tagsonly)
else:
raise Exception("unknown command '{0}'".format(cmd))
except BaseException as ex:
if(ex == None):
ex = "internal error"
print("Error: {0}".format(str(ex)))
sys.exit(1)
пример клона:
python3 convert.py clone MyLocalDir http://mysvnrepopath
Он клонирует мое svn-repo в мой каталог local-repo (где хранятся все преобразованные репо) с именем локального каталога MyLocalDir
пример синхронизации:
python3 convert.py sync all
параметр all синхронизирует все репо в моем репо-каталоге. Я мог бы также использовать имя каталога вместо MyLocalDir, но я использовал 99% параметр all
толчок пример:
python3 convert.py push all
Пример pushtags:
python3 convert.py pushtags all
Привет тонка