2015-04-02 45 views
12

我已經在我的git中央回購服務器上添加了receive.denyNonFastforwards和receive.denyDeletes。現在我想阻止本地歷史修改,如果提交已被推送到中央回購(就像mercurial默認情況下),我想我可以使用一個鉤子,但我找不到任何示例。Git如何防止公共提交的本地修改

這是一個奇怪的配置?

這聽起來像是一個基本的保障,任何人使用git應該已經激活,我很驚訝缺乏示例鉤子。

+0

我想你可以否認強行推送,不是嗎? – 2015-04-08 13:39:11

回答

3

您可以通過使用Client-Side Hooks來防止本地歷史修改,就像您使用Server-Side Hooks時一樣。

Here是客戶端鉤子代碼的一些例子。在該頁面的末尾附近有一個預先重新生成的腳本,它可以完成您正在查找的內容。

需要注意的是客戶端掛鉤不能被添加到存儲庫這樣的方式,他們將自動在下游回購成立:

由於鉤不與項目的克隆轉移,您必須以其他方式分發這些腳本,然後讓用戶將它們複製到它們的.git/hooks目錄並使其可執行。您可以在項目中或在單獨的項目中分發這些鉤子,但Git不會自動設置它們。

+0

我知道客戶端鉤子,我正在尋找一個沒有公共歷史修改鉤子的例子 – angelodiego 2015-04-08 13:12:01

+0

答案中提供的鏈接指的是一個頁面,它有一個示例pre-rebase鉤子來檢查提交是否有已被推送到遙控器。 – 2015-04-08 21:32:55

0

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

你認爲你承擔了,當你取來決定重訂基期的歷史應該是什麼裁判的租賃,你可以把只有在租約沒有被打破的情況下才返回

這允許客戶端的一些自由,並在服務器端更安全的強制推送。

0

這看起來很接近,如果不是同樣的問題作爲戰略預防或捕捉Git的歷史改寫

概括起來可以啓用

混帳配置--system接收。denyNonFastforwards真正

混帳配置--system receive.denyDeletes真正

或者寫個帖子收到鉤拒絕任何你確定是一個重寫