2017-03-03 93 views
2

这里是我的情况:如何导入颠覆提交到上游的Git仓库

  • 一个上游的Git标签1.2已被用作一个空的Subversion版本库中第一个承诺,而git svn。文件已被复制并添加到Subversion trunk工作副本中。

  • 在Subversion中,变更集的小单子一直致力于在/trunk

我现在想用一个Git叉从原来上游(大库),并导入这些颠覆变更成功能从初始标记1.2创建的分支。

Subversion版本库中没有分支或标签我有兴趣导入上游 Git存储库。

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

回答

1

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

+0

抱歉的历史不是无关的......第一次Subversion提交与Git仓库中的一个标签完全匹配 –

+1

匹配意味着IT是由'git-svn'完成的提交,或者只是它具有相同的内容?如果它只是相同的内容,并不意味着它们是相关的历史。无关的历史意味着这两个分支没有共同的Git提交。这正是您所描述的解决方案。 – Vampire

+0

我同意。我也必须测试它。顺便说一句,输入分支上的'git rebase'似乎也可以。 –

0

您可以首先将svn迁移到git,git svn clone <URL for svn repo>。然后你可以合并新的转换git回购(假设主分支)到你的上游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选项:

  • 解决主版本,git rebase master new/master -X ours冲突文件。
  • 用新/主版本git rebase master new/master -X theirs解决冲突文件。
+0

当然变基介绍冲突,我想解决在最新一步合并颠覆分支时(变更从以前的标签)的冲突进入新的主版本 –

+0

你也可以通过'git rebase master new/master -X theirirs'自动解决冲突,这样可以保持冲突文件为'new/master'版本。我在我的答案中添加了它。 –

0

为了记录,这里是我做了有效的详细过程。想法是首先检查您的自定义代码中的潜在冲突,然后再处理升级到最新版本。

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分支颠覆的变更:

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

预计第一次重定金提交是空的,必须使用git rebase --skip进行确认。

在现实生活中,为避免未来发生冲突,我必须将少量文件恢复原始状态,以避免将来的冲突。

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

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

*)从Vampire一个更快的选择是直接合并或者与基于标签的分支或者直接用最新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