繁体   English   中英

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

[英]Wrong(?) branch prefixes migrating SVN to Git

我基本上按照这个方法将一个旧的,非常大的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/为前缀。

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

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

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

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

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

这是按预期工作的。

我不确定额外的起源dir在哪里,但这些mods对我有用。

在深入挖掘SO之后,我发现了这个问题 ,以及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

仅供参考,因为你正在使用不同版本的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可能使用的更老的git。 更改refspec以添加“/ origin /”对我来说很好。 另一种方法是使用旧版本的git。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM