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>
This commit is contained in:
parent
2dee581667
commit
2b86976bfd
@ -13,10 +13,11 @@ SYNOPSIS
|
|||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
This runs `git-fsck-objects --unreachable` using the heads
|
This runs `git-fsck-objects --unreachable` using all the refs
|
||||||
specified on the command line (or `$GIT_DIR/refs/heads/\*` and
|
available in `$GIT_DIR/refs`, optionally with additional set of
|
||||||
`$GIT_DIR/refs/tags/\*` if none is specified), and prunes all
|
objects specified on the command line, and prunes all
|
||||||
unreachable objects from the object database. In addition, it
|
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
|
prunes the unpacked objects that are also found in packs by
|
||||||
running `git prune-packed`.
|
running `git prune-packed`.
|
||||||
|
|
||||||
@ -31,29 +32,19 @@ OPTIONS
|
|||||||
Do not interpret any more arguments as options.
|
Do not interpret any more arguments as options.
|
||||||
|
|
||||||
<head>...::
|
<head>...::
|
||||||
Instead of keeping objects
|
In addition to objects
|
||||||
reachable from any of our references, keep objects
|
reachable from any of our references, keep objects
|
||||||
reachable from only listed <head>s.
|
reachable from 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.
|
|
||||||
|
|
||||||
|
|
||||||
EXAMPLE
|
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
|
borrows from your repository via its
|
||||||
`.git/objects/info/alternates`:
|
`.git/objects/info/alternates`:
|
||||||
|
|
||||||
------------
|
------------
|
||||||
$ git prune $(git-rev-parse --all) \
|
$ git prune $(cd ../another && $(git-rev-parse --all))
|
||||||
$(cd ../another && $(git-rev-parse --all))
|
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Author
|
Author
|
||||||
|
@ -16,7 +16,11 @@ do
|
|||||||
done
|
done
|
||||||
|
|
||||||
sync
|
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 /{
|
sed -ne '/unreachable /{
|
||||||
s/unreachable [^ ][^ ]* //
|
s/unreachable [^ ][^ ]* //
|
||||||
s|\(..\)|\1/|p
|
s|\(..\)|\1/|p
|
||||||
|
Loading…
Reference in New Issue
Block a user