Subject: Re: [git-svn PATCH] Add --no-rebase option to git-svn dcommit

From: Eric Wong <[email-masked]>
Date: Fri, 4 May 2007 01:04:24 -0700

Eric Wong <[email-masked]> wrote:
> Karl Hasselström <[email-masked]> wrote:
> > git-svn dcommit exports commits to Subversion, then imports them back
> > to git again, and last but not least rebases or resets HEAD to the
> > last of the new commits. I guess this rebasing is convenient when
> > using just git, but when the commits to be exported are managed by
> > StGIT, it's really annoying. So add an option to disable this
> > behavior. And document it, too!
> 
> Cool, I've been planning to add this myself, too.
> 
> Acked-by: Eric Wong <[email-masked]>
> 
> > Signed-off-by: Karl Hasselström <[email-masked]>
> > ---
> > 
> > Arguably, the switch should be --rebase instead, and default to not
> > rebase. But that would change the existing behavior, and possibly make
> > dcommit less convenient to use for at least the person who implemented
> > the existing behavior. Opinions?

Erm, sorry, I skipped over this part.  No. I like rebase being the
default behavior.

> >  Documentation/git-svn.txt |    3 +++
> >  git-svn.perl              |   33 ++++++++++++++++++---------------
> >  2 files changed, 21 insertions(+), 15 deletions(-)
> > 
> > diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
> > index 62d7ef8..fcdeeaa 100644
> > --- a/Documentation/git-svn.txt
> > +++ b/Documentation/git-svn.txt
> > @@ -125,6 +125,9 @@ and have no uncommitted changes.
> >  	alternative to HEAD.
> >  	This is advantageous over 'set-tree' (below) because it produces
> >  	cleaner, more linear history.
> > ++
> > +--no-rebase;;
> > +	After committing, do not rebase or reset.
> >  --
> >  
> >  'log'::
> > diff --git a/git-svn.perl b/git-svn.perl
> > index 6657e10..3c4f490 100755
> > --- a/git-svn.perl
> > +++ b/git-svn.perl
> > @@ -55,7 +55,7 @@ $sha1_short = qr/[a-f\d]{4,40}/;
> >  my ($_stdin, $_help, $_edit,
> >  	$_message, $_file,
> >  	$_template, $_shared,
> > -	$_version, $_fetch_all,
> > +	$_version, $_fetch_all, $_no_rebase,
> >  	$_merge, $_strategy, $_dry_run, $_local,
> >  	$_prefix, $_no_checkout, $_verbose);
> >  $Git::SVN::_follow_parent = 1;
> > @@ -114,6 +114,7 @@ my %cmd = (
> >  			  'verbose|v' => \$_verbose,
> >  			  'dry-run|n' => \$_dry_run,
> >  			  'fetch-all|all' => \$_fetch_all,
> > +			  'no-rebase' => \$_no_rebase,
> >  			%cmt_opts, %fc_opts } ],
> >  	'set-tree' => [ \&cmd_set_tree,
> >  	                "Set an SVN repository to a git tree-ish",
> > @@ -413,21 +414,23 @@ sub cmd_dcommit {
> >  		return;
> >  	}
> >  	$_fetch_all ? $gs->fetch_all : $gs->fetch;
> > -	# we always want to rebase against the current HEAD, not any
> > -	# head that was passed to us
> > -	my @diff = command('diff-tree', 'HEAD', $gs->refname, '--');
> > -	my @finish;
> > -	if (@diff) {
> > -		@finish = rebase_cmd();
> > -		print STDERR "W: HEAD and ", $gs->refname, " differ, ",
> > -		             "using @finish:\n", "@diff";
> > -	} else {
> > -		print "No changes between current HEAD and ",
> > -		      $gs->refname, "\nResetting to the latest ",
> > -		      $gs->refname, "\n";
> > -		@finish = qw/reset --mixed/;
> > +	unless ($_no_rebase) {
> > +		# we always want to rebase against the current HEAD, not any
> > +		# head that was passed to us
> > +		my @diff = command('diff-tree', 'HEAD', $gs->refname, '--');
> > +		my @finish;
> > +		if (@diff) {
> > +			@finish = rebase_cmd();
> > +			print STDERR "W: HEAD and ", $gs->refname, " differ, ",
> > +				     "using @finish:\n", "@diff";
> > +		} else {
> > +			print "No changes between current HEAD and ",
> > +			      $gs->refname, "\nResetting to the latest ",
> > +			      $gs->refname, "\n";
> > +			@finish = qw/reset --mixed/;
> > +		}
> > +		command_noisy(@finish, $gs->refname);
> >  	}
> > -	command_noisy(@finish, $gs->refname);
> >  }
> >  
> >  sub cmd_find_rev {

-- 
Eric Wong