0

前段时间,当我决定开源一些软件时,我将一个 Subversion 存储库移到了 Git 和 github,我不确定我做了什么,但提交历史没有移走。当时我以为我不在乎,但现在我想我真的很喜欢在 Github 上 2 年多的提交,如果没有其他原因,只是为了工作努力的记录。问题是我的项目在 Github 上已经有一段时间了,并且自创建以来就被分叉并收到了提交。

有没有办法从我的旧仓库中“移植”历史提交,并将它们放入活生生的 Github 仓库中?

注意:我三心二意地尝试过svn2git --rebase,但我不确定这是否会奏效,因为自从 svn repo 被抛在后面以来已经有提交。我收到了这个错误,我不确定它是什么意思:

 command failed:
 2>&1 git svn fetch
4

1 回答 1

2

git 中的祖先只不过是一个提交(它是一个文本文件),其中包含一行或多行读取parent <hash of parent commit>. 如果您想在第一次提交之前插入历史记录,则需要这样的父行(第一次提交没有),这将更改第一次提交的哈希,这意味着其后代需要更改父行指针,这会递归地通过所有提交,因为所有提交都是从 repo 的第一次提交。

如果您不担心会弄乱使用 fork 的人员(因为您将更改项目中的历史记录),那么您可以重做该操作以创建旧历史记录的第二个 git 存储库,将该存储库添加为远程您的新仓库并获取更改,现在您将在新仓库中有两个根。您可能会收到关于没有共同提交的警告;这可以。现在您可以查看历史以了解您的方位:git log --all --graph --oneline --decorate,然后可能rebase --onto将新 repo 的新工作移到您刚刚引入的旧 repo 的历史之上。大概您的新 repo 的第一次提交中的树将与中的树相同您的旧仓库的最后一次,所以这可能很简单: ,您刚刚引入的旧仓库历史中的最后一次提交在git rebase --onto A B C哪里,AB是新 repo 中的第一次提交(这里被认为是新 repo 的“旧基础”,您不会重新基于旧历史,因为它应该是相同的,并且C是分支的负责人在您想要基于此的新存储库中,可能master

你的 repos 可能比这更复杂,你可能需要做更多的工作来确定重新加入事物的接缝的确切位置,但这是一般的想法。现在你可以git remote rm newrepo,“newrepo”是你在添加遥控器时命名的任何东西。这应该清除第二个根和所有获取的提交。最后,您可以强制将其推送到 github。这实际上会改变每个提交哈希,因此没有一个分支将起作用,但您将拥有所有历史记录,人们可以再次克隆,或者复制reset --hard到新master的以赶上。你可能想在你的 repo 页面上通知每个人,或者找到分叉的人并提醒他们你的意图。

于 2013-05-13T11:03:58.797 回答