将Git仓库导出到SVN

13

使用git-svn将svn仓库克隆到git很容易。然而,我需要做相反的操作。

我有一个git仓库,想要将其导入到一个空仓库中(只有主干、分支和标签文件夹),并保留所有提交信息。

我创建了一个svn仓库的git-svn-clone,拉取了git主分支并提交了更改。然而,这时svn中唯一的提交信息是“merged from git”。

我还尝试了另一种方法:克隆了git仓库,并调用git svn init,但是git一直显示“无法确定上游SVN信息”。

是否有可能从git创建svn仓库?

谢谢, Michael

2个回答

12

以下是我发布一个Git仓库到SVN的步骤:

svn mkdir --parents http://host/path/to/repo/{trunk,tags,branches} \
    -m "Standard layout for $project"
git svn init -s http://host/path/to/repo/
git svn fetch
git rebase trunk master
git svn dcommit

Subversion无法保留提交时间或作者信息。如果你使用分支,那就自求多福吧。


在执行了rebase之后,Git报告说这两个仓库现在已经严重分歧。应该怎么做才能纠正这个问题? - Ken Williams

6
当从其他仓库拉取主分支时,Git会创建一个合并提交,因为没有共同的历史记录。
你应该使用git pull --rebase(它会重新创建提交并更改提交ID),然后再执行dcommit。
你也可以尝试以下操作:
首先使用SVN提交初始版本(只需创建这些分支、标签、主干文件夹并提交),然后创建一个Git SVN克隆(git svn -s clone svn://...)。
然后执行以下命令:
# create a ref to your "svn" commit
git checkout -b svn
# get all your "git" commits
git fetch $your_remote_git_repo
# create a ref to your "git" commit
git branch master FETCH_HEAD
# rebase the rest your git commits
git rebase svn master
# commit to svn!
git svn dcommit

编辑 cherry pick 的必要性仅因为我快速设置的 Git 仓库只有空提交。


我尝试使用git pull --rebase命令,但它会破坏svn上游信息:

git svn clone -s <svn-url>

cd project

git pull --rebase git:project

git svn dcommit

无法从HEAD历史记录中确定上游SVN信息。 也许存储库是空的。在/usr/lib/git-core/git-svn line 517处。
- Michael Kowhan
首先尝试使用 SVN 创建一个虚拟提交。 - knittl
我不确定我理解你的意思:在 git svn clone 之后,我在 svn 中创建了一个测试提交。在 git pull --rebase 之后,我仍然可以 git svn fetch,但无法进行 dcommit。我考虑只是将其导入到 svn 中,忽略历史记录。 - Michael Kowhan
感谢您的支持。我刚通过在另一个分支上拉取git存储库并挑选所有53次提交到svn分支(master)中而完成了这个过程。之后,我成功进行了 git svn dcommit。 - Michael Kowhan
1
那么正确/首选的解决方案是什么?这里似乎有三个选项。 - Lachlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接