我基本上遵循此方法将旧的很大的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,您应该将其重命名trunk为master:
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对我有用。
在深入研究了一些之后,我发现了这个问题,以及 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)
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |