Using git-svn to merge a svn branch back into trunk and trunk back into the branch

微笑、不失礼 提交于 2019-12-20 20:31:34

问题


So I'm using git and interacting with an svn repo.

I have a svn TRUNK that looks like this:

A-B-C-D

And a svn bug_fixes branch that branches off at commit B or C:

 -c-d-e-f-g-h-i

Now I need to get the cdefghi commits that are in my svn branch back into the master branch.

I'm aware that I could just do a squashed commit, let's call it squash SQUASH (which would contain cdefghi), but then it seems like I would have to kill the bug_fixes branch and start a new branch to cleanly continue.

Here: http://blog.red-bean.com/sussman/?p=92 they suggest:

checkout the branch.

merge master's changes into the branch.

Checkout the master.

merge --reintegrate the branch's changes onto master.

Continue development.

Unfortunately, git-svn doesn't seem to recognize any "merge --reintegrate" command for svn.

So how do I cleanly make branch and master have all commits, so that development on both can continue, using git-svn's commands?


回答1:


The Caveats section of the git-svn documentation warns

For the sake of simplicity and interoperating with a less-capable system (SVN), it is recommended that all git svn users clone, fetch and dcommit directly from the SVN server, and avoid all git clone/pull/merge/push operations between git repositories and branches.

The author does provide a recommendation:

The recommended method of exchanging code between git branches and users is git format-patch and git am, or just dcommiting to the SVN repository.

Adapting to your situation

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

where c and i are appropriate identifiers for the commits in your history.




回答2:


Ok, so a few approaches that I found:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

or

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

or

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

And then after all that.

git svn dcommit (to commit to master)
git branch -D your_branch

Then (from svn because git-svn doesn't support deletion) delete the branch, and recreate it from trunk and start the cycle all over again.




回答3:


Would this not be a good case for rebasing your local stuff (<branchpoint>..i) onto the new master fetched from SVN?




回答4:


If you dcommit a merge it automatically squashes it into 1 commit. Sadly it does not internally use svn:mergeinfo or --reintegrate as it should, so you lose the association with the branch created via 'git svn branch'.




回答5:


What you also can do is cherry-pick, provided that you wouldn't use merge.

Both statements should be done on the branch without the changes.

Provided that c is older than i and that you want to take the whole sequence.

git cherry-pick c..i

Or separate commits

git cherry-pick c d e f g h i


来源:https://stackoverflow.com/questions/2164690/using-git-svn-to-merge-a-svn-branch-back-into-trunk-and-trunk-back-into-the-bran

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!