我有一個裸回購,只接受推。當這樣推送時,我希望這些更改被裸露的回購站反映到另一個位置(不是克隆,只是一個沒有.git文件夾的靜態位置)。Git:裸露的回購可以跟蹤其他一些非Git位置嗎?如果是這樣,怎麼樣?
這可能嗎?
我有一個裸回購,只接受推。當這樣推送時,我希望這些更改被裸露的回購站反映到另一個位置(不是克隆,只是一個沒有.git文件夾的靜態位置)。Git:裸露的回購可以跟蹤其他一些非Git位置嗎?如果是這樣,怎麼樣?
這可能嗎?
當然。爲了在有人推送時執行某些操作,請創建一個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
。
同意Brian。但是,什麼是用例?如果你想跟蹤變化,你爲什麼不想做一個克隆?
我想節省空間。擁有額外的.git文件夾幾乎是裸回購的重複,使整個事情增加50%。還有其他用途:非git位置可以映射到網絡驅動器(所以git認爲它是本地目錄,但實際上文件是通過ftp發送到服務器的)。 – trusktr 2012-03-12 05:04:44
不錯。那麼'git archive master'是否會將來自主服務器的整個樹放入一個存檔中?如果是這樣,我怎麼才能得到從oldrev更新到newrev文件,而不是整個文件結構? – trusktr 2012-03-12 05:08:33
如果有一種方法可以只獲取修改/添加的文件,那很棒。 – trusktr 2012-03-12 05:19:28
@trusktr是的,'git archive master'只是創建一個tar歸檔文件,然後將其擴展到您想要寫入的位置。我建議不要只編寫更改的文件;問問自己,如果由於某種原因,你的腳本不能一次運行?這些文件不會被寫入,如果下一次推送涉及不同的文件,則您將不同步。如果你真的想只寫出已更改的文件,你可以開始玩'git diff $ old $ new | patch -p1 -d/path/to/expand/into'。 – 2012-03-12 05:22:09