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

rab*_*ens 5 svn git

我基本上遵循方法将旧的很大的SVN存储库迁移到git。这不能按预期方式工作。这是我居住在~/git/old_svn_repo(有git svn但没有--no-metadata)的结帐示例摘录:

remotes/origin/trunk
remotes/origin/branchX
remotes/origin/branchY # and many more
Run Code Online (Sandbox Code Playgroud)

下一步是步骤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
Run Code Online (Sandbox Code Playgroud)

这给了我很多输出

* [new branch]      origin/trunk -> origin/trunk
* [new branch]      origin/foo-> origin/foo
* [new branch]      origin/bar-> origin/bar
Run Code Online (Sandbox Code Playgroud)

接下来是步骤5,您应该将其重命名trunkmaster

cd ~/git/new-bare.git
git branch -m trunk master
Run Code Online (Sandbox Code Playgroud)

问题开始于此:

我输入:

git branch -m trunk master
Run Code Online (Sandbox Code Playgroud)

我得到:

error: refname refs/heads/trunk not found
fatal: Branch rename failed
Run Code Online (Sandbox Code Playgroud)

这样做git branch -a显示所有分支均以开头origin/

我在这里做错了什么,我该怎么做?

小智 5

在几次尝试失败之后(我遇到了同样的问题,在refs / remotes路径中有一个名为origin的额外目录。)我对此进行了细微调整。

git config remote.bare.push 'refs/remotes/origin/*:refs/heads/*'
Run Code Online (Sandbox Code Playgroud)

另外,在create .gitignore步骤中,我使用了:

git svn show-ignore -i origin/trunk > .gitignore
Run Code Online (Sandbox Code Playgroud)

哪个按预期工作。

我不确定额外来源目录的来源,但这些mod对我有用。


rab*_*ens 2

在深入研究了一些之后,我发现了这个问题,以及 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/*
Run Code Online (Sandbox Code Playgroud)

噗,所有内容都按预期出现在我的 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:要将 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
Run Code Online (Sandbox Code Playgroud)