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/ | -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html