Autogenerated HTML docs for v1.5.3.5-628-ga1309
authorJunio C Hamano <junio@hera.kernel.org>
Sat, 10 Nov 2007 11:26:34 +0000 (11:26 +0000)
committerJunio C Hamano <junio@hera.kernel.org>
Sat, 10 Nov 2007 11:26:34 +0000 (11:26 +0000)
core-tutorial.html
core-tutorial.txt
howto-index.html
howto-index.txt
howto/recover-corrupted-blob-object.txt [new file with mode: 0644]

index 5c6766f766d52bc8da6993377487e606a7b3b960..ebf7da11bfe2e0ee297c242eabdc7815a14885fe 100644 (file)
@@ -1143,12 +1143,13 @@ have to do _that_ merge again.</p>
 environment, is <tt>git show-branch</tt>.</p>\r
 <div class="listingblock">\r
 <div class="content">\r
-<pre><tt>$ git show-branch --topo-order master mybranch\r
+<pre><tt>$ git-show-branch --topo-order --more=1 master mybranch\r
 * [master] Merge work in mybranch\r
  ! [mybranch] Some work.\r
 --\r
 -  [master] Merge work in mybranch\r
-*+ [mybranch] Some work.</tt></pre>\r
+*+ [mybranch] Some work.\r
+*  [master^] Some fun.</tt></pre>\r
 </div></div>\r
 <p>The first two lines indicate that it is showing the two branches\r
 and the first line of the commit log message from their\r
@@ -1165,9 +1166,31 @@ because <tt>mybranch</tt> has not been merged to incorporate these
 commits from the master branch.  The string inside brackets\r
 before the commit log message is a short name you can use to\r
 name the commit.  In the above example, <em>master</em> and <em>mybranch</em>\r
-are branch heads.  <em>master~1</em> is the first parent of <em>master</em>\r
+are branch heads.  <em>master^</em> is the first parent of <em>master</em>\r
 branch head.  Please see <em>git-rev-parse</em> documentation if you\r
 see more complex cases.</p>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Note</div>\r
+</td>\r
+<td class="content">Without the <em>&#8212;more=1</em> option, <em>git-show-branch</em> would not output the\r
+<em>[master^]</em> commit, as <em>[mybranch]</em> commit is a common ancestor of\r
+both <em>master</em> and <em>mybranch</em> tips.  Please see <em>git-show-branch</em>\r
+documentation for details.</td>\r
+</tr></table>\r
+</div>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Note</div>\r
+</td>\r
+<td class="content">If there were more commits on the <em>master</em> branch after the merge, the\r
+merge commit itself would not be shown by <em>git-show-branch</em> by\r
+default.  You would need to provide <em>&#8212;sparse</em> option to make the\r
+merge commit visible in this case.</td>\r
+</tr></table>\r
+</div>\r
 <p>Now, let's pretend you are the one who did all the work in\r
 <tt>mybranch</tt>, and the fruit of your hard work has finally been merged\r
 to the <tt>master</tt> branch. Let's go back to <tt>mybranch</tt>, and run\r
@@ -1948,7 +1971,7 @@ to follow, not easier.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 03-Nov-2007 02:45:17 UTC\r
+Last updated 10-Nov-2007 11:26:14 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 99817c53375e6f58b7a3e089cd81e3af5aaffc79..ebd2492bc422b05e8b7db903924106e9319b43b1 100644 (file)
@@ -931,12 +931,13 @@ Another useful tool, especially if you do not always work in X-Window
 environment, is `git show-branch`.
 
 ------------------------------------------------
-$ git show-branch --topo-order master mybranch
+$ git-show-branch --topo-order --more=1 master mybranch
 * [master] Merge work in mybranch
  ! [mybranch] Some work.
 --
 -  [master] Merge work in mybranch
 *+ [mybranch] Some work.
+*  [master^] Some fun.
 ------------------------------------------------
 
 The first two lines indicate that it is showing the two branches
@@ -954,10 +955,22 @@ because `mybranch` has not been merged to incorporate these
 commits from the master branch.  The string inside brackets
 before the commit log message is a short name you can use to
 name the commit.  In the above example, 'master' and 'mybranch'
-are branch heads.  'master~1' is the first parent of 'master'
+are branch heads.  'master^' is the first parent of 'master'
 branch head.  Please see 'git-rev-parse' documentation if you
 see more complex cases.
 
+[NOTE]
+Without the '--more=1' option, 'git-show-branch' would not output the
+'[master^]' commit, as '[mybranch]' commit is a common ancestor of
+both 'master' and 'mybranch' tips.  Please see 'git-show-branch'
+documentation for details.
+
+[NOTE]
+If there were more commits on the 'master' branch after the merge, the
+merge commit itself would not be shown by 'git-show-branch' by
+default.  You would need to provide '--sparse' option to make the
+merge commit visible in this case.
+
 Now, let's pretend you are the one who did all the work in
 `mybranch`, and the fruit of your hard work has finally been merged
 to the `master` branch. Let's go back to `mybranch`, and run
index 465e101821a8c23d754e20fe62b4290c632ac2c6..182c0c3415726a2a3f1869ec9bd94ab8b26ae685 100644 (file)
@@ -300,6 +300,15 @@ shown at http://www.kernel.org/pub/software/scm/git/docs/.</p>
 <ul>\r
 <li>\r
 <p>\r
+<a href="howto/recover-corrupted-blob-object.txt">recover-corrupted-blob-object</a> by Linus Torvalds &lt;torvalds@linux-foundation.org&gt;\r
+</p>\r
+</li>\r
+</ul>\r
+<p>Some tricks to reconstruct blob objects in order to fix\r
+a corrupted repository.</p>\r
+<ul>\r
+<li>\r
+<p>\r
 <a href="howto/revert-branch-rebase.html">revert-branch-rebase</a> by Junio C Hamano &lt;junkio@cox.net&gt;\r
 </p>\r
 </li>\r
@@ -341,7 +350,7 @@ into which branch and who can make a tag.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 19-Sep-2007 02:27:20 UTC\r
+Last updated 10-Nov-2007 11:26:14 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 8c1f3a384906f3cea3237398ff6f51f9ccfeafe6..d36df04b85c89d767e4c0149ecb99880d1192da5 100644 (file)
@@ -27,6 +27,12 @@ uses the post-update hook to automate git documentation page
 shown at http://www.kernel.org/pub/software/scm/git/docs/.
 
 
+* link:howto/recover-corrupted-blob-object.txt[recover-corrupted-blob-object] by Linus Torvalds <torvalds@linux-foundation.org>
+
+Some tricks to reconstruct blob objects in order to fix
+a corrupted repository.
+
+
 * link:howto/revert-branch-rebase.html[revert-branch-rebase] by Junio C Hamano <junkio@cox.net>
 
 In this article, JC gives a small real-life example of using
diff --git a/howto/recover-corrupted-blob-object.txt b/howto/recover-corrupted-blob-object.txt
new file mode 100644 (file)
index 0000000..323b513
--- /dev/null
@@ -0,0 +1,134 @@
+Date: Fri, 9 Nov 2007 08:28:38 -0800 (PST)
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Subject: corrupt object on git-gc
+Abstract: Some tricks to reconstruct blob objects in order to fix
+ a corrupted repository.
+
+On Fri, 9 Nov 2007, Yossi Leybovich wrote:
+>
+> Did not help still the repository look for this object?
+> Any one know how can I track this object and understand which file is it
+
+So exactly *because* the SHA1 hash is cryptographically secure, the hash
+itself doesn't actually tell you anything, in order to fix a corrupt
+object you basically have to find the "original source" for it.
+
+The easiest way to do that is almost always to have backups, and find the
+same object somewhere else. Backups really are a good idea, and git makes
+it pretty easy (if nothing else, just clone the repository somewhere else,
+and make sure that you do *not* use a hard-linked clone, and preferably
+not the same disk/machine).
+
+But since you don't seem to have backups right now, the good news is that
+especially with a single blob being corrupt, these things *are* somewhat
+debuggable.
+
+First off, move the corrupt object away, and *save* it. The most common
+cause of corruption so far has been memory corruption, but even so, there
+are people who would be interested in seeing the corruption - but it's
+basically impossible to judge the corruption until we can also see the
+original object, so right now the corrupt object is useless, but it's very
+interesting for the future, in the hope that you can re-create a
+non-corrupt version.
+
+So:
+
+> ib]$ mv .git/objects/4b/9458b3786228369c63936db65827de3cc06200 ../
+
+This is the right thing to do, although it's usually best to save it under
+it's full SHA1 name (you just dropped the "4b" from the result ;).
+
+Let's see what that tells us:
+
+> ib]$ git-fsck --full
+> broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
+>              to    blob 4b9458b3786228369c63936db65827de3cc06200
+> missing blob 4b9458b3786228369c63936db65827de3cc06200
+
+Ok, I removed the "dangling commit" messages, because they are just
+messages about the fact that you probably have rebased etc, so they're not
+at all interesting. But what remains is still very useful. In particular,
+we now know which tree points to it!
+
+Now you can do
+
+       git ls-tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
+
+which will show something like
+
+       100644 blob 8d14531846b95bfa3564b58ccfb7913a034323b8    .gitignore
+       100644 blob ebf9bf84da0aab5ed944264a5db2a65fe3a3e883    .mailmap
+       100644 blob ca442d313d86dc67e0a2e5d584b465bd382cbf5c    COPYING
+       100644 blob ee909f2cc49e54f0799a4739d24c4cb9151ae453    CREDITS
+       040000 tree 0f5f709c17ad89e72bdbbef6ea221c69807009f6    Documentation
+       100644 blob 1570d248ad9237e4fa6e4d079336b9da62d9ba32    Kbuild
+       100644 blob 1c7c229a092665b11cd46a25dbd40feeb31661d9    MAINTAINERS
+       ...
+
+and you should now have a line that looks like
+
+       10064 blob 4b9458b3786228369c63936db65827de3cc06200     my-magic-file
+
+in the output. This already tells you a *lot* it tells you what file the
+corrupt blob came from!
+
+Now, it doesn't tell you quite enough, though: it doesn't tell what
+*version* of the file didn't get correctly written! You might be really
+lucky, and it may be the version that you already have checked out in your
+working tree, in which case fixing this problem is really simple, just do
+
+       git hash-object -w my-magic-file
+
+again, and if it outputs the missing SHA1 (4b945..) you're now all done!
+
+But that's the really lucky case, so let's assume that it was some older
+version that was broken. How do you tell which version it was?
+
+The easiest way to do it is to do
+
+       git log --raw --all --full-history -- subdirectory/my-magic-file
+
+and that will show you the whole log for that file (please realize that
+the tree you had may not be the top-level tree, so you need to figure out
+which subdirectory it was in on your own), and because you're asking for
+raw output, you'll now get something like
+
+       commit abc
+       Author:
+       Date:
+         ..
+       :100644 100644 4b9458b... newsha... M  somedirectory/my-magic-file
+
+
+       commit xyz
+       Author:
+       Date:
+
+         ..
+       :100644 100644 oldsha... 4b9458b... M   somedirectory/my-magic-file
+
+and this actually tells you what the *previous* and *subsequent* versions
+of that file were! So now you can look at those ("oldsha" and "newsha"
+respectively), and hopefully you have done commits often, and can
+re-create the missing my-magic-file version by looking at those older and
+newer versions!
+
+If you can do that, you can now recreate the missing object with
+
+       git hash-object -w <recreated-file>
+
+and your repository is good again!
+
+(Btw, you could have ignored the fsck, and started with doing a
+
+       git log --raw --all
+
+and just looked for the sha of the missing object (4b9458b..) in that
+whole thing. It's up to you - git does *have* a lot of information, it is
+just missing one particular blob version.
+
+Trying to recreate trees and especially commits is *much* harder. So you
+were lucky that it's a blob. It's quite possible that you can recreate the
+thing.
+
+                       Linus