Git

為什麼這條路徑有時不是 git 儲存庫?

  • September 2, 2021

我有一個 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,這似乎還不錯。

引用自:https://unix.stackexchange.com/questions/667278