git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git-svn merge helper
@ 2007-09-30 11:05 Björn Steinbrink
  2007-09-30 14:15 ` Benoit SIGOURE
  0 siblings, 1 reply; 10+ messages in thread
From: Björn Steinbrink @ 2007-09-30 11:05 UTC (permalink / raw)
  To: git

Hi,

I recently discovered git-svn and absolutey love it. One thing that I'm
missing though, is an equivalent of "svn merge" for merging between svn
remotes, to support the SVN way of using "squashed" merges, where you
just note the merge meta-data in the commit message. "git merge" didn't
work for me (and probably isn't expected to work) to merge between two
svn branches, so I've resorted to cherry-picking the required commits
one by one into a temporary branch and then squashing them together by
doing a --squash merge with a second temporary branch (as in [1]).

Of course that becomes extremely annoying if there are like 200
commits to merge, so I came up with the following script to help me.
It does just what I described above, but automated. Usage is like this:

git-svn-merge trunk 123 543

Which does the same as "svn merge -r123:543 trunk-url", except for being
incremental (ie. no huge one-time patch, eventually causing a massive
set of conflicts) and often faster.

In case of conflicts, it bails out and let's you fix them. Then you can
just re-run it with the same parameters again, as it automatically
determines where to start cherry-picking if you're currently on the
merge branch.

It's neither complete nor nice to look at, but it more or less gets the
job done, so I thought I'll just post it here, maybe someone picks it up
and brings it into shape.

Thanks,
Björn

[1] http://cheat.errtheblog.com/s/gitsvn/


#!/bin/sh

BRANCH=$(git branch | grep \* | cut -d ' ' -f2)

START=$(git svn find-rev r$2 $1)
END=$(git svn find-rev r$3 $1)

if echo $BRANCH | grep -q svnmerge/
then
	START=$(git svn find-rev r$(git svn find-rev HEAD) $1)
else
	git checkout -b svnmerge/$BRANCH
fi

for HASH in $(git log --pretty=format:%H --reverse $START..$END)
do
	git cherry-pick $HASH || exit
done

git checkout $BRANCH
git checkout -b svnmerge/$BRANCH-squashed
git merge --squash svnmerge/$BRANCH
git commit -m "Merged changes from revisions $2-$3 from $1 into $BRANCH."

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-09-30 11:05 git-svn merge helper Björn Steinbrink
@ 2007-09-30 14:15 ` Benoit SIGOURE
  2007-10-01  2:50   ` Björn Steinbrink
  0 siblings, 1 reply; 10+ messages in thread
From: Benoit SIGOURE @ 2007-09-30 14:15 UTC (permalink / raw)
  To: Björn Steinbrink; +Cc: git

[-- Attachment #1: Type: text/plain, Size: 1271 bytes --]

On Sep 30, 2007, at 1:05 PM, Björn Steinbrink wrote:

> Hi,
>
> I recently discovered git-svn and absolutey love it. One thing that  
> I'm
> missing though, is an equivalent of "svn merge" for merging between  
> svn
> remotes, to support the SVN way of using "squashed" merges, where you
> just note the merge meta-data in the commit message. "git merge"  
> didn't
> work for me (and probably isn't expected to work) to merge between two
> svn branches, so I've resorted to cherry-picking the required commits
> one by one into a temporary branch and then squashing them together by
> doing a --squash merge with a second temporary branch (as in [1]).

I fail to see why you'd want to reproduce the broken behavior of svn  
merge.  Anyways, git-svn is a great way to merge SVN branches,  
unfortunately it can't detect when merges happened on the SVN side.   
I think you can use it nevertheless by manually adding a graft at the  
last merge point, which would help you merging the right revisions  
without having to specify what needs to be merged (unless someone  
made another merge on the SVN side, in which case you need to update  
your graft).

Cheers,

-- 
Benoit Sigoure aka Tsuna
EPITA Research and Development Laboratory



[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 186 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-09-30 14:15 ` Benoit SIGOURE
@ 2007-10-01  2:50   ` Björn Steinbrink
  2007-10-01  7:56     ` Benoit SIGOURE
  0 siblings, 1 reply; 10+ messages in thread
From: Björn Steinbrink @ 2007-10-01  2:50 UTC (permalink / raw)
  To: Benoit SIGOURE; +Cc: git

On 2007.09.30 16:15:49 +0200, Benoit SIGOURE wrote:
> On Sep 30, 2007, at 1:05 PM, Björn Steinbrink wrote:
>
>> Hi,
>>
>> I recently discovered git-svn and absolutey love it. One thing that I'm
>> missing though, is an equivalent of "svn merge" for merging between svn
>> remotes, to support the SVN way of using "squashed" merges, where you
>> just note the merge meta-data in the commit message. "git merge" didn't
>> work for me (and probably isn't expected to work) to merge between two
>> svn branches, so I've resorted to cherry-picking the required commits
>> one by one into a temporary branch and then squashing them together by
>> doing a --squash merge with a second temporary branch (as in [1]).
>
> I fail to see why you'd want to reproduce the broken behavior of svn merge. 
>  Anyways, git-svn is a great way to merge SVN branches, unfortunately it 
> can't detect when merges happened on the SVN side.  I think you can use it 
> nevertheless by manually adding a graft at the last merge point, which 
> would help you merging the right revisions without having to specify what 
> needs to be merged (unless someone made another merge on the SVN side, in 
> which case you need to update your graft).

Then how does that work? The manpage explicitly says that I should not
use git-{pull,merge} on branches I want to dcommit from. And a trivial
test immediately got the expected effect of git-svn trying to commit to
trunk instead of the branch.

Thanks,
Björn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-01  2:50   ` Björn Steinbrink
@ 2007-10-01  7:56     ` Benoit SIGOURE
       [not found]       ` <8c5c35580710010113v7d4ad14bt129b7cb12d8f4fb8@mail.gmail.com>
  0 siblings, 1 reply; 10+ messages in thread
From: Benoit SIGOURE @ 2007-10-01  7:56 UTC (permalink / raw)
  To: Björn Steinbrink; +Cc: git

[-- Attachment #1: Type: text/plain, Size: 1878 bytes --]

On Oct 1, 2007, at 4:50 AM, Björn Steinbrink wrote:

> On 2007.09.30 16:15:49 +0200, Benoit SIGOURE wrote:
>> On Sep 30, 2007, at 1:05 PM, Björn Steinbrink wrote:
>>
>>> Hi,
>>>
>>> I recently discovered git-svn and absolutey love it. One thing  
>>> that I'm
>>> missing though, is an equivalent of "svn merge" for merging  
>>> between svn
>>> remotes, to support the SVN way of using "squashed" merges, where  
>>> you
>>> just note the merge meta-data in the commit message. "git merge"  
>>> didn't
>>> work for me (and probably isn't expected to work) to merge  
>>> between two
>>> svn branches, so I've resorted to cherry-picking the required  
>>> commits
>>> one by one into a temporary branch and then squashing them  
>>> together by
>>> doing a --squash merge with a second temporary branch (as in [1]).
>>
>> I fail to see why you'd want to reproduce the broken behavior of  
>> svn merge.
>>  Anyways, git-svn is a great way to merge SVN branches,  
>> unfortunately it
>> can't detect when merges happened on the SVN side.  I think you  
>> can use it
>> nevertheless by manually adding a graft at the last merge point,  
>> which
>> would help you merging the right revisions without having to  
>> specify what
>> needs to be merged (unless someone made another merge on the SVN  
>> side, in
>> which case you need to update your graft).
>
> Then how does that work? The manpage explicitly says that I should not
> use git-{pull,merge} on branches I want to dcommit from. And a trivial
> test immediately got the expected effect of git-svn trying to  
> commit to
> trunk instead of the branch.

Ah, yes, you're right.  Well, this will work the day we can pass an  
option to git-svn dcommit to tell it where the commit must be sent.

-- 
Benoit Sigoure aka Tsuna
EPITA Research and Development Laboratory



[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 186 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
       [not found]       ` <8c5c35580710010113v7d4ad14bt129b7cb12d8f4fb8@mail.gmail.com>
@ 2007-10-02 21:14         ` Björn Steinbrink
  2007-10-02 22:04           ` Steven Walter
  0 siblings, 1 reply; 10+ messages in thread
From: Björn Steinbrink @ 2007-10-02 21:14 UTC (permalink / raw)
  To: Lars Hjemli; +Cc: Benoit SIGOURE, git

On 2007.10.01 10:13:45 +0200, Lars Hjemli wrote:
> On 10/1/07, Benoit SIGOURE <tsuna@lrde.epita.fr> wrote:
> > On Oct 1, 2007, at 4:50 AM, Björn Steinbrink wrote:
> > > Then how does that work? The manpage explicitly says that I should not
> > > use git-{pull,merge} on branches I want to dcommit from. And a trivial
> > > test immediately got the expected effect of git-svn trying to
> > > commit to
> > > trunk instead of the branch.
> >
> > Ah, yes, you're right.  Well, this will work the day we can pass an
> > option to git-svn dcommit to tell it where the commit must be sent.
> >
> 
> This is fixed in the latest version of git-svn (yet to be released).
> There is no need for an extra option, git-svn dcommit now handles
> merges between subversion branches correctly.

Thanks, but there's still a case that fails.

One common pattern in SVN is to have the feature branch following the
trunk. In git terms, that would mean that the feature branch is
continually rebased onto the HEAD of the HEAD AFAICT (although SVN of
course cannot represent that). The problem with that is, that git
doesn't create a merge commit in that case and git-svn gets confused
again.

git checkout mybranch
git merge master # Creates a merge commit
git checkout master
git merge mybranch # Does just fast forward

Is there anyway to force a merge commit or some other work around?

Thanks,
Björn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-02 21:14         ` Björn Steinbrink
@ 2007-10-02 22:04           ` Steven Walter
  2007-10-02 22:38             ` Björn Steinbrink
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Walter @ 2007-10-02 22:04 UTC (permalink / raw)
  To: Björn Steinbrink; +Cc: git

On Tue, Oct 02, 2007 at 11:14:00PM +0200, Björn Steinbrink wrote:
> One common pattern in SVN is to have the feature branch following the
> trunk. In git terms, that would mean that the feature branch is
> continually rebased onto the HEAD of the HEAD AFAICT (although SVN of
> course cannot represent that). The problem with that is, that git
> doesn't create a merge commit in that case and git-svn gets confused
> again.
> 
> git checkout mybranch
> git merge master # Creates a merge commit
> git checkout master
> git merge mybranch # Does just fast forward
> 
> Is there anyway to force a merge commit or some other work around?

When I want to do something like this, I go about it one of two ways.
The first option is to simply rebase mybranch onto master.  Since my
feature branches are not usually published, there is no problem
rewinding them.  That may not be an option for you, however.

The other option is to have a "build" branch.  By example:

git checkout build
git reset --hard master
git merge mybranch
make

In that way, I have branch with the latest changes from head and the
changes from mybranch together.  The downside to this method is that you
may have to repeated resolve merges.  Despite the downsides, I find
these two methods to work quite well.
-- 
-Steven Walter <stevenrwalter@gmail.com>
"A human being should be able to change a diaper, plan an invasion,
butcher a hog, conn a ship, design a building, write a sonnet, balance
accounts, build a wall, set a bone, comfort the dying, take orders,
give orders, cooperate, act alone, solve equations, analyze a new
problem, pitch manure, program a computer, cook a tasty meal, fight
efficiently, die gallantly. Specialization is for insects."
   -Robert Heinlein

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-02 22:04           ` Steven Walter
@ 2007-10-02 22:38             ` Björn Steinbrink
  2007-10-03  0:42               ` Steven Walter
  0 siblings, 1 reply; 10+ messages in thread
From: Björn Steinbrink @ 2007-10-02 22:38 UTC (permalink / raw)
  To: Steven Walter; +Cc: git

On 2007.10.02 18:04:58 -0400, Steven Walter wrote:
> On Tue, Oct 02, 2007 at 11:14:00PM +0200, Björn Steinbrink wrote:
> > One common pattern in SVN is to have the feature branch following the
> > trunk. In git terms, that would mean that the feature branch is
> > continually rebased onto the HEAD of the HEAD AFAICT (although SVN of
> > course cannot represent that). The problem with that is, that git
> > doesn't create a merge commit in that case and git-svn gets confused
> > again.
> > 
> > git checkout mybranch
> > git merge master # Creates a merge commit
> > git checkout master
> > git merge mybranch # Does just fast forward
> > 
> > Is there anyway to force a merge commit or some other work around?
> 
> When I want to do something like this, I go about it one of two ways.
> The first option is to simply rebase mybranch onto master.  Since my
> feature branches are not usually published, there is no problem
> rewinding them.  That may not be an option for you, however.

Unfortunately not, the branch in question is required to be in the SVN
repository.

> The other option is to have a "build" branch.  By example:
> 
> git checkout build
> git reset --hard master
> git merge mybranch
> make
> 
> In that way, I have branch with the latest changes from head and the
> changes from mybranch together.  The downside to this method is that you
> may have to repeated resolve merges.  Despite the downsides, I find
> these two methods to work quite well.

Thanks, but it makes no difference here, it stil results in a fast
forward. This is a small test case which exhibits the behaviour and
matches my current workflow with git-svn (except for the dcommits):

git init
echo Hi > file1; git add file1; git commit -m file1
git checkout -b branch
echo Hi > file2; git add file2; git commit -m file2
git checkout master
echo Hi > file3; git add file3; git commit -m file3
git checkout branch
git merge master

# Then I'd normally do the following which causes a fast forward
#git checkout master
#git merge branch

# Now I tried this, which also results in a fast-forward:
git checkout -b merge
git reset --hard master
git merge branch


Anything I'm missing?

Thanks,
Björn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-02 22:38             ` Björn Steinbrink
@ 2007-10-03  0:42               ` Steven Walter
  2007-10-03  1:02                 ` Björn Steinbrink
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Walter @ 2007-10-03  0:42 UTC (permalink / raw)
  To: Björn Steinbrink; +Cc: git

On Wed, Oct 03, 2007 at 12:38:13AM +0200, Björn Steinbrink wrote:
> > The other option is to have a "build" branch.  By example:
> > 
> > git checkout build
> > git reset --hard master
> > git merge mybranch
> > make
> > 
> > In that way, I have branch with the latest changes from head and the
> > changes from mybranch together.  The downside to this method is that you
> > may have to repeated resolve merges.  Despite the downsides, I find
> > these two methods to work quite well.
> 
> Thanks, but it makes no difference here, it stil results in a fast
> forward. This is a small test case which exhibits the behaviour and
> matches my current workflow with git-svn (except for the dcommits):
> 
> git init
> echo Hi > file1; git add file1; git commit -m file1
> git checkout -b branch
> echo Hi > file2; git add file2; git commit -m file2
> git checkout master
> echo Hi > file3; git add file3; git commit -m file3
> git checkout branch
> git merge master
> 
> # Then I'd normally do the following which causes a fast forward
> #git checkout master
> #git merge branch
> 
> # Now I tried this, which also results in a fast-forward:
> git checkout -b merge
> git reset --hard master
> git merge branch

I believe you misunderstood my suggestion.  In using a "build" branch,
you would not merge master into branch, as you did above.  Instead, you
would create a third, unpublished branch to hold the merge.

At the same time, I have a slightly better understanding of what it is
you're trying to do.  If you are trying to keep up an SVN-like workflow
(namely pulling changes from trunk into a branch from time to time),
then my solution probably isn't suitable for you.  However, you might
consider why you actually /need/ to do that, outside of SVN convention.
-- 
-Steven Walter <stevenrwalter@gmail.com>
"A human being should be able to change a diaper, plan an invasion,
butcher a hog, conn a ship, design a building, write a sonnet, balance
accounts, build a wall, set a bone, comfort the dying, take orders,
give orders, cooperate, act alone, solve equations, analyze a new
problem, pitch manure, program a computer, cook a tasty meal, fight
efficiently, die gallantly. Specialization is for insects."
   -Robert Heinlein

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-03  0:42               ` Steven Walter
@ 2007-10-03  1:02                 ` Björn Steinbrink
  2007-10-03 11:40                   ` Andreas Ericsson
  0 siblings, 1 reply; 10+ messages in thread
From: Björn Steinbrink @ 2007-10-03  1:02 UTC (permalink / raw)
  To: Steven Walter; +Cc: git

On 2007.10.02 20:42:52 -0400, Steven Walter wrote:
> On Wed, Oct 03, 2007 at 12:38:13AM +0200, Björn Steinbrink wrote:
> > > The other option is to have a "build" branch.  By example:
> > > 
> > > git checkout build
> > > git reset --hard master
> > > git merge mybranch
> > > make
> > > 
> > > In that way, I have branch with the latest changes from head and the
> > > changes from mybranch together.  The downside to this method is that you
> > > may have to repeated resolve merges.  Despite the downsides, I find
> > > these two methods to work quite well.
> > 
> > Thanks, but it makes no difference here, it stil results in a fast
> > forward. This is a small test case which exhibits the behaviour and
> > matches my current workflow with git-svn (except for the dcommits):
> > 
> > git init
> > echo Hi > file1; git add file1; git commit -m file1
> > git checkout -b branch
> > echo Hi > file2; git add file2; git commit -m file2
> > git checkout master
> > echo Hi > file3; git add file3; git commit -m file3
> > git checkout branch
> > git merge master
> > 
> > # Then I'd normally do the following which causes a fast forward
> > #git checkout master
> > #git merge branch
> > 
> > # Now I tried this, which also results in a fast-forward:
> > git checkout -b merge
> > git reset --hard master
> > git merge branch
> 
> I believe you misunderstood my suggestion.  In using a "build" branch,
> you would not merge master into branch, as you did above.  Instead, you
> would create a third, unpublished branch to hold the merge.

Almost though so.

> At the same time, I have a slightly better understanding of what it is
> you're trying to do.  If you are trying to keep up an SVN-like workflow
> (namely pulling changes from trunk into a branch from time to time),
> then my solution probably isn't suitable for you.  However, you might
> consider why you actually /need/ to do that, outside of SVN convention.

Due to the same reason for which the branch needs to be public at all,
there are other people who want to follow it and test it, while there
are external dependencies that currently change quite often. So I need
to get the relevant changes from trunk into my branch anyway, even with
svn conventions put aside (well, unless I force everyone else to merge
over and over again). And as sometimes others commit to that branch, too
(you just have to love that), keeping a separate branch for the final
merge isn't so nice either, as I'd need to constantly cherry-pick those
changes then and probably get even more conflicts along the way.

That said, Google finally liked some of the search terms that I threw at
it and revealed a thread [1] from march, where Linus was torn on whether
or not a --no-fast-forward option should be introduced. That sounds like
it would help here, any chance of getting such a thing?

Thanks,
Björn

[1]
http://lists-archives.org/git/419374-git-merge-and-merge-message.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: git-svn merge helper
  2007-10-03  1:02                 ` Björn Steinbrink
@ 2007-10-03 11:40                   ` Andreas Ericsson
  0 siblings, 0 replies; 10+ messages in thread
From: Andreas Ericsson @ 2007-10-03 11:40 UTC (permalink / raw)
  To: Björn Steinbrink; +Cc: Steven Walter, git

Björn Steinbrink wrote:
> On 2007.10.02 20:42:52 -0400, Steven Walter wrote:
>> On Wed, Oct 03, 2007 at 12:38:13AM +0200, Björn Steinbrink wrote:
>>>> The other option is to have a "build" branch.  By example:
>>>>
>>>> git checkout build
>>>> git reset --hard master
>>>> git merge mybranch
>>>> make
>>>>
>>>> In that way, I have branch with the latest changes from head and the
>>>> changes from mybranch together.  The downside to this method is that you
>>>> may have to repeated resolve merges.  Despite the downsides, I find
>>>> these two methods to work quite well.
>>> Thanks, but it makes no difference here, it stil results in a fast
>>> forward. This is a small test case which exhibits the behaviour and
>>> matches my current workflow with git-svn (except for the dcommits):
>>>
>>> git init
>>> echo Hi > file1; git add file1; git commit -m file1
>>> git checkout -b branch
>>> echo Hi > file2; git add file2; git commit -m file2
>>> git checkout master
>>> echo Hi > file3; git add file3; git commit -m file3
>>> git checkout branch
>>> git merge master
>>>
>>> # Then I'd normally do the following which causes a fast forward
>>> #git checkout master
>>> #git merge branch
>>>
>>> # Now I tried this, which also results in a fast-forward:
>>> git checkout -b merge
>>> git reset --hard master
>>> git merge branch
>> I believe you misunderstood my suggestion.  In using a "build" branch,
>> you would not merge master into branch, as you did above.  Instead, you
>> would create a third, unpublished branch to hold the merge.
> 
> Almost though so.
> 
>> At the same time, I have a slightly better understanding of what it is
>> you're trying to do.  If you are trying to keep up an SVN-like workflow
>> (namely pulling changes from trunk into a branch from time to time),
>> then my solution probably isn't suitable for you.  However, you might
>> consider why you actually /need/ to do that, outside of SVN convention.
> 
> Due to the same reason for which the branch needs to be public at all,
> there are other people who want to follow it and test it, while there
> are external dependencies that currently change quite often. So I need
> to get the relevant changes from trunk into my branch anyway, even with
> svn conventions put aside (well, unless I force everyone else to merge
> over and over again). And as sometimes others commit to that branch, too
> (you just have to love that), keeping a separate branch for the final
> merge isn't so nice either, as I'd need to constantly cherry-pick those
> changes then and probably get even more conflicts along the way.
> 
> That said, Google finally liked some of the search terms that I threw at
> it and revealed a thread [1] from march, where Linus was torn on whether
> or not a --no-fast-forward option should be introduced. That sounds like
> it would help here, any chance of getting such a thing?
> 

Is this what you're looking for? It's in the 'next' branch in git.git.

commit d66424c4ac661c69640765260235452499d80378
Author: Lars Hjemli <hjemli@gmail.com>
Date:   Mon Sep 24 00:51:45 2007 +0200

    git-merge: add --ff and --no-ff options
    
    These new options can be used to control the policy for fast-forward
    merges: --ff allows it (this is the default) while --no-ff will create
    a merge commit.
    
    Signed-off-by: Lars Hjemli <hjemli@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-10-03 11:40 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-30 11:05 git-svn merge helper Björn Steinbrink
2007-09-30 14:15 ` Benoit SIGOURE
2007-10-01  2:50   ` Björn Steinbrink
2007-10-01  7:56     ` Benoit SIGOURE
     [not found]       ` <8c5c35580710010113v7d4ad14bt129b7cb12d8f4fb8@mail.gmail.com>
2007-10-02 21:14         ` Björn Steinbrink
2007-10-02 22:04           ` Steven Walter
2007-10-02 22:38             ` Björn Steinbrink
2007-10-03  0:42               ` Steven Walter
2007-10-03  1:02                 ` Björn Steinbrink
2007-10-03 11:40                   ` Andreas Ericsson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).