Как Git обрабатывает символические ссылки? - PullRequest
1460 голосов
/ 05 июня 2009

Если у меня есть файл или каталог, который является символической ссылкой, и я фиксирую его в репозитории Git, что с ним происходит?

Я бы предположил, что он оставляет его в виде символической ссылки до тех пор, пока файл не будет удален, а затем, если вы извлекаете файл из старой версии, он просто создает обычный файл.

Что он делает, когда я удаляю файл, на который он ссылается? Это просто фиксирует висячую ссылку?

Ответы [ 3 ]

1218 голосов
/ 05 июня 2009

Git просто хранит содержимое ссылки (то есть путь к объекту файловой системы, на которую он ссылается) в «BLOB-объекте», как это делается для обычного файла. Затем он сохраняет имя, режим и тип (включая тот факт, что это символическая ссылка) в объекте дерева, который представляет его содержащий каталог.

Когда вы извлекаете дерево, содержащее ссылку, он восстанавливает объект как символическую ссылку независимо от того, существует целевой объект файловой системы или нет.

Если вы удалите файл, на который ссылается символическая ссылка, это никак не повлияет на управляемую Git символическую ссылку. У вас будет свисающая ссылка. Пользователь может удалить или изменить ссылку, чтобы указать на что-то действительное, если это необходимо.

207 голосов
/ 13 сентября 2013

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.

В любом случае данные, на которые ссылается символическая ссылка, не сохраняются в хранилище.

145 голосов
/ 02 октября 2009

Примечание «Редактора»: Это сообщение может содержать устаревшую информацию. Пожалуйста, смотрите комментарии и этот вопрос относительно изменений в Git с 1.6.1.

Символьные каталоги:

Важно отметить, что происходит, когда существует каталог, который является мягкой ссылкой. Любое Git pull с обновлением удаляет ссылку и делает ее нормальной директорией. Это то, чему я научился трудным путем. Некоторые идеи здесь и здесь.

Пример * * тысяча двадцать-один

До

 ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir

git add/commit/push

It remains the same

После git pull И найдено несколько обновлений

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir
...