Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将git存储库与svn存储库重新连接?_Git_Svn - Fatal编程技术网

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

如何将git存储库与svn存储库重新连接?,git,svn,Git,Svn,我使用gitsvn将现有的Subversion repo导入git。然后我将其推送到git服务器上的git repo。在过去的几个月里,Subversion和git存储库都对软件进行了更改。不幸的是,我的本地副本与svn和git之间的链接已被删除 我曾尝试再次使用git svn重新创建本地副本,但当我从git服务器拉取时,它会抱怨警告:没有常见冲突,我最终合并了两个单独的分支,并在开始时提交了相同的内容。像这样: F |\ | \ E D | | C C | | B B | | A

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

我曾尝试再次使用
git svn
重新创建本地副本,但当我从git服务器拉取时,它会抱怨
警告:没有常见冲突
,我最终合并了两个单独的分支,并在开始时提交了相同的内容。像这样:

F
|\
| \
E  D
|  |
C  C
|  |
B  B
|  |
A  A
我如何才能让它像对待原始回购的分支一样对待svn变化

F
|\
| \
E  D
| /
|/
C
|
B
|
A

首先,我要检查
git svn info
命令的输出。你在那里看到一些奇怪的东西吗

其次,将
gitsvn
与本地以外的第二个git存储库一起使用不是一个好主意

原因是在每次
git svn dcommit
git自动重写之前所做的所有提交之后:首先将它们提交回svn,然后为提交添加svn修订号(在一个名为
git svn id
的唯一标识符中)

在您创建新的
dcommit
的存储库中应该是这样的:

$ git log -1
commit 1234abc...
Author: ...
Date:   ...

Some commit message

git-svn-id: http://your.svn.repo/svn/trunk@10 1234abc
关于细节,这里是一个例子

您编写的错误消息可能是
警告:没有常见的提交
(而不是您在问题中编写的
冲突
),我的印象是git没有将这些元数据推送到远程repo中

我认为你可以从死里复活这个SVN链接,但是要小心,把它放在repo的一个单独的克隆上,仔细阅读文档,了解它需要什么元数据。在git中,您可以使用管道工具做很多事情,看看它们

顺便说一句,你不能简单地克隆远程git repo并使用它吗

希望这能有所帮助,或者至少能给你一些想法,让你开始寻找解决方案。

从提交图开始

F
|\
| \
E   D
|   |
C1  C2
|   |
B1  B2
|   |
A1  A2
使用以下命令

git checkout <SHA1-B1>
git checkout -b new
git cherry-pick <SHA1-C2> <SHA1-D>
git checkout <SHA1-F>
git checkout -b position_f
git merge new
git签出
git签出-b新
吉特樱桃采摘
git签出
git签出-b位置\u f
git合并新

完成了。不管怎样,我还没试过。首先备份存储库。

最简单的解决方案是将本地git svn分支推送到git服务器,如下所示:

git推送:

它将用本地分支覆盖git服务器分支

只有当您确定git svn分支拥有git server的所有提交时,才可以这样做。

这样如何:

  • 备份
  • 将svn历史重新导入git
  • 将旧分行和新分行纳入同一回购协议
  • 将分支倒回提交之前的
    F
  • 在新导入的svn上重新设置分支中自
    C
    以来的所有更改的基础
    C
  • 重新尝试合并

如果这不起作用,您可以尝试,但这可能不是一个好主意。

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

如果是这样,您实际上没有丢失任何链接,git svn应该能够从历史中恢复必要的数据。尽管由于git svn不同版本之间存在一些兼容性问题,这可能有点棘手:

  • 克隆原始Git存储库:

    $ git clone $GIT_SERVER repo
    $ cd repo
    
  • 在.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/*
    
  • 现在,您必须使用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...
    
    正如您所看到的,commit D没有git svn id行,但commit C有一行,该行引用trunk,因此您必须更新refs/remotes/trunk以提交C:

    $ git update-ref refs/remotes/trunk 4df9f21346526c6505a954d8310637864710308d
    
  • 如果您有多个分支和标记,请针对上面指定的映射对它们重复相同的步骤:

    • 分支/foo=>refs/remotes/foo

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

  • 最后一步是恢复.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
    
  • 最后一个命令还从SVN服务器获取新修订。命令完成后,您将拥有Subversion存储库的git svn克隆。此存储库中的历史记录已发生分歧,因此您必须像往常一样同步SVN和Git存储库之间的更改:

    $ git svn rebase
    $ git svn dcommit
    

    希望这能有所帮助。

    谢谢,我没有研究过
    dcommit
    是如何工作的,所以我没有意识到这种配置(远程SVN和GIT repos)是个坏主意。在我的例子中,每个分支上只有少量的提交,所以我可以手工复制更改。我将把这个问题留待几天,看看是否有人有一个神奇的工具来修补这一切。当然,希望你能找到解决这个问题的办法!让我纠正我的理解,(A)是(F)之前的早期提交,对吗?您试图更改的是Git存储库,而不是subversion?没错,A在时间上先于F。我最关心的是git回购协议的所有变化。这对我来说很有效。但是,等号不应该出现在git config svn remote.svn.url=$svn_url行中。非常感谢!遵循此方法时,请确保步骤2的
    $SVN_URL
    与步骤3的输出真正匹配。在步骤2中,我意外地指定了
    https://
    而不是
    http://
    ,我想知道为什么这个过程没有成功。在分支上运行
    git filter branch…
    后,我能够再次
    git svn重设基础,这对我来说非常有用。我在我的svn远程配置中使用了大量的
    ——include路径
    ,这会导致大量的空提交