2012-01-10 76 views
1

我有一個「中央」Mercurial存儲庫,它被配置爲使用HTTPS並要求驗證克隆推入推送更改。開發人員在自己的計算機上擁有自己的存儲庫。他們配置其本地設置隨意,例如像歷史上的Mercurial認證信息

[ui] 
username = anyname 

欄目添加到他們的本地mercurial.ini文件。

當用戶嘗試將其更改推送到「中央」存儲庫時,他會進行身份驗證,但身份驗證信息未存儲在Mercurial中。 Mercurial存儲在本地配置的用戶名作爲中央存儲庫中的修訂版本。所以我無法找到真正在中央存儲庫中進行更改的人員,但我強烈希望這樣做。 Mercurial開發人員並不關心它,並認爲這種行爲是正確的。

但我想保持認證信息附近的變化。我認爲最好的方法是在修訂說明中添加一個額外的字段,如「推送者ID」並存儲認證數據。

我發現的擴展沒有實現類似的功能。你可以給我關於一些第三方擴展,鉤子或只是代碼模板或想法如何做的信息? (我在Python中絕對是新的)

回答

4

使Mercurial開發者(像我自己)拒絕這個的根本問題是,變更集是不可變的。服務器在推送時向變更集添加額外信息是不可能的。

更具體地說:變更集由其變更集散列標識。這個哈希是基於變更集包含的所有信息計算出來的,例如用戶名,日期,提交消息和更改本身。如果不更改changset哈希值,則不能更改其中的任何部分 - 否則會損壞儲存庫的完整性。

這給你安全對服務器上發生意外(或惡意的!)的變化:如果Alice和Bob談「變更X」,那麼他們可以確信他們真正的意思是一樣的。如果服務器(或其他人)可以在不影響ID的情況下更改變更集的內容,那麼Alice和Bob將不能保證「X」在他們的存儲庫中真正意味着相同的 。該屬性當然也是Mercurial在同步存儲庫時工作的基礎。

你這裏有兩種選擇:

  1. 您可以讓服務器拒絕推如果Alice試圖推動與鮑勃在名字的變更。這可以通過服務器上的pretxnchangegroup鉤子完成。它將檢查HG_SOURCE環境變量並確認列出的用戶也是HG_NODEtip之間的所有推送更改集的提交者。

  2. 您可以讓服務器登錄推動器。這被稱爲「推力日誌」。 Mozilla項目uses one和源appears to be here。在那裏你可以讓你的服務器存儲誰推動什麼的信息。這是在一個changegroup鉤子中完成的,該鉤子在一個小型數據庫中記錄必要的信息。

    如果你想推日誌,然後看看Kallithea,它內置了這個功能。卡里地亞是一般舉辦的Mercurial庫的好方法!它的功能比正常的hgweb CGI腳本多得多。

+0

Martin,謝謝你的回答。是的,我的意思是我需要知道「誰推動變革」,而不是「誰創造了它」。不幸的是,我沒有發現自己的mozilla的擴展(我認爲是錯誤的關鍵字)。不幸的是,這個項目非常適合mozilla,不能用於「開箱即用」。無論如何,經過幾個小時的閱讀文檔和測試後,我發現了一個簡單的解決方案:只需在授權用戶名(HG_URL中提供)和當前時間(具有唯一標記名)的情況下在傳入掛鉤上標記變更集。 – Sergey 2012-01-11 13:33:50

+0

但我絕對確信這些功能必須立即可用,並希望Hg開發人員能夠找到一種方法將「變更集推送者名稱」與變更集相關聯,至少可以使用即時可用的掛接或擴展。 – Sergey 2012-01-11 13:36:19

+0

@Sergey我同意開箱即可使用此功能可能很酷。它在Kallithea確實退出**。所有解決方案最終都會維護Mercurial歷史以外的數據庫 - 您可以推出自己的產品,也可以使用Kallithea提供的產品。查看[他們自己的實例](https://kallithea-scm.org/repos/kallithea/)作爲示例。 – 2014-07-30 16:19:33