Вы можете узнать, что 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 add ./symlink
Итак, что было добавлено?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Хеш - это ссылка на упакованный объект, созданный в хранилище объектов. Вы можете изучить этот объект, если посмотрите .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
в корне вашего репозитория. Это файл, который Git хранит в репозитории, который вы можете позже получить. Если вы изучите этот файл, вы увидите, что он очень маленький. Он не сохраняет содержимое связанного файла. Чтобы убедиться в этом, распечатайте содержимое упакованного объекта репозитория с помощью git cat-file
:
$ git cat-file -p 1596f9db1b9610f238b78dd168ae33faa2dec15c
/path/referenced/by/symlink
(Примечание 120000
- это режим, указанный в ls-files
выводе. Это будет что-то вроде 100644
для обычного файла.)
Но что Git делает с этим объектом, когда вы извлекаете его из репозитория в свою файловую систему? Это зависит от конфигурации core.symlinks
. Из man git-config
:
core.symlinks
Если false, символические ссылки извлекаются как небольшие простые файлы, содержащие текст ссылки.
Итак, с символической ссылкой в репозитории при оформлении заказа вы получаете либо текстовый файл со ссылкой на полный путь к файловой системе, либо правильную символическую ссылку, в зависимости от значения core.symlinks
config.
В любом случае содержимое пути, на который указывает символическая ссылка, не сохраняется в репозитории (если, конечно, указанный путь также находится в репозитории).
person
Dmitry Minkovsky
schedule
13.09.2013
.gitignore
видит символическую ссылку как файл, а не как папку. - person 0xcaff   schedule 03.02.2014../..
по мере необходимости. - person Wildcard   schedule 23.01.2016git add -f filename
добавить в git - person HoKy22   schedule 02.04.2017git pull
создает файл вместо символической ссылки, попробуйте запустить клиент Git от имени администратора. - person axmrnv   schedule 30.05.2017