在腳本中調用git命令:指定git命令運行上下文

背景

今天琢磨着利用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_DIRGIT_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_DIRGIT_WORK_TREE這兩個變量呢?求大神指教。.net

參考資料

相關文章
相關標籤/搜索