今天琢磨着利用git來作服務器自動部署。git倉庫掛在coding.net
上,而coding.net
提供webhook
功能,能夠在指定git事件(根據「自動部署」這一用途,這裏指的固然主要是push
事件了)發生後,發一個請求到指定URL來觸發更新。php
因爲我本人用的是php,因此天然是php接收到coding.net
的請求後,執行一段shell命令來啓動git拉取代碼。這一部分仍是比較順利的,問題是,啓動git拉取代碼的shell命令要怎麼寫呢?git
想一想咱們平時是怎麼作的呢?web
$ cd /xxxx/xxx #進到git項目目錄 $ git pull #拉取代碼
嗯,看起來很簡單,那咱們shell命令也這麼寫吧。shell
fatal: Not a git repository (or any of the parent directories): .git
哎?!這是什麼狀況,我路徑都是對的啊,怎麼會找不到.git
目錄?bash
在stackoverflow一番搜尋後,尋得問題緣由:git命令依賴於環境變量GIT_DIR
和GIT_WORK_TREE
,這兩個環境變量纔是git真正的運行上下文。而在shell命令裏直接執行cd
是不會跟着改變這兩個環境變量的,所以,就可能發生上述的錯誤。服務器
知道緣由就好辦了,咱們也不須要使用cd
命令了,直接用--git-dir
和--work-tree
來傳入這兩個參數便可:post
$ git --git-dir='/xxx/xxx/.git' --work-tree='/xxx/xxx' pull # 注意這兩個參數是傳給git命令的,要放在'git'的後面
我不解的是,爲何在控制檯裏直接cd
就能夠改變GIT_DIR
和GIT_WORK_TREE
這兩個變量呢?求大神指教。.net