TL; DR: данные, на которые ссылается символическая ссылка, не сохраняются в хранилище.
Вы можете узнать, что Git делает с файлом, посмотрев, что он делает, когда добавляете его в индекс. Индекс похож на предварительную фиксацию. После фиксации индекса вы можете использовать git checkout
, чтобы вернуть все, что было в индексе, обратно в рабочий каталог. Итак, что делает Git, когда вы добавляете символическую ссылку в индекс?
Чтобы узнать, сначала сделайте символическую ссылку:
$ ln -s /path/referenced/by/symlink symlink
Git еще не знает об этом файле. git ls-files
позволяет проверить ваш индекс (-s
печатает stat
-подобный вывод):
$ git ls-files -s ./symlink
[nothing]
Теперь добавьте содержимое символической ссылки в хранилище объектов Git, добавив его в индекс. Когда вы добавляете файл в индекс, Git сохраняет его содержимое в хранилище объектов Git.
$ git add ./symlink
Итак, что было добавлено?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Хеш - это ссылка на упакованный объект, который был создан в хранилище объектов Git. Вы можете проверить этот объект, если посмотрите в .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
в корне вашего хранилища. Это файл, который Git хранит в репозитории, который вы можете позже проверить. Если вы изучите этот файл, вы увидите, что он очень маленький. Он не хранит содержимое связанного файла.
(Примечание 120000
- режим, указанный в выводе ls-files
. Для обычного файла это будет что-то вроде 100644
.)
Но что Git делает с этим объектом, когда вы извлекаете его из хранилища и в свою файловую систему? Это зависит от конфигурации core.symlinks
. От man git-config
:
core.symlinks
Если false, символические ссылки извлекаются как небольшие простые файлы, содержащие текст ссылки.
Таким образом, при наличии символической ссылки в хранилище при извлечении вы получаете либо текстовый файл со ссылкой на полный путь к файловой системе, либо правильную символическую ссылку в зависимости от значения конфигурации core.symlinks
.
В любом случае данные, на которые ссылается символическая ссылка, не сохраняются в хранилище.