Re: mtimes of working files
- From
- Eric Wong <normalperson@yhbt.net>
- Date
- Jul 12, 2007, 06:26 UTC
- Message-ID
- <20070712062605.GD29676@muzzle>
- In-Reply-To
- <Pine.LNX.4.64.0707111940080.4516@racer.site>
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
Show 12 quoted lines
> Hi list, > > > > > How difficult is it to have script (or maybe existing git option) > > > > that would make mtimes of all working files equal to time of last > > > > commit ? > > Now I slowly get really curious. Does _anybody_ know a scenario where > this makes sense? > > (No, Eric, there are enough corner cases where your example of a clustered > webserver breaks down, so I am not fully convinced that this is a useful > case.)
I'll have to admit that most of my git usage is via git-svn, so I mostly deal with linear history and some branching, but no real merges in a git sense.
This is what I whipped up the other night:
http://yhbt.net/git-set-file-times
-----------------------------------8<----------------------------------------- #!/usr/bin/perl -w use strict;
# sets mtime and atime of files to the latest commit time in git # # This is useful for serving static content (managed by git) # from a cluster of identically configured HTTP servers. HTTP # clients and content delivery networks can get consistent # Last-Modified headers no matter which HTTP server in the # cluster they hit. This should improve caching behavior. # # This does not take into account merges, but if you're updating # every machine in the cluster from the same commit (A) to the # same commit (B), the mtimes will be _consistent_ across all # machines if not necesarily accurate. # # THIS IS NOT INTENDED TO OPTIMIZE BUILD SYSTEMS SUCH AS 'make' # YOU HAVE BEEN WARNED!
my %ls = (); my $commit_time;
$/ = "\0";
open FH, 'git ls-files -z|' or die $!;
while (<FH>) {
chomp;
$ls{$_} = $_;
}
close FH;$/ = "\n";
open FH, "git log -r --name-only --no-color --pretty=raw -z @ARGV |" or die $!;
while (<FH>) {
chomp;
if (/^committer .*? (\d+) (?:[\-\+]\d+)$/) {
$commit_time = $1;
} elsif (s/\0\0commit [a-f0-9]{40}$//) {
my @files = delete @ls{split(/\0/, $_)};
@files = grep { defined $_ } @files;
next unless @files;
utime $commit_time, $commit_time, @files;
}
last unless %ls;} close FH; -----------------------------------8<-----------------------------------------
-- Eric Wong