簡體   English   中英

如何從Mercurial repo中刪除largefiles

[英]How to remove largefiles from Mercurial repo

另見這個問題

在不知道我在做什么的情況下,我啟用了largefiles擴展,提交了一個文件並將其推送到了窯中。 現在我知道我的方式的錯誤,我需要永久地恢復這種變化。

我遵循了SO關於這個主題的指導; 我可以在本地刪除大文件,但這不會影響窯中的遠程回購。 我試過在Kiln服務器上打開KilnRepositories中的repo並修改largefiles文件夾(以及從requires文件中刪除'largefiles'),但是幾次推/拉后文件夾和require的行返回。

有沒有辦法讓這個永久? (設置要求readonly也不起作用)。

注意:至少(對於Windows)TortoiseHg 2.4(Mercurial 2.2.1) - > 2.7.1(Mercurial 2.5.2)都是如此。 我不會代表未來或舊版本。

在查看了可用的各種mercurial擴展之后,我得出結論,一旦使用largefiles擴展提交文件,通常無法將存儲庫“返回”。

首先,為什么你不希望在你的回購中使用大文件的兩個理由:

一旦文件已作為大文件提交,要刪除它,必須從repo中刪除對“.hglf”路徑的所有引用。 退出是不夠的,因為其提交內容將引用文件的路徑,包括'.hglf'文件夾。 一旦mercurial看到這個,它會將'largefiles'寫回/.hg/requires文件,並且repo再次被大文件鎖定。 同樣用hg忘記並刪除。

選項1:如果您的倉庫處於孤立狀態(您在其所有本地和遠程位置都有對倉庫的端到端控制,並且沒有其他人從該倉庫分支),則可以使用mq擴展和剝離變更集。 如果你及時發現錯誤,這可能只是一個可行的選擇。

選項2:如果違規變更集(大文件提交)存在於草稿提交階段 (或者可以強制退回草稿),則可以將提交導入mq並使用hg qpop 取消應用變更集 這優於剝離,因為它從提取的變更集中保留了提交歷史記錄。 在現實生活中,這通常是不可能的,因為您可能已經執行了合並並從公共階段分支推送/拉出。 但是,如果抓住很快,mq可以提供一種方法來挽救回購。

選項3:如果在一個且只有一個地方(原始提交)引用了違規變更集,並且沒有人試圖退出/刪除/忘記變更集(從而創建多個引用),則可以使用hg rebase ,使用攻擊的父變更集在攻擊后折疊第一個子變更集。 在這樣做的過程中,進攻性的變化組成了一個新的頭部,然后可以用mq條剝離。 這可以在導入到mq的嘗試失敗時起作用。

選項4:如果以上都不起作用,您可以使用移植移植 ,將所有非違規變更集導出為補丁(小心以正確的順序導出它們),然后在攻擊之前更新為第一個合理的變更集,mq去除所有前向變更集的回購,然后按順序重新應用導出的補丁。

選項5 :(我最終做了什么)。 在本地克隆repo,以便有兩個副本:clone_to_keep,clone_to_destroy。 在clone_to_keep中,在攻擊之前更新到第一個合理的變更集。 Mq剝離所有前向變更集。 如果留下多個頭,則向下合並。 在clone_to_destroy中,更新到提示。 在Windows資源管理器中,將/ clone_to_destroy中的所有內容(.hg和.hglf文件夾除外)復制到/ clone_to_keep文件夾中。 在Tortoise內部,將clone_to_keep中的所有更改作為單個變更集提交。 出於歷史目的,將read_ly狀態的clone_to_destroy的一個遠程實例保留,並銷毀所有其他實例。

備選案文6:核選擇。 如果所有其他方法都失敗了,如果您不關心將repo與外部系統集成(錯誤跟蹤,CI等),您可以按照上述SO帖子並使用hg convert擴展。 這將創建受感染倉庫的新副本,刪除對違規變更集的所有引用; 但是,它通過迭代整個倉庫中的每個變更集並將其作為新變更集提交給新倉庫來實現。 這會創建一個與任何現有分支回購不兼容的倉庫 - 任何變更集ID都不會排成一行。 除非你沒有分支回購,否則這個選項可能永遠不會有效。

在所有情況下,您必須采取修復並手動重新應用到每個不同的存儲庫實例(復制repo文件夾,克隆,無論您的首選方法)。

最后,事實證明,啟用大文件是一個非常昂貴的錯誤。 這很費時間並且最終具有破壞性。 我不建議允許大文件進入你的回購。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM