我尝试使用“git svn ...”将颠覆回购转换为git
(来自http://john.albin.net/git/convert-subversion-to-git的指南)
不幸的是“git svn create-ignore”不起作用:
config --get svn-remote.svn.fetch :refs/remotes/git-svn$: command returned error: 1
如何获取 .gitignore 文件的 svn:ignore 属性?
我尝试使用“git svn ...”将颠覆回购转换为git
(来自http://john.albin.net/git/convert-subversion-to-git的指南)
不幸的是“git svn create-ignore”不起作用:
config --get svn-remote.svn.fetch :refs/remotes/git-svn$: command returned error: 1
如何获取 .gitignore 文件的 svn:ignore 属性?
回答我自己的问题。
我写了一个小脚本。您需要旧的 SVN 目录和新的 git 目录:
#!/usr/bin/python
import os, sys, subprocess
svn_dir=sys.argv[1].rstrip('/') # usage: python ... svn_dir git_dir
if not os.path.exists(os.path.join(svn_dir, '.svn')):
print 'Not a svn-dir:', svn_dir
sys.exit(1)
git_dir=sys.argv[2].rstrip('/')
if not os.path.exists(os.path.join(git_dir, '.git')):
print 'Not a git-dir:', git_dir
sys.exit(1)
for root, dirs, files in os.walk(svn_dir):
dirs[:]=[d for d in sorted(dirs) if not d in ['.svn']]
pipe=subprocess.Popen(['svn', 'propget', 'svn:ignore', root],
stdout=subprocess.PIPE)
git_ignore_lines=[]
for line in pipe.stdout.readlines():
line=line.strip()
if not line:
continue
git_ignore_lines.append(line)
if not git_ignore_lines:
continue
git_ignore_dir=os.path.join(git_dir, root[len(svn_dir)+1:])
if not os.path.exists(git_ignore_dir):
os.makedirs(git_ignore_dir)
git_ignore=os.path.join(git_ignore_dir, '.gitignore')
if os.path.exists(git_ignore):
old=open(git_ignore).read().split()
else:
old=[]
old.extend(git_ignore_lines)
fd=open(git_ignore, 'wt')
seen=set()
for line in old:
if line in seen:
continue
fd.write('%s\n' % line)
seen.add(line)
fd.close()
print 'wrote', git_ignore