我已經在我的git中央回購服務器上添加了receive.denyNonFastforwards和receive.denyDeletes。現在我想阻止本地歷史修改,如果提交已被推送到中央回購(就像mercurial默認情況下),我想我可以使用一個鉤子,但我找不到任何示例。Git如何防止公共提交的本地修改
這是一個奇怪的配置?
這聽起來像是一個基本的保障,任何人使用git應該已經激活,我很驚訝缺乏示例鉤子。
我已經在我的git中央回購服務器上添加了receive.denyNonFastforwards和receive.denyDeletes。現在我想阻止本地歷史修改,如果提交已被推送到中央回購(就像mercurial默認情況下),我想我可以使用一個鉤子,但我找不到任何示例。Git如何防止公共提交的本地修改
這是一個奇怪的配置?
這聽起來像是一個基本的保障,任何人使用git應該已經激活,我很驚訝缺乏示例鉤子。
您可以通過使用Client-Side Hooks來防止本地歷史修改,就像您使用Server-Side Hooks時一樣。
Here是客戶端鉤子代碼的一些例子。在該頁面的末尾附近有一個預先重新生成的腳本,它可以完成您正在查找的內容。
需要注意的是客戶端掛鉤不能被添加到存儲庫這樣的方式,他們將自動在下游回購成立:
由於鉤不與項目的克隆轉移,您必須以其他方式分發這些腳本,然後讓用戶將它們複製到它們的.git/hooks目錄並使其可執行。您可以在項目中或在單獨的項目中分發這些鉤子,但Git不會自動設置它們。
我知道客戶端鉤子,我正在尋找一個沒有公共歷史修改鉤子的例子 – angelodiego 2015-04-08 13:12:01
答案中提供的鏈接指的是一個頁面,它有一個示例pre-rebase鉤子來檢查提交是否有已被推送到遙控器。 – 2015-04-08 21:32:55
Mercurial提供了一些方法來處理可變chagenset(您可以重新排序/重寫的變更集)。例如與ChangeSet Evolution plugin。
的可能性是在使用Git服務器端較爲有限
你不能輕鬆地執行鉤在客戶端(你可以在問題中提到的兩個配置否認push --force
),因爲它需要激活,並可以通過git commit --no-verify
繞過。
但是在Git 1.8.5之前,有一個pre-rebase client hook called。
的Git 1.8.5後,你可以做一個客戶端a git push --force-with-lease:
你認爲你承擔了,當你取來決定重訂基期的歷史應該是什麼裁判的租賃,你可以把只有在租約沒有被打破的情況下才返回。
這允許客戶端的一些自由,並在服務器端更安全的強制推送。
這看起來很接近,如果不是同樣的問題作爲戰略預防或捕捉Git的歷史改寫
概括起來可以啓用
混帳配置--system接收。denyNonFastforwards真正
和
混帳配置--system receive.denyDeletes真正
或者寫個帖子收到鉤拒絕任何你確定是一個重寫
我想你可以否認強行推送,不是嗎? – 2015-04-08 13:39:11