2011-09-18 38 views
4

我需要一個更新後運行的鉤子(這將構建他們已更新的解決方案),而且我不想爲每個克隆我的中央存儲庫的人員手動添加該鉤子。如何在HG/Mercurial中設置由存儲庫指定的鉤子?

當有人第一次克隆我的中央存儲庫時,是否可以將掛鉤包含到該克隆中?似乎.hgrc文件不會自動克隆。

我讀過關於站點範圍的鉤子,但據我瞭解,它們在每個創建的倉庫上工作,我只想在某些倉庫上掛鉤。

回答

10

作爲Rudi already said,這是(幸好)由於安全原因不可能。但是,您可以減少每克隆工作負載以手動設置掛接:將掛接腳本作爲存儲庫的一部分發送,例如,在目錄.hghooks中,並且在您的回購庫中另外包含一個腳本,用於在克隆的hgrc中設置這些鉤子。每個同事現在只需要爲每個克隆調用一次設置腳本。

+0

這正是我所做的,從回購第一個克隆後,開發者將不得不反正運行安裝程序。它創建一個IIS站點,爲主機文件添加一個主機名,現在也改變他們的hgrc文件,我從來沒有想過在那裏添加它,這麼簡單! – sebastiaan

1

正如@Rudi先說的那樣,出於安全考慮不能這樣做。

通過一些先前的設置,您可以使鉤子在克隆上運行,但在/etc/mercurial或每個用戶的~/.hgrc中放置回購相對路徑的掛鉤,在公司設置中可以通過系統管理工具或通過構建自定義Mercurial安裝程序。在非公司背景下,請遵循@ Oben的建議並提供腳本和自述文件。

+0

值得一提的是'/ etc/mercurial'中定義的鉤子可以被用戶覆蓋*(如果他們希望的話) – zerkms

+0

一個很好的觀點。你可以幫助人們不要忘記配置鉤子,但是你不能讓它們在自己的機器上運行。 –

3

這將允許集中的per-repo掛鉤,每個用戶只需一個設置步驟。然而,它會爲與網絡斷開連接的用戶造成問題。另一種方法是,如果你傾向於讓斷開連接的開發人員(或者高延遲/低帶寬鏈接的開發人員)擁有包含掛鉤的repo,並將每個用戶的全局hgrc設置爲指向該repo(並且需要定期從中央吊鉤回購)。

請注意,我將第一次提交的ID視爲「回購ID」 - 這假設每個存儲庫中的第一次提交在某些方面是唯一的 - 內容或提交消息。如果情況並非如此,那麼您可以做同樣的事情,但將其應用於前N個提交 - 但是您必須考慮少於N次提交的回購 - 例如,不能僅以repo[:5]作爲新提交更改回購ID。我個人建議第一次提交可能應該是一個標準的.ignore文件,並提供該回購特有的提交消息。

  1. 有一箇中央shared_hgrc文件,可以從網絡共享(或掛鉤回購)訪問。

  2. 每個用戶的總體擁有hgrc:

    %include /path/to/shared_hgrc 
    
  3. 創建的蟒蛇鉤子模塊共享的存儲庫。鉤子必須用python編寫。

  4. 創建您的掛鉤函數。在每一個功能,檢查其回購的鉤子已經呼籲通過檢查第一的ID承諾:

    # hooktest.py 
    
    import mercurial.util 
    
    FOOBAR_REPO = 'b88c69276866d73310be679b6a4b40d875e26d84' 
    
    ALLOW_PRECOMMIT_REPOS = set((
        FOOBAR_REPO, 
    )) 
    
    def precommit_deny_if_wrong_repo(ui, repo, **kwargs): 
        """Aborts if the repo is not allowed to do this. 
        The repo ID is the ID of the first commit to the repo.""" 
    
        repo_id = repo[0].hex().lower() 
    
        if repo_id not in ALLOW_PRECOMMIT_REPOS: 
         raise mercurial.util.Abort('Repository denied: %s' % (repo_id,)) 
    
        ui.status('Repository allowed: %s\n' % (repo_id,)) 
    
    def precommit_skip_if_wrong_repo(ui, repo, **kwargs): 
        """Skips the hook if the repo is not allowed to do this. 
        The repo ID is the ID of the first commit to the repo.""" 
    
        repo_id = repo[0].hex().lower() 
    
        if repo_id not in ALLOW_PRECOMMIT_REPOS: 
         ui.debug('Repository hook skipped: %s\n' % (repo_id,)) 
         return 
    
        ui.status('Repository hook allowed: %s\n' % (repo_id,)) 
    
  5. 在shared_hgrc文件,設置您需要的掛鉤(確保你有資格掛鉤名防止衝突):

    [hooks] 
    pre-commit.00_skip = python:/path/to/hooktest.py:precommit_skip_if_wrong_repo 
    pre-commit.01_deny = python:/path/to/hooktest.py:precommit_deny_if_wrong_repo 
    
相關問題