git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Unknown software revision

From
Jeff King <peff@peff.net>
Date
Feb 10, 2011, 23:22 UTC
Message-ID
<20110210232235.GC21335@sigill.intra.peff.net>
In-Reply-To
<733D558A-0935-42A8-BA5B-7B97703656F6@gmail.com>
On Thu, Feb 10, 2011 at 02:33:47PM -0800, Jason Brooks wrote:
> I have a software deployment that was copied out of a git repository
> but without the .git directories.  Thus, I have no idea what revision
> this deployment is, so I don't know how to upgrade from git.  Is there a
> method, or script out there that can help me?

Does your set of files match what was in the git tree _exactly_? Or might there be minor changes, new files, etc?

If it should match exactly, you can figure out what tree git would have made out of this content:

  git init
  git add .
  git commit -m foo
  tree=`git rev-parse HEAD^{tree}`
And now you can search in the actual git repository for that tree:
  $ git log --pretty=raw -z | perl -0lne 'print $_, "\n" if /^tree '$tree'$/m'

But obviously that is all based on the hashes of the content, so if even a single byte is missing, added, or different in your deployed copy, you won't find a match.

In that case, your best bet is probably to script a bunch of diffs and see which commit ends up closest. I would do something like:

  1. From the deployed version, prepare your best guess about what the
     git directory would have looked like. Put it in a directory
     "deployed".
  2. Now make a git commit from the deployed state:
       cd deployed
       git init
       git add .
       git commit -m 'deployed version'
  3. In the original git repo, fetch the deployed version in so you
     can diff against it.
       cd /path/to/real/git/repo
       git fetch /path/to/deployed master:deployed
  4. Now you can try diffing "deployed" against every commit in the real
     repo and see what comes closest. Here I'll just count up changed
     lines to assign a score to each commit and show the one with the
     fewest changes:
       git rev-list HEAD | while read commit; do
         git diff-tree --numstat $commit deployed |
         perl -ane '$total += $F[0] + $F[1];
                    END { print $total }'
         echo " $commit"
       done | sort -n

The top of the resulting list is the closest commit. Check it out with "git show" to see if it makes sense.

Hope that helps.
-Peff
Previous: Jason Brooks
Message 2 of 2 in “Unknown software revision”
  1. Jason BrooksFeb 10, 2011
  2. Jeff KingFeb 10, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.