2012-10-09 145 views
0

我們在遠程存儲庫上安裝了一個掛鉤,以便在收到推送後自動更新回購。除非我們在本地刪除一個文件然後推送,否則它工作得很好。我們收到如下消息:Mercurial:遠程hg更新掛鉤後的強制刪除

remote: local changed path/to/file/file.ext which remote deleted 
remote: use (c)hanged version or (d)elete? c 

它會自動選擇'c'。有沒有辦法讓我們讓Mercurial使用'd'並刪除文件?

這裏有掛鉤,也張貼在評論,但希望換行符被保存在這裏:

[hooks] 

changegroup = hg update >&2 

incoming = /path/filename.sh > /dev/null 2>&1 

的sh文件重置汞柱更新後的一些權限。

+0

請張貼鉤子的代碼。 –

+0

這裏是鉤的代碼: [鉤] changegroup =汞柱更新>&2 傳入= /path/filename.sh>的/ dev/null的2>&1 的sh文件更新後重置某些權限。 – mrceolla

回答

0

錯誤消息表示「您的本地工作副本包含更新嘗試刪除的修改後的文件」。

如果在遠程服務器(即遠程存儲庫內部)上運行「hg st」,則應該看到已修改的文件。請注意,更改文件的權限被視爲更改。

所以會發生什麼是這樣的:

  • 你當地的水銀推動文件到遠程倉庫
  • 掛鉤的變化在遠程庫文件(通過修改它們的權限)。
  • 有人試圖刪除這些文件

水銀總是試圖以防止數據丟失的一個,所以默認選項是「保留本地修改」(因爲你可以隨時刪除這些文件後,如果你想,但你可能無法恢復它們)。

你能做什麼?

  • 而不是「固定」遠程倉庫的權限,拒絕接受具有錯誤權限的更改集。也就是說,不是修復權限,而是在pretxnchangegroup鉤子中檢查它們。如果權限錯誤,請中止。這樣,只要權限被破壞,您就無法推送。 Docs

  • 而不是修改工作副本,將文件複製到一個新的地方,並更改那裏的權限。這浪費了一些磁盤空間(但不如使用軟鏈接或硬鏈接時所想的那麼多),但它將問題(版本化文件的特殊權限)分開。

[編輯]

新文件,本地添加然後推到遠程回購,鬆散執行權限。

他們不會失去它,他們並沒有擺在首位:Windows不支持這種Unix功能。

不幸的是,you can't tell Mercurial to set the bit from Windows

要正確地解決這個問題,用這個辦法:

  1. 添加和從Windows文件推像以前
  2. 創建,檢查權限和發送電子郵件科幻他們是錯的Unix服務器上的cron作業。
  3. 當電子郵件進入時,連接到Unix服務器並修復權限
  4. 提交併推送來自Unix的更改。

如果您在Windows上修改文件,Mercurial將保留執行位。

我建議把最後兩個步驟放到腳本中。我不認爲你可以完全自動化;當某人在運行時推送更改時,該腳本將(經常)失敗。

PS:我已經遞交了功能要求,要求一個更好的解決方案:Provide a way to modify the Unix permissions from Windows

+0

謝謝你的信息。我們從Windows機器推到紅帽。我們通過我們的Windows機器上的紅帽虛擬機測試這些文件,並且所有權限都很好。然而,一旦他們把它送到遠程的紅帽服務器,他們就不再正確。我不知道這是爲什麼。實際上我們使用鏈接,但是這兩個位置的權限總是相同的。我錯過了什麼?在這種情況下,是否沒有辦法改變Mercurial的默認行爲,並允許它刪除'修改'的文件?謝謝。 – mrceolla

+0

權限如何更改? –

+0

新文件,本地添加,然後推送到遠程回購,鬆散的執行權限。 – mrceolla