背景
今天琢磨着利用git来做服务器自动部署。git仓库挂在coding.net
上,而coding.net
提供webhook
功能,可以在指定git事件(根据“自动部署”这一用途,这里指的当然主要是push
事件了)发生后,发一个请求到指定URL来触发更新。
问题
由于我本人用的是php,所以自然是php接收到coding.net
的请求后,执行一段shell命令来启动git拉取代码。这一部分还是比较顺利的,问题是,启动git拉取代码的shell命令要怎么写呢?
想想我们平时是怎么做的呢?
$ cd /xxxx/xxx #进到git项目目录
$ git pull #拉取代码
嗯,看起来很简单,那我们shell命令也这么写吧。
fatal: Not a git repository (or any of the parent directories): .git
哎?!这是什么情况,我路径都是对的啊,怎么会找不到.git
目录?
解决方案
在stackoverflow一番搜寻后,寻得问题原因:git命令依赖于环境变量GIT_DIR
和GIT_WORK_TREE
,这两个环境变量才是git真正的运行上下文。而在shell命令里直接执行cd
是不会跟着改变这两个环境变量的,因此,就可能发生上述的错误。
知道原因就好办了,我们也不需要使用cd
命令了,直接用--git-dir
和--work-tree
来传入这两个参数即可:
$ git --git-dir='/xxx/xxx/.git' --work-tree='/xxx/xxx' pull # 注意这两个参数是传给git命令的,要放在'git'的后面
未完待续
我不解的是,为什么在控制台里直接cd
就可以改变GIT_DIR
和GIT_WORK_TREE
这两个变量呢?求大神指教。