threads / patch / 7952

patchAdd --no-rebase option to git-svn dcommit

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

## tl;dr

7 messages between May 3, 2007 and May 4, 2007. Diffs are folded; open one to read it.

replies: 6people: 4as markdown or json

Karl Hasselström· May 3, 2007, 05:51 UTC · lore

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!

Signed-off-by: Karl Hasselström <kha@treskal.com>
---

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?

 Documentation/git-svn.txt |    3 +++
 git-svn.perl              |   33 ++++++++++++++++++---------------
 2 files changed, 21 insertions(+), 15 deletions(-)
Show changes to 2 files +21 −15

Documentation/git-svn.txt, git-svn.perl

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 {
David Kågedal· May 3, 2007, 06:48 UTC · re: Karl Hasselström · lore

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

Karl Hasselström <kha@treskal.com> writes:
Show 14 quoted lines
> 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!
>
> Signed-off-by: Karl Hasselström <kha@treskal.com>
> ---
>
> 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?

I don't agree. The rebase behaviour makes perfect sense in the normal case, and I've been using it without problems. The special case is when you start using stgit, so that's when you need to tell dcommit to do something out of the ordinary.

Other than that, I like your patch.  But you knew that already :-)
-- 
David Kågedal
Seth Falcon· May 3, 2007, 15:53 UTC · re: David Kågedal · lore

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

David Kågedal <davidk@lysator.liu.se> writes:
Show 21 quoted lines
> Karl Hasselström <kha@treskal.com> writes:
>
>> 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!
>>
>> Signed-off-by: Karl Hasselström <kha@treskal.com>
>> ---
>>
>> 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?
>
> I don't agree.  The rebase behaviour makes perfect sense in the normal
> case, and I've been using it without problems.  The special case is
> when you start using stgit, so that's when you need to tell dcommit to
> do something out of the ordinary.

I'm happy with git-svn dcommit's current behavior. Since it is git-svn and not git-stGIT, I'm not in favor of changing a default to make a stGIT use case more convenient.

+ seth
Eric Wong· May 4, 2007, 07:59 UTC · re: Karl Hasselström · lore

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

Karl Hasselström <kha@treskal.com> wrote:
Show 6 quoted lines
> 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 <normalperson@yhbt.net>
Show 86 quoted lines
> Signed-off-by: Karl Hasselström <kha@treskal.com>
> ---
> 
> 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?
> 
>  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
Eric Wong· May 4, 2007, 08:04 UTC · re: Eric Wong · lore

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

Eric Wong <normalperson@yhbt.net> wrote:
Show 19 quoted lines
> Karl Hasselström <kha@treskal.com> 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 <normalperson@yhbt.net>
> 
> > Signed-off-by: Karl Hasselström <kha@treskal.com>
> > ---
> > 
> > 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.

Show 77 quoted lines
> >  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
Karl Hasselström· May 4, 2007, 10:26 UTC · re: Eric Wong · lore

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

On 2007-05-04 01:04:24 -0700, Eric Wong wrote:
> Erm, sorry, I skipped over this part. No. I like rebase being the
> default behavior.
As did everyone else. So I guess that's settled, then. :-)
-- 
Karl Hasselström, kha@treskal.com
      www.treskal.com/kalle
David Kågedal· May 4, 2007, 09:08 UTC · re: Eric Wong · lore

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

Eric Wong <normalperson@yhbt.net> writes:
Show 9 quoted lines
> Karl Hasselström <kha@treskal.com> 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.

One thing I haven't figured out, although I haven't looked at the code much, is this: When does git-svn do a merge rather than a rebase? How can there ever be a diff? Is this perhaps something that can happen if you use set-tree, because I don't see how it happens with dcommit.

-- 
David Kågedal

← back to recent threads