From: Michael Haggerty Date: Fri, 17 Feb 2012 18:42:14 GMT Subject: Re: How to use git attributes to configure server-side checks? Message-ID: <4F3E9F86.3070802@alum.mit.edu> In-Reply-To: <7vy5xh1whq.fsf@alter.siamese.dyndns.org> On 09/21/2011 10:17 PM, Junio C Hamano wrote: > Michael Haggerty writes: >> I was thinking of using git attributes to configure a server-side >> "update" hook that does some basic sanity checking before accepting a >> push. I thought I could do something like >> [...] >> I see that there is an (undocumented) API involving >> git_attr_set_direction() that seems to let gitattributes to be read out >> of the index instead of the working tree. But I am still confused: > > The words "server side" automatically mean that there should be no working > tree, and where there is no working tree there should be no index, so the > direction should not make any difference. The attributes that are used to > help whitespace checks should come from project.git/info/attributes in > such a case [*...*]. I was just alerted by Scott Chacon's blog [1] to the fact that one can set GIT_INDEX_FILE to an arbitrary filename, thereby causing the index to be read/written from that file instead of $GIT_DIR/index. It occurred to me that this feature, along with the addition of "git check-attr --cached" in 1.7.8, can be used to give server-side access to the gitattributes for an arbitrary commit: GIT_INDEX_FILE="$(tempfile)" export GIT_INDEX_FILE git read-tree $COMMIT git check-attr --cached attr -- pathname ... rm "$GIT_INDEX_FILE" Empirically it seems to work (and it is surprisingly fast). The use of a temporary file prevents simultaneous accesses to the repository from stepping on each other. This looks like a clean solution to my problem. Or is there some hidden pitfall in this approach? Michael [1] http://progit.org/2010/04/11/environment.html -- Michael Haggerty mhagger@alum.mit.edu http://softwareswirl.blogspot.com/