From: Jeff King <peff@peff.net>
To: Jason Brooks <jasonbbrooks@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: Unknown software revision
Date: Thu, 10 Feb 2011 18:22:35 -0500 [thread overview]
Message-ID: <20110210232235.GC21335@sigill.intra.peff.net> (raw)
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
prev parent reply other threads:[~2011-02-10 23:22 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-10 22:33 Unknown software revision Jason Brooks
2011-02-10 23:22 ` Jeff King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110210232235.GC21335@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=jasonbbrooks@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).