Если у меня есть файл или каталог, который является символической ссылкой, и я фиксирую его в репозитории Git, что с ним происходит?
Я бы предположил, что он оставляет его как символическую ссылку, пока файл не будет удален, а затем, если вы извлекаете файл из старой версии, он просто создает обычный файл.
Что он делает, когда я удаляю файл, на который он ссылается? Это просто фиксирует висячую ссылку?
.gitignore
видит символическую ссылку как файл, а не папку.../..
при необходимости.git pull
вместо символической ссылки создаете файл, попробуйте запустить ваш клиент Git от имени администратора.Ответы:
Git просто хранит содержимое ссылки (т. Е. Путь к объекту файловой системы, на которую он ссылается) в «blob», как это делается для обычного файла. Затем он сохраняет имя, режим и тип (включая тот факт, что это символическая ссылка) в объекте дерева, который представляет его содержащий каталог.
Когда вы извлекаете дерево, содержащее ссылку, оно восстанавливает объект как символическую ссылку независимо от того, существует целевой объект файловой системы или нет.
Если вы удалите файл, на который ссылается символическая ссылка, он никак не повлияет на управляемую Git символическую ссылку. У вас будет свисающая ссылка. Пользователь может удалить или изменить ссылку, чтобы указать на что-то действительное, если это необходимо.
источник
core.symlinks
для переменной конфигурации значение false, и символические ссылки будут извлечены в виде небольших текстовых файлов, содержащих текст ссылки.symlinks = false
возиться с ними.Вы можете узнать, что Git делает с файлом, увидев, что он делает, когда вы добавляете его в индекс. Индекс похож на предварительную фиксацию. С указанным индексом вы можете использовать
git checkout
чтобы вернуть все, что было в индексе, обратно в рабочий каталог. Итак, что делает Git, когда вы добавляете в индекс символическую ссылку?Чтобы узнать, сначала сделайте символическую ссылку:
Git еще не знает об этом файле.
git ls-files
Позволяет вам проверить ваш индекс (-s
печатаетstat
как вывод):Теперь добавьте содержимое символической ссылки в хранилище объектов Git, добавив его в индекс. Когда вы добавляете файл в индекс, Git сохраняет его содержимое в хранилище объектов Git.
Итак, что было добавлено?
Хеш - это ссылка на упакованный объект, который был создан в хранилище объектов Git. Вы можете проверить этот объект, если загляните в
.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
корень своего хранилища. Это файл, который Git хранит в репозитории, который вы можете позже проверить. Если вы посмотрите на этот файл, вы увидите, что он очень маленький. Он не хранит содержимое связанного файла.(Примечание
120000
- это режим, указанный вls-files
выводе. Это будет что-то вроде100644
обычного файла.)Но что Git делает с этим объектом, когда вы извлекаете его из хранилища и в свою файловую систему? Это зависит от
core.symlinks
конфига. Отman git-config
:Таким образом, имея символическую ссылку в хранилище, при извлечении вы получаете либо текстовый файл со ссылкой на полный путь к файловой системе, либо правильную символическую ссылку, в зависимости от значения
core.symlinks
конфигурации.В любом случае данные, на которые ссылается символическая ссылка, не сохраняются в хранилище.
источник
Символьные каталоги:
Важно отметить, что происходит, когда существует каталог, который является мягкой ссылкой. Любое Git pull с обновлением удаляет ссылку и делает ее нормальной директорией. Это то, чему я научился трудным путем. Некоторые идеи здесь и здесь.
пример
Перед
git add/commit/push
После
git pull
И некоторые обновления найденыисточник