背景
我们有一个包含多个项目的 SVN 存储库:
ROOT
- Project1
- trunk
- Project2
- trunk
..ETC
然后我们开始迁移到 git。我们设置subgit以保持 SVN 和 GIT 存储库同步(双向)。几个月以来,我们有一些开发人员使用 svn 和一些使用 git,显然没有任何问题。
上面的每个项目都变成了一个 git 存储库,其中 subgit 配置为:
trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
tags = tags/*:refs/tags/*
shelves = shelves/*:refs/shelves/*
到目前为止,一切都很好。从现在开始,让我们关注Project1 。
问题
我注意到最近在 svn 中完成的一些提交没有移植到 git。查看 svn 端的日志,我发现这些提交在 svn 中也处于“不一致”状态(日志部分匿名):
$ svn log -v Project1
------------------------------------------------------------------------
r6109 | user1 | 2015-01-13 12:47:43 +0100 (di, 13 jan 2015) | 1 line
Changed paths:
R /Project1/trunk (from /Project1/trunk:5477)
Branch '/trunk' replaced from /trunk:5477
------------------------------------------------------------------------
r6089 | user2 | 2015-01-08 13:46:27 +0100 (do, 08 jan 2015) | 1 line
Changed paths:
M /Project1/trunk/src/com/....
-- fix xyz
------------------------------------------------------------------------
r5978 | user2 | 2014-12-26 21:30:28 +0100 (vr, 26 dec 2014) | 4 lines
Changed paths:
M /Project1/trunk/src/com/...
-- fix abc
------------------------------------------------------------------------
[ ... more commits ... ]
------------------------------------------------------------------------
r5477 | user2 | 2014-10-16 17:07:25 +0200 (do, 16 okt 2014) | 1 line
Changed paths:
M /Project1/trunk/src/com/...
-- fix bug23
现在,最后一次提交 r6109 看起来很吓人。好像说当前主干已经被r5477覆盖了。
实际上,主干文件夹的日志完全错过了两者之间的修订:
$ svn log -v Project1/trunk
------------------------------------------------------------------------
r6109 | user1 | 2015-01-13 12:47:43 +0100 (di, 13 jan 2015) | 1 line
Changed paths:
R /Project1/trunk (from /Project1/trunk:5477)
Branch '/trunk' replaced from /trunk:5477
------------------------------------------------------------------------
r5477 | user2 | 2014-10-16 17:07:25 +0200 (do, 16 okt 2014) | 1 line
Changed paths:
M /Project1/trunk/src/com/...
-- fix bug23
问题
我需要一些帮助来确定当前状态和可能的解决方案。
我认为已经发生的事情(请在这里帮助我!):
- 在某个时候,在同一源上使用 git 的开发人员使用 a
git reset --hard
将工作副本重置到本地 master 分支,该分支位于与 svn r5477 对应的提交处,并将其推送到远程 master。 - 这由 subgit 翻译,导致 svn 修订版 6109,上面写着“分支 '/trunk' 从 /trunk:5477 替换”
- 因为 git 存储库映射到
Project1/trunk
,所以已经用 r5477 重写了 - 但是,
Project1
subgit 甚至没有看到该文件夹,这解释了为什么历史记录Project1
仍然包含现在丢失的提交的日志(主干中的代码实际上回到了 r5477 修订版)。
谁能确认这很可能是当前状态?我还在忽略什么吗?我不知道 svn 可以让你(在这种情况下为 subgit)最终得到不一致的历史记录。
如果这是真的,任何人都可以建议最好的解决方案是什么?请注意,git 存储库没有那部分历史记录,因为它只同步Project1/trunk
而不是Project1
. 我觉得这应该在 svn 存储库中修复。但我不知道怎么做。
以下是可能的解决方案吗?
$ cd Project1
$ svn merge -rHEAD:6089 .
$ svn ci
警告和/或更好的建议有人吗?