私信  •  关注

community wiki Valarpirai

community wiki Valarpirai 最近创建的主题
community wiki Valarpirai 最近回复了
9 年前
回复了 community wiki Valarpirai 创建的主题 » 如何将具有历史记录的SVN存储库迁移到新的Git存储库?

你必须安装

git
git-svn

从此链接复制 http://john.albin.net/git/convert-subversion-to-git .

1。检索所有Subversion提交者的列表

Subversion只列出每个提交的用户名。Gits提交有更丰富的数据,但最简单的是,提交作者需要列出姓名和电子邮件。默认情况下,git svn工具只会在author和email字段中列出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转换(使用在步骤1中创建的authors-transform.txt文件),并将git存储库放在主目录中的~/temp文件夹中。

三。转换svn:忽略属性到.gitignore

如果您的SVN repo使用的是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主干分支名称匹配。

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。将主干分支重命名为master

您的主要开发分支将被命名为主干,与它在Subversion中的名称相匹配。您需要使用以下命令将其重命名为Gits标准主分支:

cd ~/new-bare.git
git branch -m trunk master

6。清理树枝和标签

GitSvn将所有Subversion标签制作成格式为tags/name的Git中非常短的分支。您将希望使用以下方法将所有这些分支转换为实际的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开头的超长命令提供一个>辅助提示。