-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Git-prune-script loses blobs referenced from an uncommitted cache.
(updated from the version posted to GIT mailing list). When a new blob is registered with update-cache, and before the cache is written as a tree and committed, git-fsck-cache will find the blob unreachable. This patch adds a new flag, "--cache" to git-fsck-cache, with which it keeps such blobs from considered "unreachable". The git-prune-script is updated to use this new flag. At the same time it adds .git/refs/*/* to the set of default locations to look for heads, which should be consistent with expectations from Cogito users. Without this fix, "diff-cache -p --cached" after git-prune-script has pruned the blob object will fail mysteriously and git-write-tree would also fail. Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Junio C Hamano
committed
May 4, 2005
1 parent
fd0ffd3
commit ae7c0c9
Showing
2 changed files
with
60 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,37 @@ | ||
#!/bin/sh | ||
git-fsck-cache --unreachable $(cat .git/HEAD ) | grep unreachable | cut -d' ' -f3 | sed 's:^\(..\):.git/objects/\1/:' | xargs rm | ||
|
||
dryrun= | ||
while case "$#" in 0) break ;; esac | ||
do | ||
case "$1" in | ||
-n) dryrun=echo ;; | ||
--) break ;; | ||
-*) echo >&2 "usage: git-prune-script [ -n ] [ heads... ]"; exit 1 ;; | ||
*) break ;; | ||
esac | ||
shift; | ||
done | ||
|
||
# Defaulting to include .git/refs/*/* may be debatable from the | ||
# purist POV but power users can always give explicit parameters | ||
# to the script anyway. | ||
|
||
case "$#" in | ||
0) | ||
x_40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' | ||
x_40="$x_40$x_40$x_40$x_40$x_40$x_40$x_40$x_40" | ||
set x $(sed -ne "/^$x_40\$/p" .git/HEAD .git/refs/*/* 2>/dev/null) | ||
shift ;; | ||
esac | ||
|
||
git-fsck-cache --cache --unreachable "$@" | | ||
sed -ne '/unreachable /{ | ||
s/unreachable [^ ][^ ]* // | ||
s|\(..\)|\1/|p | ||
}' | { | ||
case "$SHA1_FILE_DIRECTORY" in | ||
'') cd .git/objects/ ;; | ||
*) cd "$SHA1_FILE_DIRECTORY" ;; | ||
esac || exit | ||
xargs -r $dryrun rm -f | ||
} |