从Git迁移到具有完整历史记录的SVN 尝试1:将git svn提交到空白svn存储库尝试#2:git svn提交到具有基本结构主干/标签/分支的仓库尝试#3:使用GitHub的SVN桥尝试#4:在SVN中进行初始提交,然后从那里进行提交

问题描述

我有一个独立的Git存储库,我想将其迁移到新的SVN存储库。至少,我想迁移具有完整历史记录的master分支,但理想情况下,我想迁移所有分支和标签。我只需要进行一次迁移;我不需要重复此过程或进行任何双向同步或类似的操作。

根据我在网上可以找到的信息,最好的工具似乎是git-svn。我觉得我似乎遗漏了一些明显的东西,git svn initgit svn dcommit需要传递一些参数,这会使所有这些工作正常,但我找不到它。 / p>

到目前为止,这是我所做的尝试:

尝试1:将git svn提交到空白svn存储库。

[dyaw@localhost v1]$ mkdir svngit ; cd svngit
[dyaw@localhost svngit]$ git svn init svn://server/emptyRepo --stdlayout
Initialized empty Git repository in /home/dyaw/stackoverflow/v1/svngit/.git/
[dyaw@localhost svngit]$ git svn fetch
[dyaw@localhost svngit]$ git config receive.denyCurrentBranch ignore
[dyaw@localhost svngit]$ cd ..
[dyaw@localhost v1]$ git clone /mnt/sharedDrive/sharedRepo/ plaingit
Cloning into 'plaingit'...
done.
[dyaw@localhost v1]$ cd plaingit/
[dyaw@localhost plaingit]$ git remote add svntest /home/dyaw/stackoverflow/v1/svngit
[dyaw@localhost plaingit]$ git branch -a | grep remotes/origin | grep -v -- '->' | cut -d/ -f3 | xargs -L1 git checkout
Branch 'Foo' set up to track remote branch 'Foo' from 'origin'.
Switched to a new branch 'Foo'
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
[dyaw@localhost plaingit]$ git push svntest --all
Enumerating objects: 2719,done.
Counting objects: 100% (2719/2719),done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2591/2591),done.
Writing objects: 100% (2719/2719),4.67 MiB | 18.55 MiB/s,done.
Total 2719 (delta 2011),reused 237 (delta 123)
remote: Resolving deltas: 100% (2011/2011),done.
To /home/dyaw/stackoverflow/v1/svngit
 * [new branch]      Foo -> Foo
 * [new branch]      master -> master
[dyaw@localhost plaingit]$ git push svntest --tags
Enumerating objects: 8,done.
Counting objects: 100% (8/8),done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8),done.
Writing objects: 100% (8/8),1.32 KiB | 1.32 MiB/s,done.
Total 8 (delta 0),reused 0 (delta 0)
To /home/dyaw/stackoverflow/v1/svngit
 * [new tag]         Many tags pushed
[dyaw@localhost plaingit]$ cd ../svngit/
[dyaw@localhost svngit]$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    Every single file in the repository

[dyaw@localhost svngit]$ git reset --hard
HEAD is now at 3161afd
[dyaw@localhost svngit]$ git status
On branch master
nothing to commit,working tree clean
[dyaw@localhost svngit]$ git svn dcommit
Unable to determine upstream SVN information from HEAD history.
Perhaps the repository is empty. at /usr/libexec/git-core/git-svn line 872.
  • “也许存储库为空。”是的,肯定是空的。到此为止,我目前在SVN中的内容为零,我需要将所有工作移到那里。
  • 这是一个完全空的SVN存储库。甚至没有trunk / tags / branches目录。

尝试#2:git svn提交到具有基本结构(主干/标签/分支)的仓库。

  • 基本结果相同。
  • 新创建的svngit工作副本中git svn fetch的输出为:
    [dyaw@localhost svngit]$ git svn fetch
    r1 = 81aad897c91af332c969ece7655a86f8f670bfec (refs/remotes/origin/trunk)
    Checked out HEAD:
      svn://server/basicRepo/trunk r1
    
  • 第一个git push svntest --all失败,并显示“更新被拒绝,因为远程包含您在本地没有的工作。这通常是由另一个存储库推送到相同的引用引起的。您可能要先集成远程更改(例如“ git pull ...”),然后再次按下。”。完成git pull svntest master --allow-unrelated-histories并提交合并后,推送成功。
  • 最后,git svn dcommit给出了关于空存储库的相同错误。

尝试#3:使用GitHub的SVN桥

  • 可以通过SVN访问GitHub上的Git存储库。
  • 我将Git存储库推送到了GitHub,并且能够从SVN访问它。 (svn co https://github.com....
  • 通常,svnrdump能够转储给定URL的SVN存储库(与svnadmin dump相对,后者需要作为本地文件系统中的文件提供给存储库),但是svnrdump返回{{ 1}}
  • 我可以svnrdump: E200007: The requested report is unknown.进行一个修订。任何修订似乎都可以使用,但是指定svnrdump dump -r或修订范围(--incremental或所有默认设置)会导致报告该错误。
  • 显然,GitHub的SVN通过HTTPS实现不包括对增量转储的支持。
  • 我可以通过HEAD进行1的非增量转储,但是我不知道有什么方法可以将这些连续的非增量转储转回增量,以使其具有完整的历史记录。

尝试#4:在SVN中进行初始提交,然后从那里进行提交

根据Jeff Mercado的answer

在执行所有git svn之前,我在SVN的主干中创建了一个空文件。我第一次使用dcommit链接到SVN,但实际上并没有在初始分支上提交任何内容,然后在切换到另一个分支以及切换回master时给出了错误。当我重复这些步骤以捕获要在此处发布的输出时,它立即给出了错误。回顾命令历史,我看不出有什么不同。无论如何,我仍然无法放弃。

-r 1:2

解决方法

要使git-svn正常工作,必须首先与现有svn存储库同步,这样它才能知道当前的修订版本,并可以创建新的提交。如果存储库完全空白且没有初始提交,则无法与之同步。

您应该在SVN存储库中创建一个空白的初始提交,然后从那里进行同步和dcommit。


否则,如果您坚持要与空白svn仓库同步,​​则可以尝试手动更新ref,使其看起来像是基本的svn提交。然后,当您执行dcommit时,git-svn将看到“假基本提交”,并将您的更改作为svn提交进行提交。唯一的警告是,您将必须基于此空提交来重新构建您的存储库。我什至不确定SVN信息库是否会接受提交。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...