"git-svn dcommit" ends up making an arbitrary decision when pushing back merges. Allow the user to specify which one is used, albeit in a rather hack-ish way. --- Documentation/git-svn.txt | 11 +++++++++++ git-svn.perl | 16 +++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index c0d7d95..3e64522 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -69,6 +69,17 @@ COMMANDS argument if that is what you want. This is useful if you wish to track multiple projects that share a common repository. +-B<svn_branch>;; +--branch=<svn_branch>;; + Normally, git-svn is capable of figuring out which branch you + are working on. However, if you are doing merges between svn + branches using git then the decision about which branch to + dcommit to will end up being made based on which of the + branches you are merging has the newest upstream commit. This + option enables a global filter that tells git-svn what to look + for in the git-svn-id: line - specify a repository UUID or a + branch name here. So, it may be used with "git-svn log", + "git-svn dcommit", etc. 'fetch':: Fetch unfetched revisions from the Subversion remote we are diff --git a/git-svn.perl b/git-svn.perl index e350061..b667f80 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -54,7 +54,7 @@ $sha1 = qr/[a-f\d]{40}/; $sha1_short = qr/[a-f\d]{4,40}/; my ($_stdin, $_help, $_edit, $_message, $_file, - $_template, $_shared, + $_template, $_shared, $_branch, $_version, $_fetch_all, $_no_rebase, $_merge, $_strategy, $_dry_run, $_local, $_prefix, $_no_checkout, $_verbose); @@ -69,6 +69,7 @@ my %fc_opts = ( 'follow-parent|follow!' => \$Git::SVN::_follow_parent, 'useSvmProps' => \$Git::SVN::_use_svm_props, 'useSvnsyncProps' => \$Git::SVN::_use_svnsync_props, 'log-window-size=i' => \$Git::SVN::Ra::_log_window_size, + 'branch|B=s' => \$_branch, 'no-checkout' => \$_no_checkout, 'quiet|q' => \$_q, 'repack-flags|repack-args|repack-opts=s' => @@ -367,7 +368,7 @@ sub cmd_dcommit { my $head = shift; $head ||= 'HEAD'; my @refs; - my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs); + my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs, $_branch); unless ($gs) { die "Unable to determine upstream SVN information from ", "$head history\n"; @@ -441,7 +442,7 @@ sub cmd_find_rev { my $head = shift; $head ||= 'HEAD'; my @refs; - my (undef, undef, undef, $gs) = working_head_info($head, \@refs); + my (undef, undef, undef, $gs) = working_head_info($head, \@refs, $_branch); unless ($gs) { die "Unable to determine upstream SVN information from ", "$head history\n"; @@ -457,7 +458,7 @@ sub cmd_find_rev { sub cmd_rebase { command_noisy(qw/update-index --refresh/); - my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); + my ($url, $rev, $uuid, $gs) = working_head_info('HEAD', undef, $_branch); unless ($gs) { die "Unable to determine upstream SVN information from ", "working tree history\n"; @@ -474,7 +475,7 @@ sub cmd_rebase { } sub cmd_show_ignore { - my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); + my ($url, $rev, $uuid, $gs) = working_head_info('HEAD', undef, $_branch); $gs ||= Git::SVN->new; my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum); $gs->traverse_ignore(\*STDOUT, $gs->{path}, $r); @@ -801,11 +802,12 @@ sub cmt_metadata { } sub working_head_info { - my ($head, $refs) = @_; + my ($head, $refs, $grep) = @_; my ($fh, $ctx) = command_output_pipe('rev-list', $head); while (my $hash = <$fh>) { chomp($hash); my ($url, $rev, $uuid) = cmt_metadata($hash); + next unless (!$grep or $url =~ m{$grep} or $uuid =~ m{$grep}); if (defined $url && defined $rev) { if (my $gs = Git::SVN->find_by_url($url)) { my $c = $gs->rev_db_get($rev); @@ -3394,7 +3396,7 @@ sub git_svn_log_cmd { last; } - my ($url, $rev, $uuid, $gs) = ::working_head_info($head); + my ($url, $rev, $uuid, $gs) = ::working_head_info($head, undef, $_branch); $gs ||= Git::SVN->_new; my @cmd = (qw/log --abbrev-commit --pretty=raw --default/, $gs->refname); -- 1.5.2.0.45.gfea6d-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html