如何将 Subversion 提交导入 Git 上游存储库

How to import Subversion commits into Git upstream repository

这是我的场景:

我现在想使用来自原始 upstream(大型存储库)的 Git 分支并将这些 Subversion 变更集导入 feature 从初始标签创建的分支 1.2.

Subversion 存储库中没有分支或标签我有兴趣导入到 upstream Git 存储库。

我对 git-svn 的第一次尝试没有成功,因为创建的分支与 upstream 历史没有共同的祖先。我应该如何导入我的 Subversion 变更集才能在 Git 中进行合并操作?

您可以先 将 svn 迁移到 git git svn clone <URL for svn repo>。然后,您可以 将新转换的 git 存储库(假设为 master 分支)合并到您的上游 git 存储库主分支 中。合并步骤如下:

# in your upstream git repo
git remote add new <path for the new converted git repo>
git fetch new
git checkout master
git rebase master new/master
git checkout -b temp
git checkout master
git merge temp

要在变基时自动解决冲突文件,您可以使用-X选项:

  • 解决与master版本冲突的文件,git rebase master new/master -X ours.
  • 解决new/master版本的冲突文件,git rebase master new/master -X theirs.

我认为您对使用 git svn 的看法在这里没问题。
您可以使用 --allow-unrelated-histories 作为合并命令的参数来强制合并不相关的历史记录。
或者你可以只使用 git cherry-pick 在 Git 标签上重新应用你新导入的提交。

作为记录,这里是我有效执行操作的详细过程。想法是在处理升级到最新版本之前首先检查自定义代码的潜在冲突。

1) 准备您的 git 存储库。灵感来自:Add a new subversion remote into existing Git repository

$ git clone UPSTREAM

git-svn 遥控器添加到 .git/config

中的存储库
[svn-remote "remote-trunk"]
    url = SUBVERSION_TRUNK_FOLDER_URL
    fetch = :refs/remotes/git-svn-remote-trunk

运行 转换为 Git 提交

$ git svn fetch --authors-prog=map_authors.sh remote-trunk

2) 在 1.2 分支上重新设置 Subversion 变更集:

$ git branch custom-v1.2 v1.2
$ git checkout -b custom-trunk remotes/git-svn-remote-trunk
$ git rebase custom-v1.2

预计第一个 rebased 提交是空的,必须用 git rebase --skip 确认。

在现实生活中,我有几个文件的行尾不匹配,我不得不还原为原始文件以避免将来发生冲突。

经过几次 git rebase --continue 解决冲突的情况下,现在可以将自定义代码集成到最新的 master 中:

$ git checkout -b custom-master origin/master
$ git merge custom-trunk

*) 的一个更快的替代方法是直接与基于标签的分支或直接与最新的 origin/master

合并
$ git checkout -b custom-v1.2 v1.2
$ git merge --allow-unrelated-histories remotes/git-svn-custom-trunk
$ git checkout -b custom-master origin/master
$ git merge custom-v1.2