2010-08-22 158 views
16

我有一個使用gitolite設置的中心git倉庫。從git更新鉤子調用'git pull'

我想設置一個鉤子,以便無論用戶何時推送回購,都會在其他地方執行一次拉動,然後進行一些自動測試。

到目前爲止,我只想要它執行拉。

在hooks目錄我創建了下面的腳本名稱後更新:

#!/bin/sh 
cd /home/git/www/epicac 
git pull 

當我使用./post-update調用這個腳本,它正是我想要的。但是,無論何時它被自動調用,因爲我掛鉤,我得到:致命的:不是一個git存儲庫:'。'

任何想法,爲什麼這可能會發生?

+2

剛剛添加的'ENV -i混帳pull'解決方案。 – VonC 2010-08-22 19:18:51

+0

也有完全相同的問題,即使經過7年 – 2017-07-11 14:13:48

回答

25

你有不同的診斷運行在此SO answer建議。

特別是,check out the the value of GIT_DIR and GIT_WORK_TREE

雖然鉤正在運行,GIT_DIR和(如果worktree不能從GIT_DIR推斷)GIT_WORK_TREE被設置。
這意味着您的拉不會與您更改到的目錄中的存儲庫一起運行。


參見博客文章Using Git Inside a Git Hook

最終我們得到了我們的Linux大師和他注意到git的用戶在其下運行的環境是,當一個鉤子裏完全不同的。
Gitolite爲環境做了一堆事情,但是搞砸了我們的是GIT_DIR的設置。
我們想通了這一點後,該解決方案是一樣容易:

ENV.delete 'GIT_DIR' 
在我們的Ruby腳本

是由「post-receive」鉤觸發。


同樣的協議在 Git Tip: Auto update working tree via post-receive hook,但有一個優雅的出路是:

該如何解決?
原來,post-receive鉤開出與設置爲repo/.git文件夾GIT_DIR環境變量,那麼無論走什麼路,你「CD」爲它總是會嘗試運行下列任何Git命令有
修復這僅僅是取消設置GIT_DIR
(感謝烏爾裏希Petri網爲優雅env -i解決方案)的問題:

#!/bin/sh 
cd .. 
env -i git reset --hard 
7

如何指定--git-dir

#!/bin/sh 
cd /home/git/www/epicac 
git --git-dir=.git pull 
0

這應該做的伎倆,在短短一行:

git -C /home/git/www/epicac pull