1

过去我曾使用 GitHub 的导入功能来导入 SVN 存储库。该存储库现在与裸 git 相同,与 SVN 历史没有任何联系。提交不包含svn-id信息。

一段时间过去了,提交已添加到 SVN 存储库,但正如预期的那样,git 存储库保持不变。

所以现在我想用添加到原始 SVN 的提交来“更新”git 存储库。我试过git-svn了,但我无法让 git 识别克隆的 svn 和克隆的 git 之间的共同历史。

我已经考虑过使用format-patch并且我相信这个操作应该可以解决问题,但是我正在寻找一种更自动化的方式来做这件事。

唯一的限制是应该维护 git 历史记录(没有rebase'ing),并且提交尽可能忠实于 SVN 存储库(不svn-id添加到提交消息中)。

4

1 回答 1

1

正如您所猜测的那样,正确地“合并”提交并不能在这里真正起作用。您将不得不使用format-patch. 这是我的做法:

$ git svn clone --no-metadata svn://.../ new-svn-repo
$ cd new-svn-repo
$ git log

(您可能希望添加-A选项以git svn clone将 SVN 作者信息从user@uuid格式重写为正确的Joe User <user@example.com>作者信息。有关信息,请参阅man git-svn。)

查看日志并找到与 github 存储库中最新提交对应的提交。如果那是提交,abcdef那么:

$ git format-patch -k abcdef

您现在将拥有大量与*.patch您要移植的新提交相对应的文件。所以...

$ cp *.patch /github/repository/location
$ cd /github/repository/location
$ git am -k --keep-cr *.patch

多田!现在只需将 master 推送到 Github。

(如果您的 Git 不够新,它可能会抱怨 的--keep-cr参数git am。如果您的源文件不包含 CR,那么只需删除。--keep-cr但如果有,您可能需要升级您的 Git git mailsplit,因为由git am补丁文件中的 CR 会在处理时取出,可能会导致补丁应用失败。)

于 2010-11-16T03:44:38.760 回答