2012-05-08 155 views
19

我在我的服務器上有一個非裸存儲庫(dirs/home/andrew/web和/home/andrew/web/.git),設置receive.denyCurrentBranch忽略和創建後收到鉤:Git checkout in post-receive hook:「Not git repository'。」

#!/bin/sh 
GIT_WORK_TREE=/home/andrew/web git checkout -f 

當我運行git的SH /掛鉤/後收到,一切工作正常。但是,當我從我的電腦推我得到這個錯誤:

remote: fatal: Not a git repository: '.' 

有沒有一種方法,我怎樣才能解決這個問題呢?最終,無需切換裸回購?

謝謝

編輯:這是我的新後接收掛鉤。爲什麼在接受的答案中已經描述了這一點。

echo "\nChecking out $PWD" 
GIT_DIR=/home/andrew/web/.git 
GIT_WORK_TREE=/home/andrew/web git checkout -f 
+0

你用什麼命令來推送,特別是:什麼是遠程URL? – Simon

+0

@Simon我使用「git push origin」,我的遠程URL是「[email protected]:web」。 – A123321

+0

您可以嘗試完整路徑'[email protected]:/ home/andrew/web',但我認爲真正的問題是您的遠程回購並不光滑。你可以嘗試強制推送:'git push -f origin' – Simon

回答

25

[編輯,2017年2月:這個舊的答案仍然有點點,所以讓我們添加一些筆記。 (1)這種實時更新通常是一個壞主意:確保你知道你爲什麼要這樣做,而且你不會破壞你自己的工作。 (2)從2.3開始,在Git中,現在可以配置receive.denyCurrentBranchupdateInstead,再加上Git 2.4和更高版本中的鉤子調整。有關詳細信息,請參見the git config documentation。]

後接收掛鉤運行$GIT_DIR設置爲.。這將導致混帳尋找./HEAD./refs/heads/master,等等,而不是.git/HEAD.git/refs/heads/master,等等。但是,既然你沒有做任何事情在鉤改變$PWD(如反正所示),鉤將在.git運行子目錄(/home/andrew/web/.git),因此這個失敗是相當神祕的:.實際上將是一個有效的git存儲庫。

避免硬編碼路徑名的一個標準技巧是使用cd ..; git checkout -f作爲post-receive鉤子。這是$GIT_DIR的設置成爲問題的原因,因爲cd ..掛鉤運行後(仍假定此情況)/home/andrew/web,當然在此時,$GIT_DIR應該是.git而不是.。對此的標準修復只是爲了取消設置GIT_DIR(將其設置爲.git也可以)。

雖然(適當的硬編碼路徑更改),但您顯示的post-receive鉤子對我來說工作正常。然後我再次從類似Unix的機器中推出,而不是個人電腦。是否有可能還有其他事情發生,是否將.git子目錄中的目錄更改?您可以在鉤子中執行諸如echo running in $PWD之類的操作,以查看您的位置。

+1

謝謝!我花了很多年,沒有人能夠解釋。 – A123321

+2

設置'$ GIT_DIR'爲'.git'和'cd'爲我工作的目錄。謝謝! – bkconrad

+3

我的post-receive中的'unset GIT_DIR'爲我工作。 –