Pull to refresh

Жесткие ссылки при клонировании репозитория в mercurial

Reading time2 min
Views2.9K
При клонировании репозитория с помощью команды
hg clone A B
mercurial сначала пытается создать жесткие ссылки для файлов внутри папки .hg в новом репозитории. Это ускоряет клонирование и экономит место на жестком диске.

Жесткие ссылки поддерживаются файловыми системами Linux и Windows NTFS. Для файловых систем, которые не поддерживают жесткие ссылки (например Windows FAT), а также при клонирование через http/https или ssh с удаленного сервера mercurial полностью копирует все файлы.

Для того, чтобы mercurial создал независимый клон репозитория, можно вручную указать параметр --pull:
hg clone --pull A B

При коммите или отправке изменений (push) в репозиторий, mercurial проверяет количество жестких ссылок для каждого файла из папки .hg. Если ссылок две или больше, то перед записью жесткая ссылка для этого файла «ломается» (файл ХХХ с жесткой ссылкой копируется во временный файл, удаляется файл ХХХ, временный файл переименовывается в ХХХ).

Клонирование на общих ресурсах Windows

На компьютерах с ОС Windows при получении количества жестких ссылок на файлы, расположенные на общих ресурсах всегда возвращается 1, даже если на самом деле их больше.

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

Тут написано, что начиная с версии 1.6.3 для предотвращения таких ситуаций mercurial при коммите всегда «ломает» жесткие ссылки, если репозиторий находится на общем ресурсе Windows.

Сейчас у меня стоит версия 2.2.1, но при коммите в репозиторий на общий ресурс, другие репозитории, завязанные на него, все равно ломаются. Решилась проблема, только после того, как все репозитории были склонированы с параметром --pull.

В таком поведении по умолчанию есть некоторая магия, из-за которой можно отхватить некоторую долю головных болей, которые я успешно и отхватил. Поэтому и решил перевести сюда эту информацию. Надеюсь кому-нибудь она сэкономит время и нервы.

Оригинал: http://mercurial.selenic.com/wiki/HardlinkedClones
Восстановление сломанных репозиториев: http://mercurial.selenic.com/wiki/RepositoryCorruption
Tags:
Hubs:
+19
Comments5

Articles