git-svn: replace .rev_db with a more space-efficient .rev_map format
Migrations are done automatically on an as-needed basis when new revisions are to be fetched. Stale remote branches do not get migrated, yet. However, unless you set noMetadata or useSvkProps it's safe to just do: find $GIT_DIR/svn -name '.rev_db*' -print0 | xargs rm -f to purge all the old .rev_db files. The new format is a one-way migration and is NOT compatible with old versions of git-svn. This is the replacement for the rev_db format, which was too big and inefficient for large repositories with a lot of sparse history (mainly tags). The format is this: - 24 bytes for every record, * 4 bytes for the integer representing an SVN revision number * 20 bytes representing the sha1 of a git commit - No empty padding records like the old format - new records are written append-only since SVN revision numbers increase monotonically - lookups on SVN revision number are done via a binary search - Piping the file to xxd(1) -c24 is a good way of dumping it for viewing or editing, should the need ever arise. As with .rev_db, these files are disposable unless noMetadata or useSvmProps is set. Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
591aa2536f
commit
060610c572
@ -82,3 +82,29 @@ stop_httpd () {
|
||||
test -z "$SVN_HTTPD_PORT" && return
|
||||
"$SVN_HTTPD_PATH" -f "$GIT_DIR"/httpd.conf -k stop
|
||||
}
|
||||
|
||||
convert_to_rev_db () {
|
||||
perl -w -- - "$@" <<\EOF
|
||||
use strict;
|
||||
@ARGV == 2 or die "Usage: convert_to_rev_db <input> <output>";
|
||||
open my $wr, '+>', $ARGV[1] or die "$!: couldn't open: $ARGV[1]";
|
||||
open my $rd, '<', $ARGV[0] or die "$!: couldn't open: $ARGV[0]";
|
||||
my $size = (stat($rd))[7];
|
||||
($size % 24) == 0 or die "Inconsistent size: $size";
|
||||
while (sysread($rd, my $buf, 24) == 24) {
|
||||
my ($r, $c) = unpack('NH40', $buf);
|
||||
my $offset = $r * 41;
|
||||
seek $wr, 0, 2 or die $!;
|
||||
my $pos = tell $wr;
|
||||
if ($pos < $offset) {
|
||||
for (1 .. (($offset - $pos) / 41)) {
|
||||
print $wr (('0' x 40),"\n") or die $!;
|
||||
}
|
||||
}
|
||||
seek $wr, $offset, 0 or die $!;
|
||||
print $wr $c,"\n" or die $!;
|
||||
}
|
||||
close $wr or die $!;
|
||||
close $rd or die $!;
|
||||
EOF
|
||||
}
|
||||
|
Reference in New Issue
Block a user