从SVN导入现有Git项目的历史记录

时间:2016-07-15 00:40:16

标签: git svn github git-svn

有一个项目已经在GitHub上使用了一段时间,但之前它是从svn迁移的。当它最初迁移时,SVN的历史并没有被带到Git。在项目设置完成后,有没有办法可以将SVN历史记录复制/导入/克隆/移动到Git?

2 个答案:

答案 0 :(得分:1)

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

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

如果您想要更进一步,请在检索历史记录后,将此新存储库添加为实际存储库中的远程存储库并进行提取。

git fetch --all

一旦完成,你应该有一个不相交的历史。

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

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

最后,使用'git filter-branch',这将完全重写历史。

您必须使用以下内容推送新历史记录:

git push origin --all

所有其他开发者都必须克隆或获取所有历史记录......并且会抱怨; - )

答案 1 :(得分:1)

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仓库,并从SVN历史记录中创建新的分支。然后,您将拥有多个根提交和独立历史记录,从技术上讲是可以的,但您仍然可以减少文件的历史记录。