我想我已經知道了這個答案,但我想我仍然會問:有沒有辦法在Mercurial中刪除單個文件的歷史記錄?
我們有一個文件被添加到Mercurial存儲庫,其中包含敏感信息。有沒有辦法在不刪除整個回購的情況下刪除該文件及其更改歷史記錄?
我想我已經知道了這個答案,但我想我仍然會問:有沒有辦法在Mercurial中刪除單個文件的歷史記錄?
我們有一個文件被添加到Mercurial存儲庫,其中包含敏感信息。有沒有辦法在不刪除整個回購的情況下刪除該文件及其更改歷史記錄?
不,你不能。閱讀有關它的水銀紅書的changes that should have never been部分;特別是what about sensitive changes that escape款,其中包含本段:
水銀也沒有提供一種方式 ,使文件或完全變更集 從歷史上消失,因爲 沒有辦法強制執行其 消失;有人可以輕鬆地將他們的Mercurial副本修改爲 忽略此類指令。此外, 即使水銀提供這樣的 能力,人誰根本就不是 拉着「使此文件消失」 變更不會受到它的影響, 也不會網絡爬蟲在 錯誤的時間參觀,磁盤備份或其他 機制。事實上,沒有分佈式版本控制系統可以使數據 可靠地消失。提供這種控制的錯覺很容易給出錯誤的安全感,並且比根本不提供它更糟糕。
的常用方法恢復提交的變化是由善變通過backout
命令(再次,善變的書:dealing with committed changes)支持,但信息並沒有從資源庫中消失:因爲你永遠不知道到底是誰克隆你的倉庫中,如上所述,會給人一種虛假的安全感。
汞柱移植,然後汞剝離
該文件幾乎遍歷整個更改歷史記錄。你可以擴展你如何使用上面的命令清除回購中的文件歷史記錄,同時保持其他文件的更改歷史記錄不變嗎? – 2009-06-23 13:29:03
您不能使用移植工具從變更集中移除單個文件 - 移植僅知道如何將整個變更集從一個分支或資源庫移動到另一個(它就像hg export | hg import)。看到我關於轉換擴展的答案。 – 2009-06-24 19:03:31
這是正確的,你不能輕易從水銀在這個意義上刪除特定文件,這樣做會破壞你的庫中的所有變更標識。當您更改變更集ID時,每個人都必須重新克隆存儲庫。有關在Mercurial中修改歷史記錄的後果的信息,請參閱Wiki page about editing history。
如果這對你(公司的內部倉庫)可以,那麼看看convert extension。它可以執行hg→hg轉換並具有- 文件圖參數可用於排除文件等等。
它可能是本地的,但不是全局的,它會在添加文件之後更改每次提交的ID。爲了保持更改,您需要訪問存儲庫的每一個副本,尤其是那些從中拉出或推出的副本。
也就是說,我按照Mercurial wiki上描述的Editing History序列從我的一個存儲庫中刪除了一個文件。該序列假定修訂1301 5200a5a10d8b添加的文件path/to/badfile.cfg
,這是不以任何後續的修訂改變:
啓用您的.hgrc
的MQ擴展:
[extensions]
mq =
從上游拉最近的變化。
hg pull
進口一切從文件除了蜿蜒伸入MQ:
hg qimport -r 1301:tip
hg qpop -a
從提交刪除文件添加它。
hg qpush 1301.diff
hg forget path/to/badfile.cfg
hg qrefresh
將補丁轉換爲新的Mercurial修訂版。
hg qpush -a
hg qfinish -a
向上遊推送新版本。
hg push -f
在上游儲存庫和每一個其他拷貝,刪除舊版本。
hg strip 5200a5a10d8b
警告:此步驟可能會破壞工作,除非你很小心。如果有人自上次從上游拉出後發生了任何事情,那麼您必須在剝離前重新分配該工作。不幸的是,rebase
擴展在這裏沒有幫助;您將不得不再次使用MQ,將新提交轉換爲您應用到新提示中的修補程序。
祝你好運。
它可以在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
至於後果......
這個答案幫助了我,即使它不是「移除」但是將repo轉換爲自己(並且您丟失了所有的changeset ID):http:// stackoverflow。com/a/22607889/714733 – jazzcat 2017-03-24 22:01:46