summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d7b1a1d)
raw | patch | inline | side by side (parent: d7b1a1d)
author | Junio C Hamano <junkio@cox.net> | |
Mon, 7 Nov 2005 23:15:34 +0000 (15:15 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sat, 12 Nov 2005 05:52:20 +0000 (21:52 -0800) |
This command helps you resurrect accidentally lost tags and commits.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/git-lost+found.txt | [new file with mode: 0644] | patch | blob |
Documentation/git.txt | patch | blob | history | |
Makefile | patch | blob | history | |
git-lost+found.sh | [new file with mode: 0755] | patch | blob |
diff --git a/Documentation/git-lost+found.txt b/Documentation/git-lost+found.txt
--- /dev/null
@@ -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
diff --git a/Documentation/git.txt b/Documentation/git.txt
index b7bc4fb2315ae2465f456c33e6ebe1ee0da2ee70..a9d47c115c071694321d076af8a73a06ddd46875 100644 (file)
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
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 b4dca5f228b2ce95d9c23405b99f534760a50481..b75cb137875b3cdb8746d2e0135e6f2743e2046a 100644 (file)
--- a/Makefile
+++ b/Makefile
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
--- /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