From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Jon Seymour <jon.seymour@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: A system administration use case for git
Date: Thu, 23 Apr 2009 11:55:33 +0200 [thread overview]
Message-ID: <20090423095533.GE13989@pengutronix.de> (raw)
In-Reply-To: <2cfc40320904220133l5ab567f3q46608793b93f0e1f@mail.gmail.com>
Hello Jon,
On Wed, Apr 22, 2009 at 06:33:12PM +1000, Jon Seymour wrote:
> * calculate the git hashes of the tree (without making copies of the
> files in the tree)
You can hand-craft a tree object:
for f in $filelist; do
printf "100644 %s\x00" $f;
git hash-object $f |
perl -n -e 'chomp; for $c (split(/(.{2})/)) { printf("%c", hex($c)) if $c }';
done |
git hash-object -t tree --stdin
You get some extra points for directories that include subdirs :-)
There is a problem though, I think it has to do with the order of the
files in the tree object. Here is a real-life example from the Linux
kernel (I choosed the usr subdirectory, because it's small and doesn't
contain subdirs):
ukleinek@cepheus:~/gsrc/linux-2.6/usr$ for f in .gitignore Kconfig Makefile gen_init_cpio.c initramfs_data.S initramfs_data.bz2.S initramfs_data.gz.S initramfs_data.lzma.S; do printf "100644 %s\x00" $f; git hash-object $f | perl -n -e 'chomp; for $c (split(/(.{2})/)) { printf("%c", hex($c)) if $c }'; done | git hash-object -t tree --stdin
64f2ca854bc19fd29479b198be11beba56a26b1e
ukleinek@cepheus:~/gsrc/linux-2.6/usr$ git rev-parse HEAD:usr
64f2ca854bc19fd29479b198be11beba56a26b1e
There is a practical problem though: The filelist has to be sorted in a
way that is not provided by ls, so:
ukleinek@cepheus:~/gsrc/linux-2.6/usr$ for f in $(ls -A); do printf "100644 %s\x00" $f; git hash-object $f | perl -n -e 'chomp; for $c (split(/(.{2})/)) { printf("%c", hex($c)) if $c }'; done | git hash-object -t tree -w --stdin
a0a6efb3f1de956badc7607c7d372cc325a18846
ukleinek@cepheus:~/gsrc/linux-2.6/usr$ git ls-tree a0a6efb3f1de956badc7607c7d372cc325a18846 | wc -l
0
doesn't work :-/
This would make a nice plumbing:
git hash-tree $directory
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
next prev parent reply other threads:[~2009-04-23 9:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-22 8:33 A system administration use case for git Jon Seymour
2009-04-22 8:48 ` Martin Langhoff
[not found] ` <2cfc40320904220208g5acc2200w6144668ba2da5a09@mail.gmail.com>
2009-04-22 9:22 ` Jon Seymour
2009-04-22 10:07 ` Martin Langhoff
2009-04-22 10:18 ` Jon Seymour
2009-04-23 9:55 ` Uwe Kleine-König [this message]
2009-04-23 10:38 ` Johannes Sixt
2009-04-23 11:39 ` Uwe Kleine-König
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=20090423095533.GE13989@pengutronix.de \
--to=u.kleine-koenig@pengutronix.de \
--cc=git@vger.kernel.org \
--cc=jon.seymour@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.