Skip to content

Commit

Permalink
git-lost+found
Browse files Browse the repository at this point in the history
This command helps you resurrect accidentally lost tags and commits.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Nov 12, 2005
1 parent d7b1a1d commit 04e7ca1
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 1 deletion.
78 changes: 78 additions & 0 deletions Documentation/git-lost+found.txt
Original file line number Diff line number Diff line change
@@ -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 <junkio@cox.net> 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 <junkio@cox.net>

Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.


GIT
---
Part of the gitlink:git[7] suite
3 changes: 3 additions & 0 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
23 changes: 23 additions & 0 deletions git-lost+found.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 04e7ca1

Please sign in to comment.