mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
SVN import: Use one log call
One "svn log" (or its equivalent) per revision adds delay and server load. Instead, open two SVN connections -- one for the log, and one for the files. Positive side effect: Only those log entries which actually contain data are committed => no more empty commits. Also, change the "-l" option to set the maximum revision to be pulled, not the number of revisions. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
b020dcd54c
commit
034908047d
|
@ -10,7 +10,7 @@ git-svnimport - Import a SVN repository into git
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
|
'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
|
||||||
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_nr_changes]
|
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
|
||||||
[ -b branch_subdir ] [ -t trunk_subdir ] [ -T tag_subdir ]
|
[ -b branch_subdir ] [ -t trunk_subdir ] [ -T tag_subdir ]
|
||||||
[ -s start_chg ] [ -m ] [ -M regex ]
|
[ -s start_chg ] [ -m ] [ -M regex ]
|
||||||
<SVN_repository_URL> [ <path> ]
|
<SVN_repository_URL> [ <path> ]
|
||||||
|
@ -71,14 +71,11 @@ When importing incementally, you might need to edit the .git/svn2git file.
|
||||||
regex. It can be used with -m to also see the default regexes.
|
regex. It can be used with -m to also see the default regexes.
|
||||||
You must escape forward slashes.
|
You must escape forward slashes.
|
||||||
|
|
||||||
-l <max_num_changes>::
|
-l <max_rev>::
|
||||||
Limit the number of SVN changesets we pull before quitting.
|
Specify a maximum revision number to pull.
|
||||||
This option is necessary because the SVN library has serious memory
|
|
||||||
leaks; the recommended value for nontrivial imports is 100.
|
|
||||||
|
|
||||||
git-svnimport will still exit with a zero exit code. You can check
|
Formerly, this option controlled how many revisions to pull, due to
|
||||||
the size of the file ".git/svn2git" to determine whether to call
|
SVN memory leaks. (These have been worked around.)
|
||||||
the importer again.
|
|
||||||
|
|
||||||
-v::
|
-v::
|
||||||
Verbosity: let 'svnimport' report what it is doing.
|
Verbosity: let 'svnimport' report what it is doing.
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
sub usage() {
|
sub usage() {
|
||||||
print STDERR <<END;
|
print STDERR <<END;
|
||||||
Usage: ${\basename $0} # fetch/update GIT from SVN
|
Usage: ${\basename $0} # fetch/update GIT from SVN
|
||||||
[-o branch-for-HEAD] [-h] [-v] [-l max_num_changes]
|
[-o branch-for-HEAD] [-h] [-v] [-l max_rev]
|
||||||
[-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
|
[-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
|
||||||
[-d|-D] [-i] [-u] [-s start_chg] [-m] [-M regex] [SVN_URL]
|
[-d|-D] [-i] [-u] [-s start_chg] [-m] [-M regex] [SVN_URL]
|
||||||
END
|
END
|
||||||
|
@ -126,8 +126,9 @@ sub file {
|
||||||
package main;
|
package main;
|
||||||
use URI;
|
use URI;
|
||||||
|
|
||||||
my $svn = $svn_url;
|
our $svn = $svn_url;
|
||||||
$svn .= "/$svn_dir" if defined $svn_dir;
|
$svn .= "/$svn_dir" if defined $svn_dir;
|
||||||
|
my $svn2 = SVNconn->new($svn);
|
||||||
$svn = SVNconn->new($svn);
|
$svn = SVNconn->new($svn);
|
||||||
|
|
||||||
my $lwp_ua;
|
my $lwp_ua;
|
||||||
|
@ -198,7 +199,7 @@ ($$)
|
||||||
my $maxnum = 0;
|
my $maxnum = 0;
|
||||||
my $last_rev = "";
|
my $last_rev = "";
|
||||||
my $last_branch;
|
my $last_branch;
|
||||||
my $current_rev = $opt_s-1;
|
my $current_rev = $opt_s || 1;
|
||||||
unless(-d $git_dir) {
|
unless(-d $git_dir) {
|
||||||
system("git-init-db");
|
system("git-init-db");
|
||||||
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
|
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
|
||||||
|
@ -254,7 +255,7 @@ ($$)
|
||||||
my($num,$branch,$ref) = split;
|
my($num,$branch,$ref) = split;
|
||||||
$branches{$branch}{$num} = $ref;
|
$branches{$branch}{$num} = $ref;
|
||||||
$branches{$branch}{"LAST"} = $ref;
|
$branches{$branch}{"LAST"} = $ref;
|
||||||
$current_rev = $num if $current_rev < $num;
|
$current_rev = $num+1 if $current_rev <= $num;
|
||||||
}
|
}
|
||||||
close($B);
|
close($B);
|
||||||
}
|
}
|
||||||
|
@ -708,17 +709,17 @@ sub commit {
|
||||||
print "DONE: $revision $dest $cid\n" if $opt_v;
|
print "DONE: $revision $dest $cid\n" if $opt_v;
|
||||||
}
|
}
|
||||||
|
|
||||||
my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
|
sub commit_all {
|
||||||
sub _commit_all {
|
# Recursive use of the SVN connection does not work
|
||||||
($changed_paths, $revision, $author, $date, $message, $pool) = @_;
|
local $svn = $svn2;
|
||||||
|
|
||||||
|
my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
|
||||||
my %p;
|
my %p;
|
||||||
while(my($path,$action) = each %$changed_paths) {
|
while(my($path,$action) = each %$changed_paths) {
|
||||||
$p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ];
|
$p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ];
|
||||||
}
|
}
|
||||||
$changed_paths = \%p;
|
$changed_paths = \%p;
|
||||||
}
|
|
||||||
|
|
||||||
sub commit_all {
|
|
||||||
my %done;
|
my %done;
|
||||||
my @col;
|
my @col;
|
||||||
my $pref;
|
my $pref;
|
||||||
|
@ -734,18 +735,12 @@ sub commit_all {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while(++$current_rev <= $svn->{'maxrev'}) {
|
$opt_l = $svn->{'maxrev'} if not defined $opt_l or $opt_l > $svn->{'maxrev'};
|
||||||
if (defined $opt_l) {
|
print "Fetching from $current_rev to $opt_l ...\n" if $opt_v;
|
||||||
$opt_l--;
|
|
||||||
if ($opt_l < 0) {
|
my $pool=SVN::Pool->new;
|
||||||
last;
|
$svn->{'svn'}->get_log("/",$current_rev,$opt_l,0,1,1,\&commit_all,$pool);
|
||||||
}
|
$pool->clear;
|
||||||
}
|
|
||||||
my $pool=SVN::Pool->new;
|
|
||||||
$svn->{'svn'}->get_log("/",$current_rev,$current_rev,1,1,1,\&_commit_all,$pool);
|
|
||||||
$pool->clear;
|
|
||||||
commit_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unlink($git_index);
|
unlink($git_index);
|
||||||
|
|
Loading…
Reference in a new issue