Git
為什麼這條路徑有時不是 git 儲存庫?
我有一個 git hook (
post-receive
) 來更新文件、執行單元測試等,但有時它不起作用。以下是
post-receive
鉤子的內容:#!/usr/bin/bash ~/bubblegum_ci > /tmp/bubblegum_ci_log 2>&1 &
這不難理解,只需在後台啟動一個腳本並將 stdout 和 stderr 傳輸到日誌文件即可。
以下是bubblegum_ci 的內容:
#!/usr/bin/bash id cd /home/git/bubblegum pwd GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull -v . make genhtml doxygen
這個也很簡單;只需 cd 到另一個儲存庫,拉取任何更改,然後呼叫
make
以處理實際工作。有時它工作得很好。有時,腳本會提供以下輸出:uid=1001(git) gid=1001(git) groups=1001(git),1002(www) /home/git/bubblegum fatal: not a git repository: '.' make genhtml doxygen <the output from make showing that the commits I just pushed have not been pulled>
第一行
/home/git/bubblegum
顯然是來自 的輸出pwd
,但是 git 無法拉取,說它不是 git repo。我感到困惑的是,這有時有效,有時無效。這裡的任何人都可以闡明這個問題嗎?有沒有我沒有發現的比賽條件?否則我很想看看是否有更好的方法來處理這種事情。以下是 /home/git/bubblegum/.git 的權限:
git@fancy-server:~$ ls /home/git/bubblegum -al | grep \\.git drwxr-xr-x 8 git git 4096 Sep 2 09:58 .git
這是輸出
ls -l /home/git/bubblegum/.git/
:$ ls -l .git total 52 -rw-r--r-- 1 git git 84 Sep 2 09:58 FETCH_HEAD -rw-r--r-- 1 git git 23 Aug 31 15:42 HEAD -rw-r--r-- 1 git git 41 Sep 2 09:58 ORIG_HEAD drwxr-xr-x 2 git git 4096 Aug 31 15:42 branches -rw-r--r-- 1 git git 251 Aug 31 15:42 config -rw-r--r-- 1 git git 73 Aug 31 15:42 description drwxr-xr-x 2 git git 4096 Aug 31 15:42 hooks -rw-r--r-- 1 git git 1875 Sep 2 09:52 index drwxr-xr-x 2 git git 4096 Aug 31 15:42 info drwxr-xr-x 3 git git 4096 Aug 31 15:42 logs drwxr-xr-x 151 git git 4096 Sep 2 09:52 objects -rw-r--r-- 1 git git 114 Aug 31 15:42 packed-refs drwxr-xr-x 5 git git 4096 Aug 31 15:42 refs
這裡 si 的輸出
mount | grep home
:/dev/sda6 on /home type ext4 (rw,relatime)
問題與環境變數有關。這裡的線索是它在命令行上工作的事實,而不是在任何執行 git 鉤子的任何環境中執行的事實。
所以我把
env
命令放在腳本中,並註意到GIT_DIR="."
. 這解釋了神秘的錯誤資訊fatal: not a git repository: '.'
。果然,設置 GIT_DIR 是一回事,還有一個命令行選項可以覆蓋環境變數。還要感謝 Raphael Ahrens,他在評論中指出了命令末尾的不正確句點
git pull .
。現在執行拉取的命令看起來像這樣git --git-dir="/home/git/bubblegum/.git/" pull -v
,這似乎還不錯。