上下文:我的工作决定从subversion切换到git。他们有5个需要转换的svn repos,其中4个很小,可以在一小时内用git-svn迁移。最后一个更大,git-svn运行了几天并最终崩溃,所以我一直在试验其他工具,如subgit,svn2git,KDE的svn2git等等。所有这些工具都在同一时间失败,一年多前的修订,以及崩溃。
到目前为止,KDE的svn2git是最快和最有效的,它的规则允许我创建两个git repos:一个包含问题之前的所有提交,另一个包含所有提交之后的提交。现在我需要将它们正确地合并到一个git仓库中。
我知道如何将一个仓库添加为另一个仓库的远程并且樱桃选择提交(git: Apply changes introduced by commit in one repo to another repo),但我需要一种方法来完成整个仓库及其所有分支。
如何将一个仓库的所有提交应用于另一个仓库?
编辑:我正在寻找类似于git rebase所做的事情,以便历史记录在整个存储库中完整准确
答案 0 :(得分:0)
您应该可以按照此链接中的说明进行操作:http://blog.dynamic50.com/2009/11/26/moving-your-git-repos-and-all-branches-to-a-new-remote-repository/
总而言之,在本地跟踪旧分支,添加新远程,然后将所有内容推送到它。
答案 1 :(得分:0)
这个怎么样:(请原谅我听起来很蠢)
假设:您有两个存储库,其中所有提交都在一个分支上。
答案 2 :(得分:0)
Github上很棒的人通过电子邮件给了我答案。
$ cd recenthistory
$ git fetch ../oldhistory 'refs/*:refs/remotes/oldhistory/*'
对于历史记录的早期和后期出现的每个分支:
$ git rev-list --topo-order --parents refs/heads/$BRANCH | tail
[...]
bf0c6e839c692142784caf07b523cd69442e57a5 e497ea2a9b6c378f01d092c210af20cbee762475
e497ea2a9b6c378f01d092c210af20cbee762475 8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68 e83c5163316f89bfbde7d9ab23ca2e25604af290
e83c5163316f89bfbde7d9ab23ca2e25604af290
$ echo "e83c5163316f89bfbde7d9ab23ca2e25604af290 $(git rev-parse "refs/remotes/oldhistory/$BRANCH")" >>.git/info/grafts
$ git filter-branch --tag-name-filter cat -- --branches --tags
Verify that the history is correct.
$ git push origin --force --all
$ git push origin --force --tags
从GitHub克隆一份新副本并仔细检查一切正常。
删除最近的历史和旧历史存储库(可能先备份)。这些存储库中的历史记录与GitHub中的历史记录不兼容,因此您希望确保不要在其中进行任何进一步的工作。