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

достигнет этого.

Другие вопросы по тегам