2012-03-12 88 views

回答

2

當然。爲了在有人推送時執行某些操作,請創建一個post-receive hook。爲了將這些更改從裸存儲庫轉移到另一個目錄(不是Git存儲庫),您需要創建一個git archive並將其展開到您想要更新的位置。

post-receive鉤標準輸入接收已被一推,以及他們的新舊值更新了所有裁判的名單,按以下格式(其中SP是空格字符,<old-value><new-value>的修訂,和<ref-name>是被更新裁判):

<old-value> SP <new-value> SP <ref-name> 

如果你只在鏡像master到你的目標目錄有興趣,你會想,如果你看到這樣一行只執行腳本。

例如,這樣的事情可能會(信任它之前未經測試,所以測試這一點上的某個位置,你不關心)工作:

#!/bin/sh 
while read old new ref; do 
    if [ "$ref" = master ]; then 
     git archive master | tar -x -C /path/to/expand/into 
    fi 
done 

編輯:請注意,這有一個相當嚴重的缺點;如果刪除(或移動)文件,則不會刪除目標目錄中的該文件。一個可能的解決方案是在檔案行之前添加一個rm -rf /path/to/expand/into; mkdir /path/to/expand/into

+0

不錯。那麼'git archive master'是否會將來自主服務器的整個樹放入一個存檔中?如果是這樣,我怎麼才能得到從oldrev更新到newrev文件,而不是整個文件結構? – trusktr 2012-03-12 05:08:33

+0

如果有一種方法可以只獲取修改/添加的文件,那很棒。 – trusktr 2012-03-12 05:19:28

+0

@trusktr是的,'git archive master'只是創建一個tar歸檔文件,然後將其擴展到您想要寫入的位置。我建議不要只編寫更改的文件;問問自己,如果由於某種原因,你的腳本不能一次運行?這些文件不會被寫入,如果下一次推送涉及不同的文件,則您將不同步。如果你真的想只寫出已更改的文件,你可以開始玩'git diff $ old $ new | patch -p1 -d/path/to/expand/into'。 – 2012-03-12 05:22:09

0

同意Brian。但是,什麼是用例?如果你想跟蹤變化,你爲什麼不想做一個克隆?

+0

我想節省空間。擁有額外的.git文件夾幾乎是裸回購的重複,使整個事情增加50%。還有其他用途:非git位置可以映射到網絡驅動器(所以git認爲它是本地目錄,但實際上文件是通過ftp發送到服務器的)。 – trusktr 2012-03-12 05:04:44

相關問題