2012-02-23 22 views
2

我想要在Windows上獲得一個git post-receive鉤子。Git - post-receive鉤子不能在遠程窗口服務器上工作

我使用Git 1.7.9(Msysgit),並且在本地有一個回購站,在遠程服務器上有一個回購站。我可以獲取,提交,推送等。我已經設置了一個post-receive鉤子,它應該將文件檢出到一個工作文件夾中(部署過程的一部分),但似乎不起作用。

這是我做的:

  1. 更改文件,舞臺和它承諾
  2. 推送到遠程服務器 - 成功
  3. 希望看到的回聲 - 看不到迴音
  4. 檢查服務器上的工作文件夾 - 最新文件不存在
  5. 登錄到服務器並手動運行掛接腳本 - 將最新文件簽出到工作文件夾中。

我改變了鉤子,所以除了回顯信息之外,它什麼都不做,我已經讀過,我應該在推送後在控制檯中看到它。但是這並沒有顯示出來,所以我只能假設這個鉤子沒有被解僱。

我推送HTTP服務器處理請求的服務器上的git dot aspx,並通過gui在本地進行注入。之後,我嘗試了Bonobo,當通過gui或bash控制檯進行推送時,鉤子不起作用。

我假設有人有這個工作的地方,但經過兩天尋找所有我找到的解決方案沒有幫助或沒有回答同樣的問題的人。

(我是一個git新手btw)。

乾杯。

更新

我開始認爲這可能是做的權限 - 而Unix許可,而不是NTFS。當@eis提到我使用NTFS的權限時。但經過更多的挖掘,似乎Windows上的Git仍然檢查Unix文件權限。

所以我懷疑這個問題是post-receive文件不可執行,因爲當我做一個ls -o它是-rw-r-r--(我相信)。如果我嘗試通過bash和chmod 777 post-receive進行更改,那麼執行ls -o的權限是相同的。

奇怪的是,只要我編輯後接收(與記事本+ +)的執行位被刪除。 (我的測試腳本以.bat結尾,雖然保留其執行位...)

順便說一句,我登錄的用戶是文件的所有者(根據ls -o),但我不能設置權限。

現在開始變得非常困惑。我錯過了真正明顯的東西嗎?

更新2

無論chmod 777 post-receive也不chmod a+x post-receive工作。我拿了一個新的乾淨的post-receive文件,將它上傳到服務器並檢查了權限並執行了。如果我在Windows中重命名該文件(以刪除示例),則執行將被刪除。如果我用bash與mv執行保留。 但是,無論何時編輯文件(在Windows中或在vi中使用bash),然後執行都會被刪除。

所以,現在的問題是爲什麼當我編輯文件時刪除了執行位?

希望這是最後一關,它不執行的原因...

+0

你確定你的腳本是正確的,它執行?你有沒有在那裏登錄?怎麼樣git-dot-aspx,它有沒有任何日誌? – vissi 2012-02-23 15:38:13

+0

當我登錄到服務器並通過bash控制檯手動運行時,它按預期方式運行(即回顯並簽出一些文件)。這告訴我腳本很好。然而,當我推到這個回購它不開火 - 我沒有看到回聲和文件沒有簽出。這告訴我腳本沒有被調用。 至於原木。事件查看器中沒有任何內容,找不到任何gitdotaspx日誌,Bonobo有日誌但沒有錯誤。 – Jag 2012-02-23 16:00:10

+0

它應該起作用,並且無論您使用哪個客戶端都無關緊要。 你可以檢查的幾件事: - 腳本中的shebang行 - 它是否指向有意義的東西?腳本是否使用那裏提到的shell? - 是否爲腳本正確設置了執行權限,用戶runnig git repo是否具有正確的權限? - 你的腳本結尾是否正確,對嗎? (雖然你會看到一個關於這個的錯誤) – eis 2012-02-23 16:52:19

回答

1

你將需要修補的git,使這項工作。 builtin/receive-pack.c中的檢查用於access(path, X_OK)。在msysgit中,這轉向了mingw_access,它拋棄了X_OK位,因爲它在Windows上很簡單,不受支持。

在windows上,我們沒有標誌來指定文件是可執行文件。系統經常對此進行一些模擬。例如,tcl將在PATHEXT環境變量中查找任何擴展來決定文件是否可執行。我們不能這樣做,因爲鉤子名稱是沒有任何擴展名的硬編碼。

相反,我建議更改訪問測試,只檢查文件是否存在,然後在路徑上調用execv。這個(在compat/mingw.c中)的mingw版本查找腳本文件,並將讀取shbang行並啓動適當的解釋器(sh,perl等)。所以修改builtin/receive-pack.c:run_update_hook應該讓你的工作。目前鉤子運行使用start_command,我認爲應該調用execv給你。

總之,改變訪問測試,它可能會工作。

+0

感謝@patthoyts的信息,我現在正在下載源代碼並且會看一看。雖然沒有感到過於自信 - 我只是設法瞭解你在說什麼。 (沒有你的知識進攻,只是我的:) 我是否天真認爲這應該是現成的?畢竟,如果鉤子是Git的一個組成部分,那麼git的解決方案肯定會支持這個? – Jag 2012-02-24 12:57:48

+0

只有當有人真的使它工作。我不認識任何其他人,但是當我在Windows上使用msysGit時,我在Linux上託管了所有我的中央存儲庫。任何Windows窗口都在開發工作站之間,並且從不需要任何鉤子。如果你測試了這一點,它就可以工作,那麼你可以提交補丁併爲每個人解決這個問題。 – patthoyts 2012-02-24 14:54:51

+0

是的,我想在Git中依然存在很多對nix的依賴。我下載了源代碼並查看了你的建議。它大部分是有道理的,但我沒有足夠的信心(並且沒有時間)自己來解決它。我認爲我會花時間在項目工作之間與Git進行一場比賽,但目前似乎有點過於努力。儘管答案是正確的,但我會相信你的答案。謝謝你的時間。 – Jag 2012-02-24 15:14:17

0

當在服務器上使用msysgit並通過文件共享掛鉤時,現在可以毫無問題地工作。自從答案寫完以後,這可能會在mysysgit中修復。我沒有看着它。

我也注意到,原來的問題表明git dot aspx和Bonobo正在使用哪些使用GitSharp.dll。這將意味着應用程序不會對git.exe進行脫殼,並且掛鉤將不會以相同的方式處理。

例如,GitSharp.dll在git的點ASPX使用有它自己的鉤子後收到這可能在C#中進行掛鉤實現:

public void Receive(Stream inputStream, Stream outputStream) 
{ 
    using (var repository = GetRepository()) 
    { 
     var pack = new ReceivePack(repository); 
     pack.setBiDirectionalPipe(false); 

     //setup post receive hook here 
     pack.setPostReceiveHook(new PostRecieveHook()); 

     pack.receive(inputStream, outputStream, outputStream); 
    } 
} 


public class PostRecieveHook : IPostReceiveHook 
{ 
    public void OnPostReceive(ReceivePack rp, ICollection<ReceiveCommand> commands) 
    { 
     //Do PostRecieve Hook Work Here 
    } 
} 

我希望能幫助別人與困惑是庫之間Git的實現以及調用實際git.exe的應用程序。

+0

感謝您的更新。我會檢查出來的。 (仍然沒有得到這個解決:)) – Jag 2013-10-01 11:12:39

+0

關於它的任何消息?我也無法讓它工作......:| – 2017-05-05 11:57:46

相關問題