你需要安装
git
git-svn
从此链接中复制:http://john.albin.net/git/convert-subversion-to-git。
1. 获取所有Subversion提交者的列表
Subversion仅列出每个提交的用户名。Git的提交具有更丰富的数据,但在其最简单的形式下,提交作者需要有一个列出姓名和电子邮件地址。默认情况下,git-svn工具只会在作者和电子邮件字段中列出SVN用户名。但是通过一点点努力,您可以创建一个包含所有SVN用户及其相应的Git名称和电子邮件的列表。该列表可供git-svn使用,将普通svn用户名转换为正确的Git提交者。
从本地Subversion检出的根目录运行此命令:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
这将捕获所有日志信息,提取用户名,消除任何重复的用户名,对用户名进行排序,并将它们放入“authors-transform.txt”文件中。现在编辑文件中的每一行。例如,将以下内容转换为:
jwilkins = jwilkins <jwilkins>
把它转化为这样:
jwilkins = John Albin Wilkins <johnalbin@example.com>
2. 使用git-svn克隆Subversion库
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp
这将执行标准的 git-svn 转换(使用你在第一步创建的 authors-transform.txt 文件),并将 git 仓库放置在你的主目录下的“~/temp”文件夹中。
3. 将 svn:ignore 属性转换为 .gitignore
如果你的 svn 仓库正在使用 svn:ignore 属性,你可以轻松地使用以下命令将其转换为 .gitignore 文件:
cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'
4. 将仓库推送到裸的git仓库
首先,创建一个裸仓库,并将其默认分支与svn的“trunk”分支名称匹配。
git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk
然后将临时仓库推送到新的裸仓库。
cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
你现在可以安全地删除 ~/temp 仓库。
5. 将“trunk”分支重命名为“master”
你的主要开发分支将被命名为“trunk”,这与Subversion中的名称相匹配。您需要使用以下命令将其更名为Git的标准“master”分支:
cd ~/new-bare.git
git branch -m trunk master
6. 清理分支和标签
git-svn将所有Subversion的标签转换为Git中非常短的分支,格式为“tags/name”。您需要使用以下命令将所有这些分支转换为实际的Git标签:
cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
这一步需要输入一些文本。 :-) 但是,不用担心;您的Unix shell会为以git for-each-ref开头的超长命令提供一个>二级提示。