如何将 Subversion 提交导入 Git 上游存储库
How to import Subversion commits into Git upstream repository
这是我的场景:
a upstream Git 标记 1.2
已被用作没有 git svn
的空 Subversion 存储库中的第一个提交.文件已复制并添加到 Subversion trunk
工作副本中。
在 Subversion 中,一小部分变更集已在 /trunk
中提交
我现在想使用来自原始 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
这是我的场景:
a upstream Git 标记
1.2
已被用作没有git svn
的空 Subversion 存储库中的第一个提交.文件已复制并添加到 Subversiontrunk
工作副本中。在 Subversion 中,一小部分变更集已在
/trunk
中提交
我现在想使用来自原始 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