我最初在SVN上有一个仓库repoA。我们称其为初始提交“ commit#1”。我对该仓库进行了多次提交,使我提交了3号代码。这时,我将SVN存储库复制到SVN上的新位置,并继续在复制的存储库B中进行开发。同时,我还继续致力于存储库A。
以下描述了SVN存储库的外观:
Repo A: 1-2-3-4a-5a-6a
\
Repo B: 4b-5b-6b
现在,我决定将两个存储库都移至Git。我的意图是克隆两个存储库,然后将它们重新加入到一个存储库中,将单独的提交保持为从上面的提交#3萌芽的独立分支。
因此,我执行了以下步骤:
git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repoA_svn/path repoA
git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repoB_svn/path repoB
cd repoA
git branch repoA-branch # Branch for first repo
git reset --hard <highest_common_hash> # To have only common history on master
git checkout -b repoB-branch # Branch for second repo
git pull ../repoB master
但是,一旦尝试执行拉操作,就会出现以下错误:
fatal: refusing to merge unrelated histories
当从SVN迁移时,由于我之前已移动repoB在SVN上的位置以将其与repoA分开,所以到repoA的链接丢失了。
因此,我从SVN迁移了两个Git仓库,如下所示:
Repo A: 1-2-3-4a-5a-6a
.
Repo B: 4b-5b-6b
如您所见,链接已断开,因此无关的历史记录错误。
鉴于我们缺少历史链接,有人知道如何将repoB的提交添加到repoA吗?
我在拉动过程中尝试了--allow-unrelated-histories开关,这使我可以添加repoB的提交,但是它们都被压缩为一个,我想保留这些提交的历史记录。
为了简单起见,not回到必须对svn做任何事情,我会这样做:
# create a new third repo
git init /home/myuser/blahblah
cd /home/myuser/blahblah
# add thr other two git repos as remotes
git remote add repo1 whatever-url-for-repo1
git remote add repo2 whatever-url-for-repo2
现在,这两个存储库中的每一个都有一个主机,对吗? repo2 / master是从repo1 / master的第三版开始的,对吧?
git checkout first-revision-of-repo2/master # checkout this revision by id
git reset --soft third-revision-of-repo2/master # this revision is also by its id
git commit -m "Same comment as repo2/4b"
至此,您已经创建了4b'。与4b的content相同but它的父级为修订版3
# now we roll all the other revisions from 4b to the tip of repo2/master
git cherry-pick revision-4b..repo2/master
至此,您现在拥有新分支上的repo2 / master的历史记录(仍未命名,您正在使用分离的HEAD),它与repo1 / master有关,因为它原本应该存在。玩得开心。