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

Re: mtimes of working files

From
EWEric 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
Previous: Daniel BarkalowNext: Randal L. Schwartz
Message 22 of 24 in “mtimes of working files”
  1. Yakov LernerJul 11, 2007
  2. Johannes SchindelinJul 11, 2007
  3. Yakov LernerJul 11, 2007
  4. Johannes SchindelinJul 11, 2007
  5. Jan HudecJul 11, 2007
  6. Andy ParkinsJul 12, 2007
  7. David WoodhouseJul 12, 2007
  8. Theodore TsoJul 13, 2007
  9. David WoodhouseJul 13, 2007
  10. Linus TorvaldsJul 13, 2007
  11. David WoodhouseJul 13, 2007
  12. Linus TorvaldsJul 14, 2007
  13. David WoodhouseJul 14, 2007
  14. J. Bruce FieldsJul 14, 2007
  15. David WoodhouseJul 14, 2007
  16. Jakub NarebskiJul 14, 2007
  17. Robin RosenbergJul 14, 2007
  18. Julian PhillipsJul 14, 2007
  19. Jan HudecJul 14, 2007
  20. Julian PhillipsJul 14, 2007
  21. Daniel BarkalowJul 15, 2007
  22. Eric WongJul 12, 2007
  23. Randal L. SchwartzJul 12, 2007
  24. Eric WongJul 12, 2007

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.