Browse Source

fsck: --no-dangling omits "dangling object" information

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>
maint
Junio C Hamano 13 years ago
parent
commit
c6a13b2c86
  1. 7
      Documentation/git-fsck.txt
  2. 2
      Documentation/git-repack.txt
  3. 15
      Documentation/user-manual.txt
  4. 7
      builtin/fsck.c
  5. 6
      t/t1450-fsck.sh

7
Documentation/git-fsck.txt

@ -11,7 +11,7 @@ SYNOPSIS @@ -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 @@ -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.


2
Documentation/git-repack.txt

@ -34,7 +34,7 @@ OPTIONS @@ -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

15
Documentation/user-manual.txt

@ -1582,7 +1582,7 @@ Checking the repository for corruption @@ -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 @@ -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. @@ -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

7
builtin/fsck.c

@ -29,6 +29,7 @@ static int errors_found; @@ -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) @@ -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[] = { @@ -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"),

6
t/t1450-fsck.sh

@ -27,12 +27,8 @@ test_expect_success 'loose objects borrowed from alternate are not missing' ' @@ -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
'


Loading…
Cancel
Save