社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  community wiki Valarpirai  »  全部回复
回复总数  1
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开头的超长命令提供一个>辅助提示。