Вопрос: Как git обрабатывает символические ссылки?


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

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

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


1292


источник


Ответы:


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

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

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


1076



TL; DR: данные, на которые ссылается символическая ссылка, не хранятся в репозитории.


Вы можете узнать, что делает Git с файлом, видя, что он делает, добавляя его в индекс. Индекс подобен предварительной фиксации. С зафиксированным индексом вы можете использовать git checkoutчтобы вернуть все, что было в индексе, в рабочий каталог. Итак, что делает Git, когда вы добавляете символическую ссылку на индекс?

Чтобы узнать, во-первых, сделать символическую ссылку:

$ ln -s /Path/referenced/by/symlink symlink

Git еще не знает об этом файле. git ls-filesпозволяет вам проверять ваш индекс ( -sпечать stat-образный выход):

$ git ls-files -s ./symlink
$

Теперь добавьте содержимое символической ссылки в хранилище объектов Git, добавив его в индекс. Когда вы добавляете файл в индекс, Git сохраняет его содержимое в хранилище объектов Git.

$ git add ./symlink

Итак, что было добавлено?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink
$

Хэш - это ссылка на упакованный объект, который был создан в хранилище объектов Git. Вы можете изучить этот объект, если вы посмотрите .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c,

120000это файловый режим. Это было бы что-то вроде 100644для обычного файла и является специальным режимом для ссылок. Из man git-config:

core.symlinks

Если false, символические ссылки проверяются как маленькие простые файлы, содержащие текст ссылки. git-update-index (1) и git-add (1) не изменят записанный тип на обычный файл.

использование git cat-file -pдля красивой печати содержимого:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Итак, вот что Git делает для символической ссылки: когда вы git checkoutсимволическая ссылка, вы либо получаете текстовый файл со ссылкой на полный путь к файловой системе, либо символическую ссылку, в зависимости от конфигурации. Данные, на которые ссылается символическая ссылка, не хранятся в репозитории.


144



Обозначенные каталоги:

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

138