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

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

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

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

1168
задан Alex 05 июня '09 в 9:53
источник поделиться

3 ответов

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

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

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

976
ответ дан Charles Bailey 05 июня '09 в 10:01
источник поделиться

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

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

Пример

Перед

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

git добавить/зафиксировать/нажать

It remains the same

После git pull И обнаружены некоторые обновления

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir
133
ответ дан Shekhar 02 окт. '09 в 9:16
источник поделиться

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

120
ответ дан Dmitry Minkovsky 13 сент. '13 в 20:06
источник поделиться

Другие вопросы по меткам