1

背景

今天琢磨着利用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_DIRGIT_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_DIRGIT_WORK_TREE这两个变量呢?求大神指教。

参考资料


array_huang
10.5k 声望6.6k 粉丝