Повреждение данных ртутного репозитория

У меня есть ртутный репозиторий c:\Dropbox\code. Я создал клон этого репо локально, используя:

hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup

Это голое репо служит только для резервного копирования. Я регулярно выкладываю изменения в codeBackup. Кроме того, резервные копии обоих каталогов хранятся в облаке (Dropbox и Google Drive соответственно).

Если мое репо в code станет поврежденным, будет ли автоматически повреждено codeBackup репо, поскольку операция клонирования использовала жесткие ссылки на исходное репо? Таким образом, моя стратегия двойного резервного копирования в облако была бы бесполезной?

P.S. : Я понимаю, что резервным вариантом является использование облачной службы для восстановления предыдущего заведомо исправного состояния.


ОБНОВЛЕНИЕ: покопавшись, я добавлю их для справки.

Проблема в том, что если был выполнен 'hg clone' (без параметра --pull), то место назначения и исходное репо совместно используют файлы внутри .hg / store с помощью жестких ссылок 1, если файловая система поддерживает функцию жестких ссылок (NTFS делает).

Mercurial спроектирован так, чтобы разрывать такие жесткие ссылки внутри .hg, если выполняется фиксация или отправка одного из клонов. Предварительным условием для этого является то, что Windows API, который использует mercurial, должен давать правильный ответ, если mercurial спрашивает «сколько жестких ссылок в этом файле?».

Мы обнаружили, что этот ответ почти всегда неверен (всегда указывается 1, даже если на самом деле он> 1), если процесс hg запущен на одном компьютере с Windows, а файлы репозитория находятся в общей сетевой папке на другом компьютере с Windows.

  • Чтобы избежать жестких ссылок (используйте --pull):

    hg clone -U --pull c:\Dropbox\code c:\GoogleDrive\codeBackup

  • Чтобы проверить жесткие ссылки:

    fsutil hardlink list <file>: показывает все жесткие ссылки для <file>

    find . -links +1: показывает все файлы с жесткими ссылками> 1

    ls -l: показывает количество жестких ссылок рядом с каждым файлом


person user    schedule 01.07.2013    source источник
comment
Если вы боитесь повредить свой репозиторий, пожалуйста, не используйте какое-либо программное обеспечение для синхронизации, такое как Dropbox или Google Drive, для его копирования между компьютерами, вместо этого используйте механизмы, предназначенные для этого, т.е. ртутное клонирование, выталкивание и вытягивание.   -  person Lasse V. Karlsen    schedule 02.07.2013


Ответы (2)


Единственный способ, которым ваш репозиторий code может стать поврежденным (при условии, что он не был поврежден, когда вы изначально клонировали его в codeBackup), - это когда вы пишете что-то в него, будь то фиксация, перезапись истории и т. Д. записывается в файл с жесткой связью, Mercurial сначала разрывает жесткую ссылку, создает независимую копию файла, а затем изменяет только эту вновь созданную копию.

Итак, чтобы ответить на ваши вопросы: при нормальных сценариях использования повреждение репозитория не распространяется на ваш codeBackup репозиторий.

person Anton Gogolev    schedule 01.07.2013
comment
Что произойдет, если Dropbox - это тот, кто пишет в файл? Значит, хардлинк не работает? - person Lasse V. Karlsen; 02.07.2013

Самая большая проблема, связанная с повреждением репозитория, заключается в том, что вы используете Dropbox и Google Drive для синхронизации репозиториев на разных машинах.

Не делайте этого!

Это обязательно приведет к повреждению репозитория, если вы не можете гарантировать, что:

  1. Ваши машины никогда не потеряют интернет-соединение
  2. У вас никогда не будет новых изменений, несинхронизированных более чем на одном компьютере одновременно (включая случаи, когда у вас были проблемы с Интернетом).
  3. Этот Dropbox будет работать всегда (вариант никогда не терять интернет-соединение)
  4. Вам не просто не повезло со сроками

Чтобы убедиться, что Dropbox может легко привести к повреждению репозитория, выполните следующие действия:

  1. Перейдите в папку внутри папки Dropbox или Google Диска и создайте здесь репозиторий Mercurial. Сделайте это на одной машине, назовем ее A.
  2. Добавьте к нему 3 текстовых файла с некоторым содержимым (не пустым) и зафиксируйте эти 3 текстовых файла.
  3. Подождите, пока Dropbox / Google Drive синхронизирует все эти файлы на вашем втором компьютере, назовем этот компьютер B.
  4. Либо отключите интернет на одной из машин, либо остановите на ней Dropbox / Google Drive (неважно на какой)
  5. На компьютере A измените файлы 1 и 2, добавив или изменив их содержимое. На машине B измените файлы 2 и 3, обязательно добавив / изменив содержимое, отличное от того, что вы делали на машине A. Зафиксируйте все изменения на обеих машинах.
  6. Повторно подключитесь к Интернету или перезапустите Dropbox / Google Диск, в зависимости от того, что вы сделали на шаге 4.
  7. Дождитесь завершения синхронизации (Dropbox покажет зеленую галочку на значке в трее, не уверены, что будет отображать Google Диск)
  8. Запустите hg verify в репозиториях на обоих компьютерах A и B

Обратите внимание, что теперь они оба повреждены:

D:\Dropbox\Temp\repotest>hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
 3.txt@?: rev 1 points to unexpected changeset 1
 (expected 0)
 3.txt@?: 89ab3388d4d1 not in manifests
3 files, 2 changesets, 6 total revisions
1 warnings encountered!
2 integrity errors encountered!

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

person Lasse V. Karlsen    schedule 01.07.2013
comment
Этот. Этот. В 1000 раз больше. - person Ry4an Brase; 02.07.2013
comment
НЕТ! Не синхронизируйте репозитории mercurial или git с помощью Dropbox или любого другого подобного инструмента! Я не могу этого особо подчеркнуть! Помните, что Dropbox - это двусторонняя синхронизация, и для того, чтобы все испортить, требуется всего лишь небольшая проблема на одном конце. - person Lasse V. Karlsen; 02.07.2013