在指令碼中呼叫git命令:指定git命令執行上下文

array_huang發表於2019-02-16

背景

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

參考資料

相關文章