зеркало из https://github.com/microsoft/git.git
git-svn: add the 'dcommit' command
This is a high-level wrapper around the 'commit-diff' command and used to produce cleaner history against the mirrored repository through rebase/reset usage. It's basically a more polished version of this: for i in `git rev-list --no-merges remotes/git-svn..HEAD | tac`; do git-svn commit-diff $i~1 $i done git reset --hard remotes/git-svn Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
2e93115ed8
Коммит
b22d449721
|
@ -54,6 +54,15 @@ remotes/git-svn.
|
||||||
See '<<fetch-args,Additional Fetch Arguments>>' if you are interested in
|
See '<<fetch-args,Additional Fetch Arguments>>' if you are interested in
|
||||||
manually joining branches on commit.
|
manually joining branches on commit.
|
||||||
|
|
||||||
|
'dcommit'::
|
||||||
|
Commit all diffs from the current HEAD directly to the SVN
|
||||||
|
repository, and then rebase or reset (depending on whether or
|
||||||
|
not there is a diff between SVN and HEAD). It is recommended
|
||||||
|
that you run git-svn fetch and rebase (not pull) your commits
|
||||||
|
against the latest changes in the SVN repository.
|
||||||
|
This is advantageous over 'commit' (below) because it produces
|
||||||
|
cleaner, more linear history.
|
||||||
|
|
||||||
'commit'::
|
'commit'::
|
||||||
Commit specified commit or tree objects to SVN. This relies on
|
Commit specified commit or tree objects to SVN. This relies on
|
||||||
your imported fetch data being up-to-date. This makes
|
your imported fetch data being up-to-date. This makes
|
||||||
|
@ -157,6 +166,24 @@ after the authors-file is modified should continue operation.
|
||||||
|
|
||||||
repo-config key: svn.authors-file
|
repo-config key: svn.authors-file
|
||||||
|
|
||||||
|
-m::
|
||||||
|
--merge::
|
||||||
|
-s<strategy>::
|
||||||
|
--strategy=<strategy>::
|
||||||
|
|
||||||
|
These are only used with the 'dcommit' command.
|
||||||
|
|
||||||
|
Passed directly to git-rebase when using 'dcommit' if a
|
||||||
|
'git-reset' cannot be used (see dcommit).
|
||||||
|
|
||||||
|
-n::
|
||||||
|
--dry-run::
|
||||||
|
|
||||||
|
This is only used with the 'dcommit' command.
|
||||||
|
|
||||||
|
Print out the series of git arguments that would show
|
||||||
|
which diffs would be committed to SVN.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
ADVANCED OPTIONS
|
ADVANCED OPTIONS
|
||||||
|
|
35
git-svn.perl
35
git-svn.perl
|
@ -51,7 +51,8 @@ my ($_revision,$_stdin,$_no_ignore_ext,$_no_stop_copy,$_help,$_rmdir,$_edit,
|
||||||
$_message, $_file, $_follow_parent, $_no_metadata,
|
$_message, $_file, $_follow_parent, $_no_metadata,
|
||||||
$_template, $_shared, $_no_default_regex, $_no_graft_copy,
|
$_template, $_shared, $_no_default_regex, $_no_graft_copy,
|
||||||
$_limit, $_verbose, $_incremental, $_oneline, $_l_fmt, $_show_commit,
|
$_limit, $_verbose, $_incremental, $_oneline, $_l_fmt, $_show_commit,
|
||||||
$_version, $_upgrade, $_authors, $_branch_all_refs, @_opt_m);
|
$_version, $_upgrade, $_authors, $_branch_all_refs, @_opt_m,
|
||||||
|
$_merge, $_strategy, $_dry_run);
|
||||||
my (@_branch_from, %tree_map, %users, %rusers, %equiv);
|
my (@_branch_from, %tree_map, %users, %rusers, %equiv);
|
||||||
my ($_svn_co_url_revs, $_svn_pg_peg_revs);
|
my ($_svn_co_url_revs, $_svn_pg_peg_revs);
|
||||||
my @repo_path_split_cache;
|
my @repo_path_split_cache;
|
||||||
|
@ -118,6 +119,11 @@ my %cmd = (
|
||||||
{ 'message|m=s' => \$_message,
|
{ 'message|m=s' => \$_message,
|
||||||
'file|F=s' => \$_file,
|
'file|F=s' => \$_file,
|
||||||
%cmt_opts } ],
|
%cmt_opts } ],
|
||||||
|
dcommit => [ \&dcommit, 'Commit several diffs to merge with upstream',
|
||||||
|
{ 'merge|m|M' => \$_merge,
|
||||||
|
'strategy|s=s' => \$_strategy,
|
||||||
|
'dry-run|n' => \$_dry_run,
|
||||||
|
%cmt_opts } ],
|
||||||
);
|
);
|
||||||
|
|
||||||
my $cmd;
|
my $cmd;
|
||||||
|
@ -561,6 +567,33 @@ sub commit_lib {
|
||||||
unlink $commit_msg;
|
unlink $commit_msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub dcommit {
|
||||||
|
my $gs = "refs/remotes/$GIT_SVN";
|
||||||
|
chomp(my @refs = safe_qx(qw/git-rev-list --no-merges/, "$gs..HEAD"));
|
||||||
|
foreach my $d (reverse @refs) {
|
||||||
|
if ($_dry_run) {
|
||||||
|
print "diff-tree $d~1 $d\n";
|
||||||
|
} else {
|
||||||
|
commit_diff("$d~1", $d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return if $_dry_run;
|
||||||
|
fetch();
|
||||||
|
my @diff = safe_qx(qw/git-diff-tree HEAD/, $gs);
|
||||||
|
my @finish;
|
||||||
|
if (@diff) {
|
||||||
|
@finish = qw/rebase/;
|
||||||
|
push @finish, qw/--merge/ if $_merge;
|
||||||
|
push @finish, "--strategy=$_strategy" if $_strategy;
|
||||||
|
print STDERR "W: HEAD and $gs differ, using @finish:\n", @diff;
|
||||||
|
} else {
|
||||||
|
print "No changes between current HEAD and $gs\n",
|
||||||
|
"Hard resetting to the latest $gs\n";
|
||||||
|
@finish = qw/reset --hard/;
|
||||||
|
}
|
||||||
|
sys('git', @finish, $gs);
|
||||||
|
}
|
||||||
|
|
||||||
sub show_ignore {
|
sub show_ignore {
|
||||||
$SVN_URL ||= file_to_s("$GIT_SVN_DIR/info/url");
|
$SVN_URL ||= file_to_s("$GIT_SVN_DIR/info/url");
|
||||||
$_use_lib ? show_ignore_lib() : show_ignore_cmd();
|
$_use_lib ? show_ignore_lib() : show_ignore_cmd();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче