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]
|
[verse]
|
||||||
'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
|
'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
|
||||||
[--full] [--strict] [--verbose] [<object>*]
|
[--full] [--strict] [--verbose] [--lost-found] [<object>*]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -64,6 +64,10 @@ index file and all SHA1 references in .git/refs/* as heads.
|
|||||||
--verbose::
|
--verbose::
|
||||||
Be chatty.
|
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
|
It tests SHA1 and general object sanity, and it does full tracking of
|
||||||
the resulting reachability and everything else. It prints out any
|
the resulting reachability and everything else. It prints out any
|
||||||
corruption it finds (missing or bad objects), and if you use the
|
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 int keep_cache_objects;
|
||||||
static unsigned char head_sha1[20];
|
static unsigned char head_sha1[20];
|
||||||
static int errors_found;
|
static int errors_found;
|
||||||
|
static int write_lost_and_found;
|
||||||
static int verbose;
|
static int verbose;
|
||||||
#define ERROR_OBJECT 01
|
#define ERROR_OBJECT 01
|
||||||
#define ERROR_REACHABLE 02
|
#define ERROR_REACHABLE 02
|
||||||
@ -138,6 +139,21 @@ static void check_unreachable_object(struct object *obj)
|
|||||||
if (!obj->used) {
|
if (!obj->used) {
|
||||||
printf("dangling %s %s\n", typename(obj->type),
|
printf("dangling %s %s\n", typename(obj->type),
|
||||||
sha1_to_hex(obj->sha1));
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -685,6 +701,12 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
|
|||||||
verbose = 1;
|
verbose = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arg, "--lost-found")) {
|
||||||
|
check_full = 1;
|
||||||
|
include_reflogs = 0;
|
||||||
|
write_lost_and_found = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (*arg == '-')
|
if (*arg == '-')
|
||||||
usage(fsck_usage);
|
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