2013-06-13 61 views
1

在一箇中央git倉庫中,我需要忽略特定文件在推送到倉庫時對其所做的更改。我不想拒絕(失敗)整個推送,但只是忽略這些更改。有沒有我可以使用的git鉤子只會過濾掉一些更改?Git服務器掛鉤默默忽略對特定文件的更改

我想過使用filters,但我不相信他們會得到在中央回購使用,因爲它是「裸」,例如,沒有一個工作副本。

詳細信息:以類似於this的場景,幾十個開發者的正在推動修改這些文件。 我試着在中央回購庫上使用git update-index --assume-unchanged,但是它會被「流浪」開發者所做的每一次推動重置,然後在他們拉動的時候傳播給其他開發者。我無法立即改變所有開發者的回購協議。我想在中央倉庫進行一次更改,然後忽略這些文件的更改。

回答

0

這在技術上是可行的,但它帶有巨大的實際麻煩(更不用說掛鉤很難編寫):客戶端仍然會有未過濾的歷史記錄,因此在下一次推送時它會查找客戶端就好像服務器與自己的歷史完全不同。用戶最終會將過濾的歷史記錄與未過濾的歷史記錄合併在一起,然後再按下鉤子進行過濾,故事將繼續重複。

出於這個原因,它通常是更好地拒絕鉤或讓所有開發者安裝一個pre-commit鉤子,做一些類似。

如果你喜歡疼痛,下面是如何做到這一點的輪廓預先收到反正/更新鉤:

  • 檢查,使用涉及git rev-list東西,無論任何有問題的文件被感動。如果不是,只需保釋出來,因爲接下來的步驟會非常痛苦。
  • 暫時檢出歷史前推,因爲它是(這可以使用本git-new-workdir的contrib腳本是可能的)。
  • 找出新提交列表。
  • 應用其中的每一個,立即修改相關文件的更改。
  • 擺脫臨時結賬。
  • 更新的分支,並與非零代碼鉤子出口(這會導致向用戶顯示一個錯誤,但是你可以用它一起發送一個不錯的消息)。這可以防止正常的推送過程更新分支本身並撤消您的辛勤工作。
0

你根本就做不到這一點,因爲從提交排除文件將改變哈希。我的意思是你可以這樣做,但你絕對不想要它。

在您的情況最合理的解決方案實際上是拒絕該修改與像「你不能修改以下文件:...」有意義的錯誤,這些文件的提交和教育你的commiters。