2011-06-09 83 views
6

在我工作的一臺服務器上,我們必須以root用戶身份登錄(因爲我不會進入這裏)。我們有一個用於Web服務器的git存儲庫,但由於文件是以root身份創建的,因此git修改的文件具有錯誤的權限。修復git合併後的權限

我創建了一個令人難以置信的簡單的合併後掛鉤,我認爲這會解決問題。

#!/bin/bash 
. git-sh-setup 
chown -R www-data:www-data $GIT_DIR 

我放棄了到這個.git/hooks/post-merge具有執行權限,但是文件似乎永遠不會運行。這是我第一次試圖設置鉤子,所以也許我錯過了一些明顯的東西。

我注意到的一件事是,大多數鉤子有一個.sample文件,而合併後沒有。 (git版本1.7.4)

在此先感謝!

+0

你嘗試添加一個'echo'或以確保它沒有運行寫'tmp'文件?爲什麼'合併後'(在git pull上)而不是'post-receive'(在'git push'上)?如果你不直接在服務器上執行'git pull',那個特定的鉤子('合併後的')將不會運行。什麼'。 git-sh-setup'行應該這樣做? – VonC 2011-06-09 20:20:21

+0

我曾嘗試編寫一個臨時文件。它似乎沒有被執行。我直接在服務器上拉。我的理解是,git-sh-setup準備了必要的環境變量。 – 2011-06-09 20:47:14

+0

你可以發佈你在拉動時使用的實際命令嗎(並期望腳本可以運行)嗎? – 2011-06-10 11:59:06

回答

2

您可能已經知道,但您可能想要檢查合併後掛鉤中的EOL字符(CR)。這可能可以解釋爲什麼你的鉤子不執行(如在這個其他問題中提到的git-hook-post-merge-error-cannot-run

如果這不是解決方案,你也可以看看你的問題的另一種方法,你可以做一個任務來執行當你的版本庫中的文件在服務器上發生變化時,所有者會更改你的目錄,Cron任務本身並不會根據文件系統的變化做出反應,但是你可能會試圖使用類似inotify的東西來對服務器的git存儲庫中的更改做出反應任何改變

我希望這兩條信息能夠解決您的問題,或者至少讓您更靠近。祝您好運。

+0

確實,inotify會起作用。看起來沒有更好的方法。 – 2011-06-27 11:31:39

0

確保您將腳本添加到超級用戶組所有權。

+0

該腳本是作爲根創建的。 – 2011-06-10 11:44:03

0

也許您正在尋找post-receive hook,如果您希望腳本執行遠程存儲庫的操作。

+0

不,我想使用合併後掛鉤。 – 2011-06-10 11:44:13

0

看看「git成就」的工作方式。將git包裝在腳本中會更容易,並且可以在任何命令中執行所需的操作。鉤子是爲遠程回購而非本地設計的。合併是你在本地做的事情,所以你不會從鉤子機制中找到很多幫助。

鏈接:

http://benjamin-meyer.blogspot.com/2010/03/git-achievements.html

希望這有助於

+0

會工作,但似乎有點凌亂。 – 2011-06-27 11:29:57

+0

爲什麼它是混亂的? Git被編寫爲腳本。實際上,你使用的大多數git命令實際上都是bash腳本。不要嘗試用鉤子將其固定在方孔中。合併是將工作重點放在工作樹上的事情。腳本是你的理由。 – 2011-06-28 17:43:19

+1

那麼,如果掛鉤按照我的預期工作,我的解決方案將是兩行,也許是三行shell腳本。 爲git編寫一個包裝,雖然也許還是相當簡單的,但至少要更復雜一個數量級。 – 2011-06-28 20:07:15