GIT: удаленное хранилище, разница между жесткой ссылкой и файлом://
В настоящее время я читаю книгу Джона Лелигера " Контроль версий с помощью Git".
Это говорит о 2 тонких различиях между жесткими ссылками и file://
:
Как вы видели, самая простая форма Git URL относится к хранилищу в локальной файловой системе, будь то настоящая физическая файловая система или виртуальная файловая система, монтируемая локально через сетевую файловую систему (NFS). Есть две перестановки:
/path/to/repo.git
file:///path/to/repo.git
Хотя эти два формата по существу идентичны, между ними есть тонкое, но важное различие. Первый использует жесткие ссылки в файловой системе для непосредственного совместного использования одинаковых объектов между текущим и удаленным хранилищем; последний копирует объекты вместо того, чтобы делиться ими напрямую. Чтобы избежать проблем, связанных с общими репозиториями,
file://
Форма рекомендуется.
Сначала я думал, что мой клонированный репо ./git/object
папка была ссылкой на пульт .git/object
но я думаю это не так.
Может кто-нибудь объяснить это?
1 ответ
git clone
в обоих случаях создается новая копия (идентичный клон) целевого хранилища, причем старая добавляется как удаленная. Это два отдельных репо.
Разница заключается в том, что если вы используете синтаксис
git clone /path/to/repo.git
git попытается сэкономить место, используя жесткие ссылки в файловой системе для файлов, которые 1. идентичны обоим репозиториям и 2. не ожидают изменений. Единственные файлы, которые, как ожидается, будут идентичными и не изменятся (за исключением случаев переупаковки объектов), это файлы в.git / objects во время создания клона.
Это экономит место, поскольку жесткие ссылки означают, что вы обращаетесь к содержимому файла несколько раз в разных местах, но сохраняете фактическое содержимое только один раз. (Сам Git фактически использует аналогичный механизм в своей объектной базе данных, он не будет хранить содержимое уникального файла более одного раза.)
Если вы хотите заставить git создать новую копию файлов в.git / objects, используя синтаксис
git clone file:///path/to/repo.git
достигнет этого.