背景
今天琢磨著利用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
這兩個變數呢?求大神指教。