如何将git存储库与svn存储库重新连接?

aln*_*h29 19 svn git

我曾经git svn将现有的Subversion repo导入git.然后我把它推到git服务器上的git repo.在过去几个月中,Subversion和git存储库都对软件进行了更改.不幸的是,我的本地副本与svn和git之间的链接已被删除.

我曾尝试git svn再次使用本地副本,但是当我从git服务器执行拉取时它抱怨warning: no common conflicts并且我最终在开始时合并两个单独的分支和相同的提交.像这样:

F
|\
| \
E  D
|  |
C  C
|  |
B  B
|  |
A  A
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它处理svn变化,就像它们发生在原始仓库的分支上一样?

F
|\
| \
E  D
| /
|/
C
|
B
|
A
Run Code Online (Sandbox Code Playgroud)

vad*_*hev 21

默认情况下git-svn,在提交消息中存储SVN修订版和Git提交之间的映射.您是否git-svn-id在原始Git存储库中看到了这些旧提交的行?这里我的意思是Git存储库托管在Git服务器上,而不是最近从SVN获取的那个.

如果是这样,你实际上没有松开任何链接,git-svn应该能够从历史记录中恢复必要的数据.虽然由于git-svn的不同版本之间存在一些兼容性问题,但这可能有点棘手:

  1. 克隆原始的Git存储库:

    $ git clone $GIT_SERVER repo
    $ cd repo
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更新.git/config中的git-svn配置:

    $ git config svn-remote.svn.url $SVN_URL
    $ git config svn-remote.svn.fetch trunk:refs/remotes/trunk
    $ git config svn-remote.svn.branches branches/*:refs/remotes/*
    $ git config svn-remote.svn.tags tags/*:refs/remotes/tags/*
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在你必须使用git-svn-id行更新refs/remotes/*refs到最新的提交:

    $ git log --first-parent refs/heads/master
    commit d566edf5f77ae0a2f7418c40949757e75ef8e83c
    D
    
    commit 4df9f21346526c6505a954d8310637864710308d
    C
    git-svn-id: $SVN_URL .../trunk@3...
    
    commit 116a6760d3e278aa4d54f5bb22e531d30d731661
    B
    git-svn-id: $SVN_URL .../trunk@2...
    
    commit d8bb201c6fd55ea5e645f2d8a07248593d177910
    A
    git-svn-id: $SVN_URL .../trunk@1...
    
    Run Code Online (Sandbox Code Playgroud)

    正如你所看到的,commit D没有git-svn-id行,但是commit C有一行而该行指的是trunk,所以你必须更新refs/remotes/trunk来提交C:

    $ git update-ref refs/remotes/trunk 4df9f21346526c6505a954d8310637864710308d
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果您有许多分支和标记,请针对我们上面指定的映射重复相同的步骤:

    • branches/foo => refs/remotes/foo

    • tags/1.0 => refs/remotes/tags/1.0

  5. 最后一步是恢复.git/svn目录中的映射:

    $ git svn fetch
    Migrating from a git-svn v1 layout...
    Data from a previous version of git-svn exists, but
        .git/svn
        (required for this version (X.Y.Z) of git-svn) does not exist.
    Done migrating from a git-svn v1 layout
    Rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89...
    r1 = d8bb201c6fd55ea5e645f2d8a07248593d177910
    r2 = 116a6760d3e278aa4d54f5bb22e531d30d731661
    r3 = 4df9f21346526c6505a954d8310637864710308d
    Done rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89
    
    Run Code Online (Sandbox Code Playgroud)

最后一个命令也从SVN服务器获取新的修订版.命令完成后,您有一个Subversion存储库的git-svn克隆.此存储库中的历史记录有所不同,因此您必须通常在SVN和Git存储库之间同步更改:

$ git svn rebase
$ git svn dcommit
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.