
Как я могу гарантировать, что при клонировании, синхронизации и получении контента из другого репозитория git Annex я настрою идентичное зеркало?
Раньше я использовал такой инструмент, как Unison, который сравнивал файлы, но это отнимало много времени и памяти.
Есть ли другие альтернативы, чтобы я мог выполнить проверку работоспособности? Основная причина этого в том, что я только что сделал клон существующего репозитория, он меньше. Я ожидаю, что он будет меньше, потому что в старом репозитории есть неиспользуемые или неиспользуемые объекты, но он довольно сильно отличается по размеру.
Итак, я хотел бы получить чек, который я могу провести.
решение1
В Git есть встроенная проверка работоспособности ( git fsck
), которая укажет на общие проблемы со структурой метаданных git. Также есть сборщик мусора ( git gc
), который удалит висячие и другие ненужные вещи.
Что касается целостности данных... в основном это гарантия, предоставляемая git, данные, которые вы вводите, являются данными, которые вы получаете. Если git log
(или даже просто хэш последнего коммита) идентичны, то и данные тоже. Каждый шаг в git проверяется контрольной суммой, по данным, метаданным и предыдущим; это своего рода блокчейн, если данные где-то изменились, то и контрольные суммы тоже изменятся. Если контрольные суммы не совпадут, git будет много жаловаться при оформлении заказа.
Есть старый (2007-2008?) доклад Линуса Торвальдса о git, который можно посмотреть на Youtube, где он также говорит о целостности данных. Также есть некоторая документация здесь:https://git-scm.com/book/en/Git-Internals-Git-Objects
На практике люди просто не беспокоятся об этом, так как git волшебным образом заботится об этом. Вы просто делаете 'git status', чтобы увидеть, нужно ли вам pull/push/commit изменений, чтобы идти в ногу с источником.
Дополнительное использование пространства может иметь и другие причины... git stash
может быть пожирателем пространства, если вы когда-либо им пользовались.
Вот где также есть различия в клонированных репозиториях: git не заботится о локальных вещах, которые никогда не были закоммичены. Если они не закоммичены, то они не существуют с точки зрения клонов.
решение2
Я проверил, что git Annex работает так, как и ожидалось, выполнив следующие действия:
- получить отсортированный, уникальный список файлов, включая содержимое .git (это гарантирует, что у нас есть все содержимое приложения git)
- получить отсортированный, уникальный список ссылок, включая содержимое .git (это гарантирует, что у нас будет одинаковая структура репозитория)
- сравнить списки файлов, игнорировать каталог Annex/Transfer, объекты git могут отличаться, содержимое git Annex должно быть идентичным
- сравните списки ссылок, они должны быть идентичны
- запустите git Annex fsck или сравните контрольную сумму всех файлов (это проблема файловой системы)
Это работает, но может быть немного трудоемким / времязатратным. Кроме того, процесс может быть еще более усложнен, если есть зеркала, которые являются лишь частичными копиями. Для этих зеркал вам нужно сравнивать только тот контент, который вы ожидаете получить.