这很奇怪:longer shell script(sh
)中的以下代码:
SHARED_ROOT="~/.githooks/shared/shared_hooks_103" # This is a git repo!
cd "$SHARED_ROOT" && pwd && git config --show-origin --get remote.origin.url
打印
.../.githooks/shared/shared_hooks_103
file:/private/tmp/test103-clone/.git/config /tmp/test103
显示git使用了错误的配置文件... ??
明确告诉git config
要使用哪个文件:
git config -f "$SHARED_REPO/.git/config" --show-origin
正常工作。
我不知道上面的shell语法在什么情况下或者如果它是一个奇怪的git bug不能工作?
答案 0 :(得分:1)
无论出于何种原因,在git
钩子期间git有时会泄漏一些内部GIT_*
环境变量。这些会对钩子期间发生的其他git
操作产生负面影响。
在pre-commit(我维护的git hooks框架)中,我使用以下代码来避免这些环境变量(同时仍保留一些重要的变量)
def no_git_env(_env=None):
# Too many bugs dealing with environment variables and GIT:
# https://github.com/pre-commit/pre-commit/issues/300
# In git 2.6.3 (maybe others), git exports GIT_WORK_TREE while running
# pre-commit hooks
# In git 1.9.1 (maybe others), git exports GIT_DIR and GIT_INDEX_FILE
# while running pre-commit hooks in submodules.
# GIT_DIR: Causes git clone to clone wrong thing
# GIT_INDEX_FILE: Causes 'error invalid object ...' during commit
_env = _env if _env is not None else os.environ
return {
k: v for k, v in _env.items()
if not k.startswith('GIT_') or
k in {'GIT_EXEC_PATH', 'GIT_SSH', 'GIT_SSH_COMMAND'}
}
一些列入白名单的环境变量使git
能够执行某些操作:
GIT_EXEC_PATH
:允许git
查找其可执行帮助程序GIT_SSH
/ GIT_SSH_COMMAND
:允许git
将用户设置用于特殊的ssh
克隆指令