Git: невозможно создать символическую ссылку (слишком длинное имя файла)
я подтолкнул проект от linux к bitbucked, а затем клонировал его на windows. Оказывается, было две символические ссылки, которые появились в виде текстовых файлов в windows. Поскольку я знал, куда они должны указывать, Я заменил их копиями файлов назначения, зафиксировал и толкнул.
теперь репозиторий butbucket выглядит нормально, когда я смотрю его из своего веб-интерфейса. Однако клон git на моей машине unix дает мне два сообщения, такие как:
error: unable to create symlink ... (File name too long)
и два файла, которые ранее были символическими ссылками, отсутствуют. Я попытался клонировать в /tmp/... чтобы получить более короткие имена файлов, но получили те же результаты. Это говорит о том, что что-то пошло не так с хранилищем bitbucket. Я пытался!--1--> ВКЛ и выкл.
Я могу жить без символических ссылок, но я хотел бы иметь рабочий репозиторий. Кто-нибудь знает способ (кроме воссоздания репозитория)?
4 ответов
как только вы изменили содержимое фейк-ссылка-файл без изменения его режима от симлинк на регулярные файл и передал результат, вы сделали большой двоичный объект может быть извлечен на ОС с реальными симлинки, потому что у вас есть объект, который должен быть ссылкой, но его содержание слишком долго, чтобы быть путь. Веб-интерфейс не делает вам никаких одолжений, скрывая эту проблему.
вам, вероятно, придется вернуться к этой фиксации, исправить ее и повторно зафиксировать все после него. git rebase -i
поможет, но это все равно может быть непросто, особенно если вы внесли больше изменений в файлы, пока они находились в этом фиктивном состоянии символической ссылки, но не совсем символической.
предположим, что плохая фиксация abcdef123
, вам нужно сделать это:
git rebase -i 'abcdef123^'
который поместит вас в Редактор со списком коммитов. abcdef123
должно быть на первой строке. На этой линии измените pick
to edit
. Если есть несколько плохих фиксаций, измените все их edit
. Сохраните и закройте редактор.
теперь ты вернешься в тот момент времени, когда вы совершили плохой файл. Это твой шанс изменить историю, исправить то, что когда-то пошло не так. Проверьте фиксацию с помощью
git show
и отменить плохую часть, восстановив исходный путь символической ссылки в файл и git add
ing это. Или вы действительно можете избавиться от символической ссылки с помощью git rm
, затем создайте новый файл и git add
что. Если вы выбираете во-первых, имейте в виду, что содержимое символической ссылки-это просто путь. Это не текстовый файл - у него нет новой строки на конце. Если вы редактируете его с помощью текстового редактора, который добавляет новую строку, у вас будет сломанная символическая ссылка (указывающая на файл с новой строкой в его имени).
после того как вы сделали свой git add
, вставьте фиксированную фиксацию на свое место в истории:
git commit --amend
git rebase --continue
если вы изменили несколько коммитов от pick
to edit
вам придется повторить эту процедуру для каждого. Финал git rebase --continue
вернет вас в настоящее.
если вы находитесь в прошлом фиксации во время ребазы, и вы обнаружите, что вся фиксация плохая (она ничего не сделала, кроме замены символической ссылки на немодифицированное содержимое файла, на который она указывает), то вы можете git rebase --skip
вместо внесения поправок и продолжается. Если вы заранее знаете, что это произойдет, вы можете просто удалить плохую фиксацию из git rebase -i
список вместо изменения своего pick
в edit
.
если у вас есть несколько ветвей, затронутых плохой фиксацией, вам придется повторить всю процедуру для каждой ветви. Проверьте ветку, запустите git rebase -i
до завершения (когда git rebase --continue
говорит "успешно перезагружен"), затем проверьте следующую ветку и сделайте это снова.
в будущем, при разделении вашей работы по разработке между Windows и реальной ОС, сделайте свою работу Windows с cygwin. Внутри cygwin символические ссылки являются символическими ссылками, и вы не можете беспорядок они такие же, как ты.
вот решение, которое не требует, чтобы вы вернулись и исправили фиксации. В конце концов, это может быть невозможно, если РЕПО является удаленным или общим. Он использует ядра.symlinks=false. Вы сказали, что пробовали, но не сказали когда. Вы должны сделать это перед выпиской, что по умолчанию делает обычный клон. Поэтому вы должны клонировать с опцией --no-checkout.
git clone --no-checkout the-repo tmp-clone-dir
cd tmp-clone-dir
git config core.symlinks false
git checkout
cp the-problem-file the-problem-file.bak # make a backup
git rm the-problem-file
git commit -m 'Removed problem file pretending to be a symlink' the-problem-file
mv the-problem-file.bak the-problem-file # restore the backup; now it will be of type file
git commit -m 'Added back the problem file - now with the correct type' the-problem-file
git push origin master
cd ..
\rm -rf tmp-clone-dir # IMPORTANT
этот последний шаг важен, потому что вы не хотите делать больше работы в репо с core.symlinks=false. Это просто просьба. беда.
вышеизложенное предполагает, что вы хотите, чтобы файл был файлом, а не символической ссылкой. Если бы это была символическая ссылка, вы бы остановились после первой фиксации, удалите tmp-clone-dir и вернитесь к своей обычной проверке репо, чтобы сделать символическую ссылку и зафиксировать ее.
преимущество этого метода заключается в том, что вы не разбиваете связанные клоны и ветви, поскольку он сохраняет историю. Недостатком этого является то, что сломанная фиксация все еще существует и вызовет проблемы для всех, если они попытайтесь использовать эту конкретную плохую фиксацию.
У меня была эта проблема, это решило ее для меня:
git config core.symlinks false
git rm <problem-file>
git commit <problem-file>
git push
git config core.symlinks true
есть и более простой способ, если вы используете оба. Поскольку теперь bitbucket поддерживает онлайн-удаление файлов, вы можете перейти в свое РЕПО на bitbucket, найти файл, который является проблемным, нажмите кнопку раскрывающегося списка рядом с кнопкой "редактировать" и "удалить".
это удалит файл с сломанной символической ссылкой, и у вас снова будет рабочий каталог. если это возможно, это намного быстрее, чем перебазирование и удаление вручную.