git-fsck: add --lost-found option
With this option, dangling objects are not only reported, but also written to .git/lost-found/commit/ or .git/lost-found/other/. This option implies '--full' and '--no-reflogs'. 'git fsck --lost-found' is meant as a replacement for git-lost-found. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1a6f399999
commit
68f6c019fd
@ -10,7 +10,7 @@ SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
|
||||
[--full] [--strict] [--verbose] [<object>*]
|
||||
[--full] [--strict] [--verbose] [--lost-found] [<object>*]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -64,6 +64,10 @@ index file and all SHA1 references in .git/refs/* as heads.
|
||||
--verbose::
|
||||
Be chatty.
|
||||
|
||||
--lost-found::
|
||||
Write dangling refs into .git/commit/ or .git/other/, depending
|
||||
on type.
|
||||
|
||||
It tests SHA1 and general object sanity, and it does full tracking of
|
||||
the resulting reachability and everything else. It prints out any
|
||||
corruption it finds (missing or bad objects), and if you use the
|
||||
|
@ -20,6 +20,7 @@ static int check_strict;
|
||||
static int keep_cache_objects;
|
||||
static unsigned char head_sha1[20];
|
||||
static int errors_found;
|
||||
static int write_lost_and_found;
|
||||
static int verbose;
|
||||
#define ERROR_OBJECT 01
|
||||
#define ERROR_REACHABLE 02
|
||||
@ -138,6 +139,21 @@ static void check_unreachable_object(struct object *obj)
|
||||
if (!obj->used) {
|
||||
printf("dangling %s %s\n", typename(obj->type),
|
||||
sha1_to_hex(obj->sha1));
|
||||
if (write_lost_and_found) {
|
||||
char *filename = git_path("lost-found/%s/%s",
|
||||
obj->type == OBJ_COMMIT ? "commit" : "other",
|
||||
sha1_to_hex(obj->sha1));
|
||||
FILE *f;
|
||||
|
||||
if (safe_create_leading_directories(filename)) {
|
||||
error("Could not create lost-found");
|
||||
return;
|
||||
}
|
||||
if (!(f = fopen(filename, "w")))
|
||||
die("Could not open %s", filename);
|
||||
fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
|
||||
fclose(f);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -685,6 +701,12 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
|
||||
verbose = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--lost-found")) {
|
||||
check_full = 1;
|
||||
include_reflogs = 0;
|
||||
write_lost_and_found = 1;
|
||||
continue;
|
||||
}
|
||||
if (*arg == '-')
|
||||
usage(fsck_usage);
|
||||
}
|
||||
|
35
t/t1420-lost-found.sh
Executable file
35
t/t1420-lost-found.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2007 Johannes E. Schindelin
|
||||
#
|
||||
|
||||
test_description='Test fsck --lost-found'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
git config core.logAllRefUpdates 0 &&
|
||||
: > file1 &&
|
||||
git add file1 &&
|
||||
test_tick &&
|
||||
git commit -m initial &&
|
||||
echo 1 > file1 &&
|
||||
echo 2 > file2 &&
|
||||
git add file1 file2 &&
|
||||
test_tick &&
|
||||
git commit -m second &&
|
||||
echo 3 > file3 &&
|
||||
git add file3
|
||||
'
|
||||
|
||||
test_expect_success 'lost and found something' '
|
||||
git rev-parse HEAD > lost-commit &&
|
||||
git rev-parse :file3 > lost-other &&
|
||||
test_tick &&
|
||||
git reset --hard HEAD^ &&
|
||||
git fsck --lost-found &&
|
||||
test 2 = $(ls .git/lost-found/*/* | wc -l) &&
|
||||
test -f .git/lost-found/commit/$(cat lost-commit) &&
|
||||
test -f .git/lost-found/other/$(cat lost-other)
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user