Why doesn't setting GIT_WORK_TREE work in a post-commit hook?

前提是你 提交于 2019-11-29 15:08:49

问题


I'm trying to use the following post-commit hook to deploy to a particular directory after each successful commit:

#!/bin/sh
export GIT_WORK_TREE=/var/www/example/
export GIT_DIR=/home/mark/test/.git/
git checkout -f

However, after committing I get the following error:

$ git commit -m 'An example commit.'
fatal: Unable to create '/var/www/example/.git/index.lock': No such file or directory
[master 0938e48] An example commit.

... as if the GIT_WORK_TREE setting is being ignored. Why does setting this environment variable appear to be not working? I'm using git version 1.7.4.1.


回答1:


The problem here is that in post-commit hooks (and also pre-commit, prepare-commit-msg and commit-msgt) the GIT_INDEX_FILE environment variable is set to .git/index. (This isn't documented in the githooks documentation, but I've posted elsewhere about the settings of environment variables and the current directory in git hooks.)

The effect of the GIT_INDEX_FILE environment variable is described in the ENVIRONMENT VARIABLES section of the git man page as:

GIT_INDEX_FILE

This environment [variable] allows the specification of an alternate index file. If not specified, the default of $GIT_DIR/index is used.

... and for some reason, in this situation, GIT_INDEX_FILE is being used relative to GIT_WORK_TREE.

To make the hook work as you would expect, you just need to unset GIT_INDEX_FILE, so your hook would look like:

 #!/bin/sh
 unset GIT_INDEX_FILE
 export GIT_WORK_TREE=/var/www/example/
 export GIT_DIR=/home/mark/test/.git/
 git checkout -f


来源:https://stackoverflow.com/questions/7645480/why-doesnt-setting-git-work-tree-work-in-a-post-commit-hook

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!