从 SVN 将历史导入现有 Git 项目

Import history to existing Git project from SVN

有一个项目已经在 GitHub 上有一段时间了,但之前是从 svn 迁移过来的。最初迁移时,SVN 历史记录未携带到 Git。有什么办法可以在项目建立后copy/import/clone/move SVN history到Git?

这是可能的,但您会影响所有已经克隆存储库的用户。所以你必须先决定是否值得。

如果不是,只需在另一个 git 存储库中使用 git-svn 进行克隆,并将其保留在那里作为源代码历史...

如果您想更进一步,一旦检索到历史记录,将这个新存储库作为远程添加到您的实际存储库中并获取。

git fetch --all

完成后,您应该有一个不相交的历史记录。

然后,使用 'git replace' 将新存储库的第一次提交替换为您刚刚获取的分支的最后一次提交。

https://git-scm.com/docs/git-replace

最后,使用'git filter-branch',那肯定会改写历史。

您将不得不推送新的历史记录,例如:

git push origin --all

所有其他开发人员将不得不克隆或获取所有历史记录...并且会抱怨 ;-)

git-svn 不是 一次性转换存储库的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,这是一个很好的工具,但是对于一次性转换,您应该 而不是 使用 git-svn,但是svn2git 更适合这个用例。

有很多名为 svn2git 的工具,最好的可能是来自 https://github.com/svn-all-fast-export/svn2git 的 KDE。我强烈建议使用 svn2git 工具。这是我所知道的最好的,而且你可以非常灵活地使用它的规则文件。

如果您不是 100% 了解存储库的历史,http://blog.hartwork.org/?p=763 中的 svneverever 是一个很好的工具,可以在将 SVN 存储库迁移到 Git 时调查其历史.


将 SVN 存储库转换为适当的 Git 存储库后,将新生成的存储库添加到现有存储库的远程位置并获取提交。然后使用 git replace 将新历史记录的第一次提交替换为旧历史记录的最后一次提交。如果你想让这个永久化,你可以使用 git filter-branch 使替换永久化。

请注意,您将重写已发布的历史记录,并且每个拥有基于以前历史记录的本地分支的人都必须从该历史记录更改中恢复,如 git rebase 的文档中所述。如果你不想要这个,你也可以简单地将新迁移的 repo 拉入你的 Git repo 并从 SVN 历史中创建新的分支。然后你将有多个根提交和独立的历史,这在技术上是可以的,但你仍然会在文件的历史中有所削减。