Вы можете узнать, что 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
конфигурации.
В любом случае данные, на которые ссылается символическая ссылка, не сохраняются в хранилище.
.gitignore
видит символическую ссылку как файл, а не папку.