如何将本地Git仓库导入到SVN?

15

我正在使用本地 Git 仓库,并且需要将本地 Git 推送到现有的 SVN 仓库。我的 Git 仓库是纯本地 Git 仓库,它没有使用git svn clone进行初始化。

如何将此本地 Git 仓库导入 SVN?

最好的情况是将 Git 历史记录导入 SVN。

目前 SVN 仓库的结构如下:

https://svnrepohost
           /branches
           /tags
           /trunk
                  /projectA
                  /projectB
                  /newProject

我需要将我的git仓库导入到https://svnrepohost/trunk/newProject中,假设newProject文件夹为空。


远程Subversion仓库已经存在,还是你想从本地Git仓库创建一个新的Subversion仓库? - me_and
远程Subversion仓库已经存在。 - DJ.
那么您希望它如何进入Subversion存储库?新分支?覆盖主干?关于历史记录:您是否希望将Git repo的完整历史记录保存到Subversion分支中,还是只保存当前状态? - me_and
它将覆盖主干项目。最好保留Git的完整历史记录。我更新了问题以澄清问题。 - DJ.
4个回答

28

我通过以下步骤最终解决了这个问题:

  1. 在svn中设置适当的项目文件夹以便导入,例如 http://svnrepo/svn/trunk/newProject

  2. 创建一个新的git-svn存储库

    git svn clone http://svnrepo/svn/trunk/newProject

  3. 将要导入为 remote 的git存储库添加到 新的 git-svn存储库中

    git remote add origin ../original-git-repo

  4. 从原始git存储库中获取所有数据

    git pull origin master --allow-unrelated-histories

  5. 将本地存储库与svn进行rebase操作

    git svn rebase

  6. 将更改提交到svn

    git svn dcommit

  7. 清理远程仓库

    git remote delete origin


2
工作得很好,不过我认为第七步应该是git remote remove origin。 - roryWoods
点2总是在我运行git svn的路径中创建一个新的Project文件夹。在第3项中,你所说的../是指你的git仓库比当前路径高一级吗?你在运行第3项之前是否已经CD到了你的svn仓库?在第5步中,我遇到了错误无法从工作树历史记录中确定上游SVN信息 - AaA
1
工作得非常好!但是我必须在第四步执行 git pull --allow-unrelated-histories origin master,否则 git 将拒绝合并不相关的历史记录。我在我的 SVN 存储库中有一个初始提交,也许这就是原因。 - dsteinhoefel

1

最简单的方法是只需使用svn import导入Git目录。但这样会丢失您的Git提交历史记录。

首先,请确保通过在Subversion配置文件中设置global-ignores来防止导入.git目录。打开您的~/.subversion/config文件(在Windows上可能类似于C:\Users\username\.subversion\config),找到以[miscellany]开头的部分,并在下面直接添加以下内容:

global-ignores = .git

(如果您已经有一行带有global-ignores =的代码,且该行前面没有#,那么只需在该行末尾添加.git即可。)

接下来,请运行以下命令:

svn import <path-to-local-git-repository> https://svnrepohost/trunk/newProject

这将会精确地将本地 Git 仓库的内容复制到您想要的服务器上。


我认为,如果这个解决方案将失去所有提交历史记录,那么它就相当于下载git的本地副本,将这些文件复制到svn的本地副本中并提交svn。我也喜欢保留提交历史记录(每个版本中文件的更改),这非常重要。 - AaA

0

你可以使用SubGit

$ svnadmin create repo.svn
$ subgit configure repo.svn                                                                                                                                                              

...                                                                                                                                                                           

            CONFIGURATION SUCCESSFUL                                                                                                                                                                                   

            Adjust '/tmp/repo.svn/conf/subgit.conf' file                                                                                                                                                               
            and then run                                                                                                                                                                                               
                subgit install "repo.svn"                                                                                                                                                                              
            to complete SubGit installation.
$ nano repo.svn/conf/subgit.conf #edit to set git.default.repository=path/to/your/bare/git/repository
$ subgit install repo.svn

我还建议您创建一个 Git 仓库的裸克隆,并指定其路径(在 git.default.repository 中),而不是使用原始仓库。例如:
$ git clone --bare path/to/your/original/repository path/to/your/bare/git/repository

在执行“subgit install”命令后,存储库(repo.svn和repo.git)将处于持续同步状态(由Git中的pre-receive钩子[在推送到您的裸存储库时启动]和SVN中的pre-commit触发)。要停止同步,可以运行

$ subgit uninstall repo.svn

我快速浏览了SubGit网站,你知道如何在现有的SVN仓库中使用SubGit吗?假设我们没有对SVN仓库的管理员访问权限。 - DJ.
为了将SubGit安装到svn或git仓库中,需要拥有管理员访问权限。 - vadishev

0
  • git svn克隆 http://svnrepo/svn/trunk/newProject
  • git remote add origin ../original-git-repo
  • git fetch origin
  • git checkout -b lmaster remotes/origin/master
  • git rebase master
  • git svn更新补丁
  • git svn提交

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