On Wed, Apr 25, 2018 at 11:18:26AM -0400, Marc Branchaud wrote: > > The best approach to do so is to have those people do the "touch" > > thing in their own post-checkout hook. People who use Git as the > > source control system won't have to pay runtime cost of doing the > > touch thing, and we do not have to maintain such a hook script. > > Only those who use the "feature" would. > > The post-checkout hook approach is not exactly straightforward. > > Naively, it's simply > > for F in `git diff --name-only $1 $2`; do touch "$F"; done Even this naive attempt gets it wrong: successive files have increasing times. You need to capture the time at the start, and use it as the time for the files. touch /tmp/ref && \ for F in `git diff --name-only $1 $2`; do touch -r /tmp/ref "$F"; done && \ rm /tmp/ref (or pass a fixed time into touch). > But consider: > > * Symlinks can cause the wrong file to be touched. (Granted, Michał's > proposed patch also doesn't deal with symlinks.) Yes, it blindly touches the file, and rather than trying to do utimensat's AT_SYMLINK_NOFOLLOW flag. > Let's assume that a > hook can be crafted will all possible sophistication. There are still > some fundamental problems: > > * In a "file checkout" ("git checkout -- path/to/file"), $1 and $2 are > identical so the above loop does nothing. Offhand I'm not even sure how > a hook might get the right files in this case. Yes, this would need to be a new hook that knows more than post-checkout presently does. post-checkout right now runs AFTER the worktree has been updated, and only gets the refs of old/new HEAD and if the branch was changed. It does NOT know which files were actually modified, and since it If a hook is added for that, then this behavior can be implemented in the hook. Alternatively adding a pre-checkout hook to absorb some state of the unmodified worktree (this could be a bit expensive). > * The hook has to be set up in every repo and submodule (at least until > something like Ævar's experiments come to fruition). > > * A fresh clone can't run the hook. This is especially important when > dealing with submodules. (In one case where we were bit by this, make > though that half of a fresh submodule clone's files were stale, and > decided to re-autoconf the entire thing.) The fresh clone case really matters for my usage, where new clones are firing in CI/CD processes. > I just don't think the hook approach can completely solve the problem. > > I appreciate Ævar's concern that there are more than just two mtime > requests floating around. But I think git's users are best served by a > built-in approach, with a config setting to control the desired mtime > handling (defaulting to the current behaviour). People who want a > different mtime solution will at least have a clear place in the code to > propose a patch. +1 as long as we can set the behavior during the clone. -- Robin Hugh Johnson Gentoo Linux: Dev, Infra Lead, Foundation Treasurer E-Mail : robbat2@xxxxxxxxxx GnuPG FP : 11ACBA4F 4778E3F6 E4EDF38E B27B944E 34884E85 GnuPG FP : 7D0B3CEB E9B85B1F 825BCECF EE05E6F6 A48F6136