diff options
author | Junio C Hamano <junkio@cox.net> | 2005-12-08 23:18:41 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-12-08 23:18:41 -0800 |
commit | 2b86976bfd6e42609692d57fffaef72bd985c23a (patch) | |
tree | c0839ba1ec37f195a19a5cca13cf6fe499088494 | |
parent | qsort(): ptrdiff_t may be larger than int (diff) | |
download | tgif-2b86976bfd6e42609692d57fffaef72bd985c23a.tar.xz |
git-prune: never lose objects reachable from our refs.
Explicit <head> arguments to git-prune replaces, instead of
extends, the list of heads used for reachability analysis by
fsck-objects. By giving a subset of heads by mistake, objects
reachable only from other heads can be removed, resulting in a
corrupted repository.
This commit stops replacing the list of heads, and makes the
command line arguments to add to them instead for safety.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | Documentation/git-prune.txt | 27 | ||||
-rwxr-xr-x | git-prune.sh | 6 |
2 files changed, 14 insertions, 19 deletions
diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt index 05c8d4928e..f694fcbde8 100644 --- a/Documentation/git-prune.txt +++ b/Documentation/git-prune.txt @@ -13,10 +13,11 @@ SYNOPSIS DESCRIPTION ----------- -This runs `git-fsck-objects --unreachable` using the heads -specified on the command line (or `$GIT_DIR/refs/heads/\*` and -`$GIT_DIR/refs/tags/\*` if none is specified), and prunes all -unreachable objects from the object database. In addition, it +This runs `git-fsck-objects --unreachable` using all the refs +available in `$GIT_DIR/refs`, optionally with additional set of +objects specified on the command line, and prunes all +objects unreachable from any of these head objects from the object database. +In addition, it prunes the unpacked objects that are also found in packs by running `git prune-packed`. @@ -31,29 +32,19 @@ OPTIONS Do not interpret any more arguments as options. <head>...:: - Instead of keeping objects + In addition to objects reachable from any of our references, keep objects - reachable from only listed <head>s. -+ -Note that the explicitly named <head>s are *not* appended to the -default set of references, but they replace them. In general you -would want to say `git prune $(git-rev-parse --all) extra1 -extra2` to keep chains of commits leading to extra1, extra2, -... in addition to what are reachable from your own refs. -Saying `git prune extra1 extra2` would *lose* objects reachable -only from the usual refs, which is usually not what you want. - + reachable from listed <head>s. EXAMPLE ------- -To prune objects not used by your repository and another that +To prune objects not used by your repository nor another that borrows from your repository via its `.git/objects/info/alternates`: ------------ -$ git prune $(git-rev-parse --all) \ - $(cd ../another && $(git-rev-parse --all)) +$ git prune $(cd ../another && $(git-rev-parse --all)) ------------ Author diff --git a/git-prune.sh b/git-prune.sh index 1fd8c731cd..7e7f0ad56d 100755 --- a/git-prune.sh +++ b/git-prune.sh @@ -16,7 +16,11 @@ do done sync -git-fsck-objects --full --cache --unreachable "$@" | +case "$#" in +0) git-fsck-objects --full --cache --unreachable ;; +*) git-fsck-objects --full --cache --unreachable $(git-rev-parse --all) "$@" ;; +esac | + sed -ne '/unreachable /{ s/unreachable [^ ][^ ]* // s|\(..\)|\1/|p |