Как безопасно отключить/удалить каталог больших файлов из репозитория mercurial?

В прошлом я работал с расширением largefiles в mercurial для сохранения данных вместе с кодом, над которым я работал. Я думаю, что это была ошибка, и я хотел бы удалить каталог «большие файлы» (8 ГБ). Наши сетевые пользовательские каталоги ограничены 10 ГБ, и мне нужно место. Я уже давно не использую большие файлы. Я не буду скучать по ним, когда они уйдут навсегда.

Итак, мои вопросы

  1. Могу ли я удалить каталог больших файлов в .hg, не повредив репо?
  2. Если я это сделаю, смогу ли я проверить старый код, даже если некоторые большие файлы данных отсутствуют?
  3. Должен ли я удалить эти файлы из всех клонов этого репозитория, чтобы избежать повторного загрязнения всех репозиториев большими файлами из другого клона?

person Stephan    schedule 22.01.2013    source источник


Ответы (2)


Для вашего первого вопроса я провел эксперимент:

  1. Создал репо с большим файлом.
  2. hg update null
  3. Удалено .hg\largefiles
  4. hg update

Вернулись большие файлы! Оказывается, по крайней мере, в Windows большие файлы также кэшируются в %UserProfile%\AppData\Local\largefiles. Поскольку это была моя единственная база данных с большими файлами, она содержала только один мой большой файл, поэтому я удалил и его. Этот кеш содержит большие файлы из нескольких локальных баз данных с поддержкой больших файлов, поэтому с ним нужно быть осторожным. Если кажется расточительным иметь две копии, оказывается, если локальные базы данных находятся на том же диске, что и %UserProfile%, то они жестко связаны. В моей системе два диска, и оказывается, что если база данных находится на другом диске, она все равно копируется в папку AppData, но не жестко связана и удваивает использование вашего диска.

Как только все копии большого файла были удалены, hg update дал:

1 files updated, 0 files merged, 0 files removed, 0 files unresolved
getting changed largefiles
largefile.dat: can't get file locally
(no default or default-push path set in hgrc)
0 largefiles updated, 0 removed

Затем я удалил [extensions], largefiles= из .hg\hgrc, чтобы отключить расширение. На данный момент репозиторий работал нормально, но все еще имел каталог .hglf с хэшами в наборах изменений, которые раньше содержали большие файлы. поэтому ответ на ваш второй вопрос - да, вы можете проверить старый код.

Для вашего третьего вопроса, чтобы устранить все следы больших файлов и хэшей, создайте файл с:

exclude .hglf

и запустите:

hg convert --filemap <file> <srcrepo> <destrepo>

Затем вашим пользователям придется клонировать этот новый измененный репозиторий, потому что convert изменяет наборы изменений, и новая база данных не будет связана со старой.

person Mark Tolonen    schedule 22.01.2013
comment
Спасибо за такой четкий и подробный ответ! Действительно, каталог больших файлов сразу возвращается, но пустой (после того, как я удалил пользовательский кеш). Затем, когда я отключу расширение в .hg/hgrc, в следующий раз, когда я наберу hg st, произойдет следующее: abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)!. Как только я включаю расширение largefiles, оно снова работает. Так что я не могу передать ваш второй пункт прямо сейчас. - person Stephan; 22.01.2013
comment
Вы убедились, что .hg\largefiles все еще удалено после отключения расширения? - person Mark Tolonen; 22.01.2013
comment
Привет, да, я сделал. Но теперь я знаю, в чем была проблема. Существует еще один файл с именем .hg/requires, который содержит строку largefiles. Я просто удалил эту строку и теперь все работает. Возможно, вы использовали другую версию mercurial и у вас не было этого файла. В любом случае, большое спасибо за вашу помощь здесь! - person Stephan; 22.01.2013
comment
Спасибо, Марк. Я удалил последние несколько наборов изменений, так как моя ошибка была совсем недавно - также --- полезно прочитать комментарии --- - Метод Стефана .hg/requires тоже сработал для меня. В качестве бонуса удаление наборов изменений из KilnHg в браузере также работало без проблем. TortoiseHg 3.2 (и, следовательно, Hg 3.2) имеет параметр в команде Strip локального репо, чтобы не изменять рабочую копию - отметьте ее. О, вы сделали все это на копии репо, верно? - person CAD bloke; 18.11.2014

Ту же команду для преобразования простого репозитория в большие файлы, lfconvert, можно использовать и в другом направлении:

$ hg --config extensions.largefiles= help lfconvert
hg lfconvert SOURCE DEST [FILE ...]

convert a normal repository to a largefiles repository

Convert repository SOURCE to a new repository DEST, identical to SOURCE
except that certain files will be converted as largefiles [...]

Use --to-normal to convert largefiles back to normal files; after this,
the DEST repository can be used without largefiles at all.

Таким образом, следующая команда сделает свое дело:

$ hg --config extensions.largefiles= lfconvert --to-normal <LARGEFILE_REPO> <PLAIN_REPO>

Вам нужно будет координировать свои действия с вашей командой, чтобы:

  1. все вносят свои последние изменения в главный репозиторий больших файлов
  2. доступ к основному репозиторию отключен навсегда (во избежание случайных нажатий)
  3. все удаляют расширение largefiles из своих $HOME/.hgrc
  4. удалите расширение largefiles из hgrc пользователя, предлагающего доступ к основным репозиториям (расположение hgrc зависит от того, как главные репозитории являются серверными, SSH или HTTP). Это сделает невозможным, чтобы кто-то случайно добавил большой файл в клон нового репо и отправил его!
  5. выполнить преобразование основного репо в обычное репо
  6. принять решение об изменении имени/пути (если есть) для нового основного репо
  7. включить доступ к новому, простому основному репо
  8. все клонируют новое простое репо

Обратите внимание, что lfconvert доступно, только если расширение largefiles включено. Я предлагаю, следуя пункту 3, удалить его из $HOME/.hgrc и включить его одной командой с параметром --config extensions.largefiles=, как показано в примере выше.

Также обратите внимание, что преобразование в обычный репозиторий позволит использовать недавнее расширение fsmonitor, которое использует механизм inotify ядра (или его эквивалент в MacOSX) для значительного ускорения некоторых операций, таких как hg status. Например, для огромного репозитория, который у меня есть, hg status увеличилось с 10 до 0,5 с :-)

person marco.m    schedule 20.06.2016