2009-06-22 359 views
46

我想我已經知道了這個答案,但我想我仍然會問:有沒有辦法在Mercurial中刪除單個文件的歷史記錄?

我們有一個文件被添加到Mercurial存儲庫,其中包含敏感信息。有沒有辦法在不刪除整個回購的情況下刪除該文件及其更改歷史記錄?

+0

這個答案幫助了我,即使它不是「移除」但是將repo轉換爲自己(並且您丟失了所有的changeset ID):http:// stackoverflow。com/a/22607889/714733 – jazzcat 2017-03-24 22:01:46

回答

22

不,你不能。閱讀有關它的水銀紅書的changes that should have never been部分;特別是what about sensitive changes that escape款,其中包含本段:

水銀也沒有提供一種方式 ,使文件或完全變更集 從歷史上消失,因爲 沒有辦法強制執行其 消失;有人可以輕鬆地將他們的Mercurial副本修改爲 忽略此類指令。此外, 即使水銀提供這樣的 能力,人誰根本就不是 拉着「使此文件消失」 變更不會受到它的影響, 也不會網絡爬蟲在 錯誤的時間參觀,磁盤備份或其他 機制。事實上,沒有分佈式版本控制系統可以使數據 可靠地消失。提供這種控制的錯覺很容易給出錯誤的安全感,並且比根本不提供它更糟糕。

的常用方法恢復提交的變化是由善變通過backout命令(再次,善變的書:dealing with committed changes)支持,但信息並沒有從資源庫中消失:因爲你永遠不知道到底是誰克隆你的倉庫中,如上所述,會給人一種虛假的安全感。

+12

是的,你可以:https://www.jitbit.com/alexblog/232-removing-files-from-mercurial-history/當然,你們都必須重新回購你的回購協議,沒有整個歷史。 – wrzasa 2014-09-20 13:07:00

+0

雖然這是被接受的答案,但這不是正確的答案。 @wrzasa在他的評論中引用了正確的答案。我親自完成了OP使用該鏈接的信息多次詢問的內容。 – Chris 2016-05-06 15:19:55

-2

汞柱移植,然後汞剝離

+0

該文件幾乎遍歷整個更改歷史記錄。你可以擴展你如何使用上面的命令清除回購中的文件歷史記錄,同時保持其他文件的更改歷史記錄不變嗎? – 2009-06-23 13:29:03

+1

您不能使用移植工具從變更集中移除單個文件 - 移植僅知道如何將整個變更集從一個分支或資源庫移動到另一個(它就像hg export | hg import)。看到我關於轉換擴展的答案。 – 2009-06-24 19:03:31

58

這是正確的,你不能輕易從水銀在這個意義上刪除特定文件,這樣做會破壞你的庫中的所有變更標識。當您更改變更集ID時,每個人都必須重新克隆存儲庫。有關在Mercurial中修改歷史記錄的後果的信息,請參閱Wiki page about editing history

如果這對你(公司的內部倉庫)可以,那麼看看convert extension。它可以執行hg→hg轉換並具有- 文件圖參數可用於排除文件等等。

7

它可能是本地的,但不是全局的,它會在添加文件之後更改每次提交的ID。爲了保持更改,您需要訪問存儲庫的每一個副本,尤其是那些從中拉出或推出的副本。

也就是說,我按照Mercurial wiki上描述的Editing History序列從我的一個存儲庫中刪除了一個文件。該序列假定修訂1301 5200a5a10d8b添加的文件path/to/badfile.cfg,這是不以任何後續的修訂改變:

  1. 啓用您的.hgrc的MQ擴展:

    [extensions] 
    mq = 
    
  2. 從上游拉最近的變化。

    hg pull 
    
  3. 進口一切從文件除了蜿蜒伸入MQ:

    hg qimport -r 1301:tip 
    hg qpop -a 
    
  4. 從提交刪除文件添加它。

    hg qpush 1301.diff 
    hg forget path/to/badfile.cfg 
    hg qrefresh 
    
  5. 將補丁轉換爲新的Mercurial修訂版。

    hg qpush -a 
    hg qfinish -a 
    
  6. 向上遊推送新版本。

    hg push -f 
    
  7. 在上游儲存庫和每一個其他拷貝,刪除舊版本。

    hg strip 5200a5a10d8b 
    

警告:此步驟可能會破壞工作,除非你很小心。如果有人自上次從上游拉出後發生了任何事情,那麼您必須在剝離前重新分配該工作。不幸的是,rebase擴展在這裏沒有幫助;您將不得不再次使用MQ,將新提交轉換爲您應用到新提示中的修補程序。

祝你好運。

4

它可以在10分鐘內完成。在一個存儲庫中,雖然有後果。

如何使用hg convert如this excellent guide中所述。基本上,您將Hg回購「轉換」爲新的Hg回購,但您可以指定在轉換期間排除的文件列表。這其中的關鍵步驟的摘錄:

Make sure all your teammates have pushed their local changes to the central repo (if any) 
Backup your repository 
Create a "map.txt" file: 

# this filemap is used to exclude specific files 
exclude "subdir/filename1.ext" 
exclude "subdir/filename2.ext" 
exclude "subdir2" 

Run this command: 
hg convert --filemap map.txt c:/oldrepo c:/newrepo 
NOTE: You have to use "forward-slash" in paths, even on windows. 
Wait and be patient 
Now you have a new repo at c:\newrepo but without the files 

至於後果......

  • 要排除添加文件後,所有變更ID將有所不同
  • 新「乾淨的「主儲存庫將不得不手動地替換現有的儲存庫
  • 所有團隊成員將不得不使用主要回購的新克隆
  • 任何其他與汞集成的服務需要注意(例如問題跟蹤器,代碼審查系統等)
相關問題