diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2007-07-03 01:33:54 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-07-02 21:34:12 -0700 |
commit | 68f6c019fd8d49fbaa72f1aeeb21eb921b6a16bf (patch) | |
tree | e02141a138971b76a65a99f4d7d283600bf34c0a /builtin-fsck.c | |
parent | 1a6f3999998a22325ff820bf8c840e3baf3d2281 (diff) | |
download | git-68f6c019fd8d49fbaa72f1aeeb21eb921b6a16bf.tar.gz |
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>
Diffstat (limited to 'builtin-fsck.c')
-rw-r--r-- | builtin-fsck.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/builtin-fsck.c b/builtin-fsck.c index 944a496650..a6ef65ea32 100644 --- a/builtin-fsck.c +++ b/builtin-fsck.c @@ -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); } |