2010-04-13 61 views
24

我有我的服務器上更新後掛機,這樣,當我什麼用戶運行git鉤子?

git push 

它在實時web目錄上拉。但是,儘管推送總是成功,但更新後的掛鉤有時會失敗。

鉤很簡單:

#!/bin/sh 
# 
# An example hook script to prepare a packed repository for use over 
# dumb transports. 
# 
# To enable this hook, rename this file to "post-update". 
cd /var/www 
env -i git pull 

我推更新來自不同的地方,但有時我需要登錄的服務器上的根和手冊冊做

env -i git pull 

但我只需要20%的時間。任何想法爲什麼它會隨機失敗?另外,我如何獲取它來記錄錯誤消息,因爲它可能作爲無法寫入文件系統的人運行?

+0

你是否從所有這些地方以相同的方式推動?也就是說,所有的遠程URL都是一樣的嗎? (尤其是用戶@主機名部分) – Cascabel 2010-04-13 04:34:59

+0

另外,當你說失敗時,你是否確實意味着它失敗了,並且有一個權限被拒絕的錯誤,表明它以特權不足的用戶身份運行?還是因爲一些完全不相關的原因而失敗,與uid運行無關? – Cascabel 2010-04-13 04:38:06

+0

我實際上是從不同的地方推送的:有時它是user1 @ hostname,othertimes,user2 @ hostname等(它們都有這個問題)。 失敗時沒有可以看到的錯誤消息,而且我不確定如何獲取。在我的更新後,我添加了> echo $ USER> /log.txt,但沒有寫入任何內容(也沒有創建文件)。這讓我想到用戶推送,沒有權限。但是,如果我甚至不能寫出錯誤信息,我將如何知道? – ash 2010-04-13 17:35:17

回答

18

掛鉤以用戶進行推送的方式運行。如果您有某種預先設置的設置,可能是gitgitosis這樣的用戶,也可能是您。只要看看你如何配置遠程。 (git remote show <remote-name>或者只是在不知道的情況下檢查.git/config)推測你是通過SSH推送的,URL中有一個username @ hostname。

P.S.這很快就證明了這一點 - 只需在本地克隆一個回購站,用echo $USER或類似的方法拋出更新後的掛鉤,然後嘗試按自己或其他用戶(直接或通過ssh)推送。

2

我決定通過創建一個測試這個我gitlab 6服務器上預先接收鉤呼應了用戶信息

$ cat /home/git/repositories/foo/foo.git/hooks/pre-recieve 
#!/bin/bash 
set -x 
echo -e "The user the hook is run as is $USER" 
echo -e "Just to doublecheck, the user is $(whoami)" 
exit 1 

看起來它運行的git的用戶

$ git push 
Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
remote: + echo -e 'The user the hook is run as is' 
remote: The user the hook is run as is 
remote: ++ whoami 
remote: + echo -e 'Just to doublecheck, the user is git' 
remote: Just to doublecheck, the user is git 
remote: + exit 1 
+0

原因是所有這些服務器都配置一個unix用戶通過'〜git/.ssh/authorized_keys'文件來接受傳入的ssh連接。該文件將這些連接委託給一個腳本,該腳本將處理傳入的數據。對於這樣的服務器,可以推導出推送人員的姓名,例如,通過假設它是最近一次提交的同一個人。然而這可能根本不適用。取決於用戶的工作模式。最好只檢查或報告個人提交的作者/提交者。 – cfi 2016-01-21 15:45:45