From: Junio C Hamano Date: Mon, 7 Nov 2005 23:15:34 +0000 (-0800) Subject: git-lost+found X-Git-Tag: v0.99.9h^2~3 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=04e7ca1a1bd05e733236734bd7078b4cde1f7ce5;p=git.git git-lost+found This command helps you resurrect accidentally lost tags and commits. Signed-off-by: Junio C Hamano --- diff --git a/Documentation/git-lost+found.txt b/Documentation/git-lost+found.txt new file mode 100644 index 000000000..0cb8e3bbf --- /dev/null +++ b/Documentation/git-lost+found.txt @@ -0,0 +1,78 @@ +git-lost+found(1) +================= + +NAME +---- +git-lost+found - Recover lost refs that luckily have not yet been pruned. + +SYNOPSIS +-------- +'git-lost+found' + +DESCRIPTION +----------- +Finds dangling commits and tags from the object database, and +creates refs to them in .git/lost+found/ directory. Commits and +tags that dereference to commits go to .git/lost+found/commit +and others are stored in .git/lost+found/other directory. + + +OUTPUT +------ +One line description from the commit and tag found along with +their object name are printed on the standard output. + + +EXAMPLE +------- + +Suppose you run 'git tag -f' and mistyped the tag to overwrite. +The ref to your tag is overwritten, but until you run 'git +prune', it is still there. + +------------ +$ git lost+found +[1ef2b196d909eed523d4f3c9bf54b78cdd6843c6] GIT 0.99.9c +... +------------ + +Also you can use gitk to browse how they relate to each other +and existing (probably old) tags. + +------------ +$ gitk $(cd .git/lost+found/commit && echo ??*) +------------ + +After making sure that it is the object you are looking for, you +can reconnect it to your regular .git/refs hierarchy. + +------------ +$ git cat-file -t 1ef2b196 +tag +$ git cat-file tag 1ef2b196 +object fa41bbce8e38c67a218415de6cfa510c7e50032a +type commit +tag v0.99.9c +tagger Junio C Hamano 1131059594 -0800 + +GIT 0.99.9c + +This contains the following changes from the "master" branch, since +... +$ git update-ref refs/tags/not-lost-anymore 1ef2b196 +$ git rev-parse not-lost-anymore +1ef2b196d909eed523d4f3c9bf54b78cdd6843c6 +------------ + +Author +------ +Written by Junio C Hamano + +Documentation +-------------- +Documentation by Junio C Hamano and the git-list . + + +GIT +--- +Part of the gitlink:git[7] suite diff --git a/Documentation/git.txt b/Documentation/git.txt index b7bc4fb23..a9d47c115 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -309,6 +309,9 @@ gitlink:git-convert-objects[1]:: gitlink:git-cvsimport[1]:: Salvage your data out of another SCM people love to hate. +gitlink:git-lost+found[1]:: + Recover lost refs that luckily have not yet been pruned. + gitlink:git-merge-one-file[1]:: The standard helper program to use with "git-merge-index" diff --git a/Makefile b/Makefile index b4dca5f22..b75cb1378 100644 --- a/Makefile +++ b/Makefile @@ -89,7 +89,8 @@ SCRIPT_SH = \ git-tag.sh git-verify-tag.sh git-whatchanged.sh git.sh \ git-applymbox.sh git-applypatch.sh git-am.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ - git-merge-resolve.sh git-merge-ours.sh git-grep.sh + git-merge-resolve.sh git-merge-ours.sh git-grep.sh \ + git-lost+found.sh SCRIPT_PERL = \ git-archimport.perl git-cvsimport.perl git-relink.perl \ diff --git a/git-lost+found.sh b/git-lost+found.sh new file mode 100755 index 000000000..b6b2616e4 --- /dev/null +++ b/git-lost+found.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +. git-sh-setup || die "Not a git archive." + +laf="$GIT_DIR/lost+found" +rm -fr "$laf" && mkdir -p "$laf/commit" "$laf/other" || exit + +git fsck-objects | +while read dangling type sha1 +do + case "$dangling" in + dangling) + if git-rev-parse --verify "$sha1^0" >/dev/null 2>/dev/null + then + dir="$laf/commit" + git-show-branch "$sha1" + else + dir="$laf/other" + fi + echo "$sha1" >"$dir/$sha1" + ;; + esac +done