Re: PATH modifications for git-hook processes
- From
- Matthew Rothenberg <mroth@khanacademy.org>
- Date
- Apr 15, 2015, 15:00 UTC
- Message-ID
- <CAKuTQSGapeUeZptdX1=Uv441Moo6X19RNR0oySU--F+Kj6Xz=w@mail.gmail.com>
- In-Reply-To
- <xmqqk2xe39zt.fsf@gitster.dls.corp.google.com>
Hmm, this all makes sense as to why it's happening, thank you. In my case the ` /usr/local/Cellar/git/2.3.5/libexec/git-core` (git --exec-path) does give all the proper binaries and sub-binaries. It shows up twice because the GIT_EXEC_PATH environment variable is used too (which is the same in my case since it hasn't been overriden). The /usr/local/bin therefore comes from **the path to the running "git" itself**.
There still seems to be a potential issue I can't figure out how to work around with this. If **the path to the running "git" itself** is in /usr/local/bin or some other common area, then that would still always get prepended prior to external PATH -- which means **other** external programs will inherit precedence overriding the system PATH preferences.
For example, in our case, many scripts run in our specific Python environment, which ala virtualenv is located in a user-specific path (e.g. ~/.virtualenv/foo/bin/python), which appears earlier in the user PATH so it affects all shell processes using `#!/usr/bin/env python`. When a git-exec prepends /usr/local/bin, the system installed Python is used instead.
There are other use cases I can think of that would cause this issue as well -- user provides more recent version of "bazfoo" program in ~/bin which they prepend of their system PATH, git-exec then prepends shared path of a system binary directory which also contains older version of bazfoo, older version then gets used instead.
So, I guess what I'm looking for is:
- A way to prevent the **path to the running "git" itself** portion
of setup_path from firing, (OR)
- A way to specify (via env var?) paths that must remain in high
precedence even during a git-exec, e.g.:
NEWPATH = [git --exec-path] : [GIT_EXEC_PATH] :
[$PROPOSED_HIGH_PRECENDENCE_PATH] : ['git itself' path] : [$PATH] (OR)
- A way to refine git-exec default behavior to avoid this edge case
(my C is a little rusty but I'm happy to try to help out if we can
think of a good logic), (OR)
- Something else clever I am not aware of.Thanks so much for your assistance.
On Tue, Apr 14, 2015 at 1:17 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 24 quoted lines
> Matthew Rothenberg <mroth@khanacademy.org> writes: > >> - what is the expected PATH modification behavior for subprocesses of >> git-hooks? Is this documented anywhere? >> - what would be causing /usr/local/bin to be prepended here, and can >> it be adjusted via preference? > > This is not limited to hooks and very much deliberate, I think. In > order to make sure anything that is called from "git" wrapper gets > picked up from GIT_EXEC_PATH so that the matching version of the git > subprogram is used, "git <cmd>" does this before running "git-<cmd>" > (in git.c): > > /* > * We use PATH to find git commands, but we prepend some higher > * precedence paths: the "--exec-path" option, the GIT_EXEC_PATH > * environment, and the $(gitexecdir) from the Makefile at build > * time. > */ > setup_path(); > > And setup_path() is defined in exec_cmd.c to start the new PATH with > git-exec-path, and then the path to the running "git" itself, and > then finally the external PATH.