У меня есть каталог с символическими ссылками в моем репозитории, который ссылается на файлы в другом месте файловой системы. По какой-то причине символическая ссылка время от времени прерывается и превращается в обычную пустую папку. Поэтому я удалил пустую папку и воссоздал символическую ссылку с ln -s ../../ ext
, которая, похоже, сработала, поскольку я могу просматривать эту папку и видеть ее содержимое. Но когда я запускаю git status
, кажется, что все файлы, которые должны быть видны в папке ext
, отсутствуют. Как я могу заставить git увидеть, что они снова там, в каталоге с символической ссылкой?
Кстати, это на Ubuntu 18.
Ваша установка странная, потому что Git не следует по символическим ссылкам, он просто сохраняет их.
То есть, если у вас есть символическая ссылка
ext -> ../..
и вы запускаетеgit add ext
, Git создает в индексе запись с режимом120000
(символическая ссылка) для хранения содержимого большого двоичного объекта../..
. Фиксация создаст фиксацию, которая при извлечении создаст символическую ссылкуext
, указывающую на../..
. Git не сохраняет файлы внутриext
при сохранении этой символической ссылки.Если, с другой стороны, у вас есть существующая фиксация, содержащая файлы с именами
ext/foo
иext/bar
, и вы клонируете этот репозиторий в этой фиксации или извлекаете эту фиксацию в новое или в противном случае пустое рабочее дерево, Git увидит это, чтобы запись в файлы с именамиext/foo
иext/bar
, ваша ОС требует, чтобыext
существовал как каталог. Поэтому он создаст пустой каталогext
, в котором затем будет создавать файлыfoo
иbar
в соответствии с требованиями вашей ОС, чтобы создавать файлы, которые в Git называются простоext/foo
иext/bar
. Эти два имени,ext/foo
иext/bar
, теперь будут в индексе, так что следующая сделанная вами фиксация также будет содержать эти два файла.Похоже на тебя:
git clone --no-checkout
?);ext
, указывающую на существующий каталог (возможно, с некоторыми файлами внутри);git checkout
создатьext/foo
иext/bar
без предварительного удаления символической ссылкиext
и замены ее каталогомext
.Это не поддерживаемый режим работы 1, и вы не должны удивляться, если он пойдет не так.
1 Это приводит к проблемам с безопасностью: Git не предназначен для записи каких-либо файлов «вне» области рабочего дерева, и запись в файлы «под» символической ссылкой на каталог вне рабочего дерева будет позвольте этому произойти. Вместо того, чтобы тщательно ограничивать использование символических ссылок, Git просто обычно не хранит файлы «вне» какой-либо ссылки в первую очередь — хотя, вероятно, это возможно благодаря осторожным манипуляциям с индексом и, на уровне ОС, файловой системой, в которой вы рабочее дерево находится, чтобы обмануть Git вручную.