错误的(?)分支前缀将SVN迁移到Git

时间:2015-11-17 15:08:21

标签: git svn

我基本上跟着this howto将旧的,非常大的SVN存储库迁移到git。这不能按预期工作。以下是我在~/git/old_svn_repo结帐的示例摘录(使用git svn完成但没有--no-metadata):

remotes/origin/trunk
remotes/origin/branchX
remotes/origin/branchY # and many more

下一步是第4步,它似乎完美无瑕。我推到裸存储库(注意我使用了~/git/new-bare.git而不是~/new-bare.git):

git init --bare ~/git/new-bare.git
cd ~/git/new-bare.git
git symbolic-ref HEAD refs/heads/trunk
cd ~/git/old_svn_repo
git remote add bare ~/git/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

这给我带来了很多输出,比如

* [new branch]      origin/trunk -> origin/trunk
* [new branch]      origin/foo-> origin/foo
* [new branch]      origin/bar-> origin/bar

接下来是第5步,您应该将trunk重命名为master

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

问题出现了:

我输入:

git branch -m trunk master

我明白了:

error: refname refs/heads/trunk not found
fatal: Branch rename failed

执行git branch -a会显示所有分支都以origin/为前缀。

我在这里做错了什么,如何做到这一点?

3 个答案:

答案 0 :(得分:4)

在尝试了几次失败之后(我有同样的问题,在refs / remotes路径中有一个名为origin的额外目录。)我使用了这个小调整。

git config remote.bare.push 'refs/remotes/origin/*:refs/heads/*'

此外,在创建.gitignore步骤中,我使用了:

git svn show-ignore -i origin/trunk > .gitignore

按预期工作。

我不确定这个额外的原点来自哪里,但这些mod对我有用。

答案 1 :(得分:2)

在深入挖掘SO之后,我找到了this question,以及Pieter Breed的回答。所以我尝试了,从我克隆SVN存储库的目录:

cd ~/git/old_svn_repo
git remote add new_gitlab_server ssh://git@mygitlab.example.com/foo/bar.git
git push new_gitlab-server +refs/remotes/origin/*:refs/heads/*

和poof,一切都出现在我的Gitlab上,没有中间步骤创建一个本地裸仓库。

现在,“master”仍被称为“trunk”,这是正常的,但在第一个克隆上导致warning: remote HEAD refers to nonexistent ref, unable to checkout.,所以我做了以下内容:

git clone ssh://git@mygitlab.example.com/foo/bar.git
cd bar
git checkout trunk
git checkout -b master
git push -u origin master

似乎标签被转换为分支,但我们可以忍受。

编辑:将SVN标记分支转换为Git标记:

git for-each-ref --format='%(refname)' refs/heads/tags | cut -d / -f 4 |
while read ref
do
 git tag -a "$ref" -m "Tag: $ref" "refs/heads/tags/$ref";
 git branch -D "tags/$ref";
done

答案 2 :(得分:0)

仅供参考,这是因为您使用的是其他版本的git。当我运行git / 1.8.3.1时,git svn命令创建refs / remotes / trunk,但是当我运行git / 2.8.3时,它创建refs / remotes / origin / trunk。在这两个git版本之间的某个时刻,git svn功能已更改为在分支引用中添加“ / origin /”。

被引用的文章写于2010年。根据https://en.wikipedia.org/wiki/Git#Releases,2010年发布的git是git / 1.7,而git / 2.8是2016年发布的。因此,本文的作者使用了比OP可能正在使用什么。更改refspec以添加“ / origin /”对我来说很好。一种替代方法是使用旧版本的git。

当git svn命令完成时,您可以运行git show-ref来查看refspec。