Как сохранить использование диска при клонировании репозиториев git или hg?

Я клонировал несколько деревьев на свой локальный диск, и это занимает слишком много места на моем ограниченном диске ноутбука. В отличие от нераспределенных средств управления версиями, таких как SVN и CVS, когда вы извлекаете репозиторий git или Mercurial, вы получаете все дерево, включая всю историю, и, поскольку я редко коммит какой-либо код в эти репозитории, но хочу поддерживать их в актуальном состоянии, на сегодняшний день я обнаружил, что эти распределенные системы управления версиями тратят слишком много места на локальном диске.

Пока у меня есть несколько идей по устранению этих отходов:

  • Создайте раздел zfs или btrfs на локальном диске (вероятно, петлевая файловая система, поскольку я не хочу, чтобы она была слишком постоянной), что должно лучше использовать дублированные фрагменты файлов. Это может занять слишком много циклов ЦП, что сделает его неэффективным.

  • Откажитесь от использования контроля версий и создайте сценарий для ежедневной загрузки файлов .zip, содержащих весь репозиторий. Это потребует слишком большой пропускной способности, и я бы предпочел этого не делать.

Моим окончательным решением было бы использовать git/hg так же, как мы использовали SVN и CVS — хранить историю на сервере и локально только самую последнюю версию, или хранить локально ограниченную историю, не нарушая все остальное, чтобы я мог видеть журналы или вернуть файл к предыдущей версии, и система контроля версий будет получать необходимую информацию с удаленного компьютера, если она недоступна локально.


person Tomer Cohen    schedule 11.02.2013    source источник
comment
С жесткими дисками до 0,04 доллара за ГБ это, безусловно, не стоит вашего времени. :) Сокращение сетевого трафика я понимаю полностью. Дисковое хранилище, не так уж и много.   -  person Ry4an Brase    schedule 12.02.2013


Ответы (5)


Из справочной информации hg clone:

To pull only a subset of changesets, specify one or more revisions
identifiers with -r/--rev or branches with -b/--branch. The resulting
clone will contain only the specified changesets and their ancestors.

Вы должны иметь возможность использовать синтаксис ревизий HG, чтобы ограничить количество получаемых ревизий, предполагая, что вам нужно немного больше, чем просто самая последняя. Используйте -r tip, чтобы просто получить совет.

person Mark    schedule 12.02.2013

С git вы можете использовать опцию --depth для создания только мелкой копии.

С другой стороны, таким образом вы не сэкономите много места: http://blogs.gnome.org/simos/2009/04/18/git-clones-vs-shallow-git-clones/

person aragaer    schedule 11.02.2013

С помощью svn у вас фактически есть 2 полные несжатые копии проверенной версии (в .svn есть полная копия каждого файла). С mercurial у вас есть 1 полная несжатая копия проверенной версии и одно сильно сжатое двоичное дельта-представление (внизу в .hg/store). В очень многих случаях (текстовые файлы с возможностью вывода) клон hg, содержащий все, на самом деле будет меньше, чем svn checkout одной ревизии.

Я не думаю, что ваша дедупликация на уровне блоков вообще поможет. И Mercurial, и Git используют очень эффективные бинарные дельты, которые затем сжимаются, не оставляя избыточной информации в своих хранилищах, и то, что есть, не будет выравниваться по блокам.

person Ry4an Brase    schedule 11.02.2013
comment
Я работаю над репозиториями Mozilla, размер которых составляет около 800 МБ, а размер .hg/store составляет около 1,1 ГБ и содержит историю примерно на 15 лет назад. - person Tomer Cohen; 12.02.2013
comment
Таким образом, проверка svn будет 1,6 ГБ (800 + 800), а hg — 1,9 (800 + 1100), что кажется правильным для такой большой истории. Вы не сможете уменьшить его на стороне hg без изменения истории, чтобы сделать недействительными текущие клоны, что, как я полагаю, не имеет смысла. Однако, если есть какие-то огромные ветки, которые не используются и никогда не объединялись, вы всегда можете исключить их, выборочно клонировав головы/ветки, которые вам нужны, с помощью clone -r - person Ry4an Brase; 12.02.2013

С mercurial вы можете запросить пустую рабочую копию (клонировать только папку .hg):

hg clone -U <source>

Дополнительные параметры см. в разделе hg help clone.

Надеюсь, это поможет.

person Eldad Assis    schedule 11.02.2013

Используйте "хг доля". Это позволит вам сохранить только одну общую историю и несколько проверенных ревизий в качестве рабочих копий.

person Dirk    schedule 04.07.2015