fsck: --no-dangling omits "dangling object" information
authorJunio C Hamano <gitster@pobox.com>
Tue, 28 Feb 2012 22:55:39 +0000 (14:55 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 28 Feb 2012 22:55:39 +0000 (14:55 -0800)
The default output from "fsck" is often overwhelmed by informational
message on dangling objects, especially if you do not repack often, and a
real error can easily be buried.

Add "--no-dangling" option to omit them, and update the user manual to
demonstrate its use.

Based on a patch by Clemens Buchacher, but reverted the part to change
the default to --no-dangling, which is unsuitable for the first patch.
The usual three-step procedure to break the backward compatibility over
time needs to happen on top of this, if we were to go in that direction.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-fsck.txt
Documentation/git-repack.txt
Documentation/user-manual.txt
builtin/fsck.c
t/t1450-fsck.sh

index 6c47395..47e2f19 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 [verse]
 'git fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
         [--[no-]full] [--strict] [--verbose] [--lost-found]
-        [--[no-]progress] [<object>*]
+        [--[no-]dangling] [--[no-]progress] [<object>*]
 
 DESCRIPTION
 -----------
@@ -30,6 +30,11 @@ index file, all SHA1 references in .git/refs/*, and all reflogs (unless
        Print out objects that exist but that aren't reachable from any
        of the reference nodes.
 
+--dangling::
+--no-dangling::
+       Print objects that exist but that are never 'directly' used (default).
+       `--no-dangling` can be used to squech this information from the output.
+
 --root::
        Report root nodes.
 
index 40af321..4c1aff6 100644 (file)
@@ -34,7 +34,7 @@ OPTIONS
        Especially useful when packing a repository that is used
        for private development. Use
        with '-d'.  This will clean up the objects that `git prune`
-       leaves behind, but `git fsck --full` shows as
+       leaves behind, but `git fsck --full --dangling` shows as
        dangling.
 +
 Note that users fetching over dumb protocols will have to fetch the
index f13a846..6c7fee7 100644 (file)
@@ -1582,7 +1582,7 @@ Checking the repository for corruption
 
 The linkgit:git-fsck[1] command runs a number of self-consistency checks
 on the repository, and reports on any problems.  This may take some
-time.  The most common warning by far is about "dangling" objects:
+time.
 
 -------------------------------------------------
 $ git fsck
@@ -1597,9 +1597,11 @@ dangling tree b24c2473f1fd3d91352a624795be026d64c8841f
 ...
 -------------------------------------------------
 
-Dangling objects are not a problem.  At worst they may take up a little
-extra disk space.  They can sometimes provide a last-resort method for
-recovering lost work--see <<dangling-objects>> for details.
+You will see informational messages on dangling objects. They are objects
+that still exist in the repository but are no longer referenced by any of
+your branches, and can (and will) be removed after a while with "gc".
+You can run `git fsck --no-dangling` to supress these messages, and still
+view real errors.
 
 [[recovering-lost-changes]]
 Recovering lost changes
@@ -3295,15 +3297,12 @@ it is with linkgit:git-fsck[1]; this may be time-consuming.
 Assume the output looks like this:
 
 ------------------------------------------------
-$ git fsck --full
+$ git fsck --full --no-dangling
 broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
               to    blob 4b9458b3786228369c63936db65827de3cc06200
 missing blob 4b9458b3786228369c63936db65827de3cc06200
 ------------------------------------------------
 
-(Typically there will be some "dangling object" messages too, but they
-aren't interesting.)
-
 Now you know that blob 4b9458b3 is missing, and that the tree 2d9263c6
 points to it.  If you could find just one copy of that missing blob
 object, possibly in some other repository, you could move it into
index 8c479a7..67eb553 100644 (file)
@@ -29,6 +29,7 @@ static int errors_found;
 static int write_lost_and_found;
 static int verbose;
 static int show_progress = -1;
+static int show_dangling = 1;
 #define ERROR_OBJECT 01
 #define ERROR_REACHABLE 02
 #define ERROR_PACK 04
@@ -221,8 +222,9 @@ static void check_unreachable_object(struct object *obj)
         * start looking at, for example.
         */
        if (!obj->used) {
-               printf("dangling %s %s\n", typename(obj->type),
-                      sha1_to_hex(obj->sha1));
+               if (show_dangling)
+                       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",
@@ -614,6 +616,7 @@ static char const * const fsck_usage[] = {
 static struct option fsck_opts[] = {
        OPT__VERBOSE(&verbose, "be verbose"),
        OPT_BOOLEAN(0, "unreachable", &show_unreachable, "show unreachable objects"),
+       OPT_BOOL(0, "dangling", &show_dangling, "show dangling objects"),
        OPT_BOOLEAN(0, "tags", &show_tags, "report tags"),
        OPT_BOOLEAN(0, "root", &show_root, "report root nodes"),
        OPT_BOOLEAN(0, "cache", &keep_cache_objects, "make index objects head nodes"),
index 5b8ebd8..5b79c51 100755 (executable)
@@ -27,12 +27,8 @@ test_expect_success 'loose objects borrowed from alternate are not missing' '
                git init &&
                echo ../../../.git/objects >.git/objects/info/alternates &&
                test_commit C fileC one &&
-               git fsck >../out 2>&1
+               git fsck --no-dangling >../actual 2>&1
        ) &&
-       {
-               grep -v dangling out >actual ||
-               :
-       } &&
        test_cmp empty actual
 '