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

У меня есть каталог с символическими ссылками в моем репозитории, который ссылается на файлы в другом месте файловой системы. По какой-то причине символическая ссылка время от времени прерывается и превращается в обычную пустую папку. Поэтому я удалил пустую папку и воссоздал символическую ссылку с ln -s ../../ ext, которая, похоже, сработала, поскольку я могу просматривать эту папку и видеть ее содержимое. Но когда я запускаю git status, кажется, что все файлы, которые должны быть видны в папке ext, отсутствуют. Как я могу заставить git увидеть, что они снова там, в каталоге с символической ссылкой?

Кстати, это на Ubuntu 18.

См. также:  Git Pull без изменения моих локальных файлов
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. stackers

    Ваша установка странная, потому что 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, теперь будут в индексе, так что следующая сделанная вами фиксация также будет содержать эти два файла.

    Похоже на тебя:

    1. клонировал репозиторий (возможно, с git clone --no-checkout?);
    2. вручную создал символическую ссылку в дереве работы с именем ext, указывающую на существующий каталог (возможно, с некоторыми файлами внутри);
    3. убедил git checkout создать ext/foo и ext/bar без предварительного удаления символической ссылки ext и замены ее каталогом ext.

    Это не поддерживаемый режим работы 1, и вы не должны удивляться, если он пойдет не так.


    1 Это приводит к проблемам с безопасностью: Git не предназначен для записи каких-либо файлов «вне» области рабочего дерева, и запись в файлы «под» символической ссылкой на каталог вне рабочего дерева будет позвольте этому произойти. Вместо того, чтобы тщательно ограничивать использование символических ссылок, Git просто обычно не хранит файлы «вне» какой-либо ссылки в первую очередь — хотя, вероятно, это возможно благодаря осторожным манипуляциям с индексом и, на уровне ОС, файловой системой, в которой вы рабочее дерево находится, чтобы обмануть Git вручную.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: