W dniu 10.09.2016 o 01:07, john smith pisze:
> On 9/10/16, Junio C Hamano <gits...@pobox.com> wrote:
>> The clean and smudge operations should look _only_ at the contents
>> they are filtering, and nothing else, and the clean/smudge filtering
>> mechanism is designed to support that use case. It is not designed
>> to do things like embedding the name of the branch that is being
>> checked out into the result.
> Ok, I think I get it. It was actually my original problem with smudge
> filters because I wanted them to be run after *every* checkout even if
> file contents stayed the same (hence the subject).
And that's not the case, for performance reasons.
> Now Jakub suggested post-checkout hook in conjunction with only clean
> filter for my problem of managing dotfiles but I think I don't fully
> get it. The problem is that in the scenario presented in my last
> e-mail clean filter is run in the situation which doesn't like a
> checkin to me. Is `git checkout <PATH>' doing a *checkin*" under the
> hood so that the clean filter is called? What does actually `checkin'
> mean in Git? I thought that checkin it's the same as committing a
> file into the repository.
I was wrong, I'm sorry. My mistake.
You would need post-checkout hook together with clean / smudge filters
(though you could get by without smudge filter, at least in theory...).
The `post-checkout` hook could run e.g. "git checkout -- '*.conf'"
to force use of smudge filter, after checking that it was a change
of branch ("git checkout <commit-ish>"). See githooks(5) for details
(last, third parameter passed to hook script is 1, rather than 0).
Unfortunately I don't see a way to query .gitattributes files to
find out all patterns that match specific attribute; you would need
to duplicate configuration:
clean = replace-with-placeholder %f
smudge = expand-with-branchname %f
test "$3" -eq "1" && git checkout -- '*.conf'
Or something like that.