将两个svn路径迁移到新的单个git存储库

将两个svn路径迁移到新的单个git存储库,git,svn,git-svn,Git,Svn,Git Svn,我正试图计划在这个周末完成从SVN到git的迁移,并且正在努力迁移我们所有的历史 我们的代码目前在SVN中为 我可以通过以下方式获得我们想要的大部分: git svn init http://server/svn/repos/projectName/trunk/ --no-metadata git config svn.authorsfile users.txt git svn fetch 我们正在永久迁移到git,并且还没有对任何修订号的引用,因此——没有元数据,我们也不关心迁移分支 这在很

我正试图计划在这个周末完成从SVN到git的迁移,并且正在努力迁移我们所有的历史

我们的代码目前在SVN中为

我可以通过以下方式获得我们想要的大部分:

git svn init http://server/svn/repos/projectName/trunk/ --no-metadata
git config svn.authorsfile users.txt
git svn fetch
我们正在永久迁移到git,并且还没有对任何修订号的引用,因此——没有元数据,我们也不关心迁移分支

这在很大程度上是可行的,但是我们的项目最初是在

存储库包含其他几个项目,我们只对迁移一个项目感兴趣。 有没有一种方法可以创建新的git存储库,其中包含来自的提交,然后是

我知道这行不通,但它表明了我想要实现的目标:

git svn init http://server/svn/repos/trunk/oldProjectName
git config svn.authorsfile users.txt
git svn fetch
git svn init http://server/svn/repos/trunk/oldProjectName
git svn fetch
我相信答案在于手动创建两个遥控器,一个用于旧的svn路径,另一个用于新的svn路径。我设法做到了这一点,并且认为下一步需要在一个基础上对另一个基础进行重定


(虽然我使用的是windows,但如果需要,我仍然能够使用bash)

进行一次性迁移
git svn
不是转换存储库或存储库部分的正确工具。如果您想将Git用作现有SVN服务器的前端,那么它是一个很好的工具,但是对于一次性转换,您应该不要使用
Git SVN
,而是
svn2git
,它更适合此用例

有很多工具称为
svn2git
,最好的工具可能是来自的KDE工具。我强烈建议使用
svn2git
工具。这是我所知道的最好的一款,它的规则文件非常灵活

您将能够轻松地配置
svn2git
s规则文件,以从当前的SVN布局中生成所需的结果,包括可能存在的任何复杂历史,包括从一个SVN回购中生成多个Git回购,或将不同的SVN回购干净地组合到一个Git回购中

如果您不是100%了解存储库的历史记录,
svneverever
from是在将SVN存储库迁移到Git时调查其历史记录的一个很好的工具


尽管
git svn
更容易开始,但以下是使用KDE
svn2git
而不是
git svn
更优越的原因,除了它的灵活性之外:

  • 通过
    svn2git
    (如果使用了正确的历史记录),可以更好、更清晰地重建历史记录,对于具有分支和合并等更复杂的历史记录尤其如此
  • 这些标记是真实的标记,而不是Git中的分支
  • 使用
    git svn
    时,标记包含一个额外的空提交,这也使得它们不是分支的一部分,因此正常的
    fetch
    将不会获取它们,直到您将
    --tags
    交给命令,因为默认情况下,也只获取指向已获取分支的标记。使用正确的svn2git标记就可以找到它们所属的位置
  • 如果您更改了SVN中的布局,您可以使用
    svn2git
    轻松配置它,使用
    git SVN
    您最终将丢失历史记录
  • 使用
    svn2git
    还可以轻松地将一个SVN存储库拆分为多个Git存储库
  • 或者将同一SVN根目录中的多个SVN存储库轻松组合到一个Git存储库中
  • 使用正确的
    svn2git
    比使用
    git svn

你看,有很多原因导致
git svn
更差,而KDE
svn2git
更优越。:-)

我不知道问题的
gitsvn
部分;从你所说的来看,我不清楚你是否已经成功地将承诺纳入单一回购协议,只是需要将历史缝合在一起,还是仍在努力将其纳入单一回购协议

在一次回购中获得承诺

可能有更有效的方法(同样,我也不知道git svn),但最坏的情况是,您可以将第二个svn回购导入第二个git回购,然后将第二个git回购设置为第一个上的远程:

git remote add oldproject ../oldproject
git fetch
那你应该

A --- B --- C <--(master)

X --- Y --- Z <--(oldproject/master)
请记住,在选择
$graft id
(“最近”历史记录的根提交)和
$commit id
(“旧”历史记录的头提交)时,如果历史记录重叠,您可能需要进行相应调整。例如,如果你有

D' --- E' --- F --- G --- H <--(master)

A --- B --- C --- D --- E <--(oldproject/master)
D'--E'--F--G--H
D' --- E' --- F --- G --- H <--(master)

A --- B --- C --- D --- E <--(oldproject/master)