git rebase: "ошибка: невозможно определить файл": разрешение запрещено "

Я использую git и сделал небольшой коммит, а затем большой. Я решил использовать git rebase раздавить два коммитов вместе, прежде чем толкать их. (Я никогда не делал этого раньше.)

Так я и сделал:

git rebase -i HEAD~2

Это дало мне мой редактор, где я выбрал более ранний коммит и раздавил более поздний. Когда я спас, Git сказал:

ошибка: невозможно указать 'имя файла': в доступе отказано

Не удалось применить sha1 для последующего коммита... начальная строка текста для этого коммита

Сейчас:

  • Ни один коммит не появляется, когда я делаю git log,
  • git status говорит мне, что я "В настоящее время нет ни на одной ветке."
  • Один файл указан как измененный и в индексе, а два файла перечислены как неотслеживаемые. Мой первый коммит имел только один файл (я думаю), а мой второй коммит имел добрую дюжину.

Что случилось!? Как мне это исправить?

36 ответов

Решение

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

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

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

git rebase --abort

Вы можете попытаться использовать git apply и знание того, что на самом деле пытается сделать мерзавец, прежде чем делать git rebase --continue но, честно говоря, я бы не рекомендовал это. В большинстве случаев, когда я видел эту попытку, была большая вероятность того, что что-то случайно будет пропущено или испорчено.

Попробуйте закрыть все программы с открытой папкой, такие как редакторы, окна обозревателя, командные строки и программы FTP. Это всегда решает проблему для меня в Windows.

Просто закройте свою IDE (VISUAL STUDIO/ATOM и т. Д.). Это может сработать

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

Я могу сказать, что IIS является частью проблемы. Если я переключаюсь между двумя основными ветвями, которые требуют изменения большого количества файлов, git удалит файл или каталог (обычно DLL), пока IIS пытается что-то сделать с ним. На этом этапе процесс IIS автоматически перезаписывает файл на диске версией, которая заблокирована и, похоже, никем не принадлежит.

Остановка IIS на этом этапе не делает этого. Лучшее, что я обнаружил, это перезагрузка и не забудьте остановить IIS, прежде чем переключаться между основными ветками в будущем.

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

Если вы используете vscode, убейте терминал и откройте новый. иначе, возможно, тоже закройте терминал

В Windows это может быть процесс TortoiseGIT, который блокирует эти файлы. Откройте диспетчер задач и завершите процесс TGitCache.exe.

Я только что наткнулся на эту ветку ответов - эта ошибка является фиктивной ошибкой.# Ошибка: невозможно указать 'reddit/app/views/links': разрешение отклонено

Это все, что я получил - при попытке слиться. Я прочитал несколько ответов, а затем пришел к выводу - все, что мне нужно было сделать, - это закрыть редактор кода, который называется Atom.

После закрытия редактора - я снова запустил git merge и boom, все заработало.

Что за бессмысленная ошибка:(

Если IDE, которую вы используете (в случае, если вы ее используете), возможно, тоже мешает. Вот что случилось со мной при использовании QtCreator.

Это случается со мной в Windows иногда

ошибка: невозможно указать 'имя файла': в доступе отказано

Чаще всего у меня открыто несколько экземпляров bit bash, и один из экземпляров git bash находится в каталоге, который не существует в удаленной ветви, из которой я извлекаю.

Закрытие всех экземпляров git bash, кроме одного, решает проблему для меня.

Если вы используете webpack, выключите его. Выключите свою IDE также. Должно работать нормально после этих вещей.

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

Используя SourceTree в Win 10, исправили проблему, закрыв редактор Atom.

Ошибка воспроизведения:

  1. В ветви B создайте md-файл, используя Atom, отредактируйте его, сохраните и подтвердите.
  2. Переключитесь на ветку A, откройте новые коммиты с сервера.
  3. Попробуй Switch back, Opps, там написано: "ошибка: невозможно указать" файл ": разрешение запрещено".

Произошло со мной в Windows во время перебазирования внутри встроенного терминала IntelliJ. Я заметил, что у меня есть экземпляр клиента Git bash, работающий параллельно.

Закрытие Git Bash решило проблему.

Это часто случается, когда у вас есть программа / приложения для предварительной обработки, наблюдающие за проектом, такие как Prepros или Codekit. Кроме того, Atom и Sublime (и даже Notepad++) могут вызвать это, если файл в проекте в данный момент редактируется.

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

Попытка закрыть IDE, такую ​​как Sublime, VS Code, Webstorm,... и закрыть свои программы с открытой папкой, такие как CMD, Powershell, CMDer, Terminal,... устранит проблему.

У меня только что было это под Win 7.

$ git stash pop error: невозможно указать "parentFolder/subfolder": ошибка в разрешении: невозможно определить "parentFolder/subfolder": разрешение отклонено

Диагноз:

1> Я пошел в подпапку, и она там, и я не мог удалить ее!

2> Используйте "Process Explorer" -> Find -> Find handles and Dlls -> поместите туда имя "subfolder" и выполните поиск.

Результат: Оказывается, XMLSpy открыл там один из XML, закройте XML Spy и снова попробуйте stash pop, теперь он работает.

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

Альтернативное решение, а не закрытие всех приложений, которые могут блокировать каталог, как это делает любой другой ответ, состоит в том, чтобы использовать утилиту, которая разблокирует файлы / каталог, не закрывая все. (Я ненавижу необходимость перезапустить Visual Studio)

LockHunter - это то, что я использую: https://lockhunter.com/ Возможно, есть и другие, но этот отлично сработал для меня.

У меня только что была эта проблема. Дело в том, что если вы открыли файл, который был удален \ заменен после rebase (у вас была ветка, у которой больше нет этого файла), git-система повреждается. Поэтому я закрыл все открытые файлы, а затем попытался оформить заказ в другой ветке

Я согласен с приведенными выше ответами "Закрыть Visual Studio".

Однако дополнительным шагом, который я должен был сделать даже после закрытия Visual Studio, было ручное завершение процесса Visual Studio devenv.exe в обозревателе задач. После того, как я это сделал, я снова смог запустить gitbash:

мерзавец

и ошибка "невозможно указать имя файла " исчезла. Возможно, это связано с расширением Visual Studio, позволяющим дольше сохранять процесс открытым даже после закрытия.

Моя встреча с этой проблемой была вызвана моим редактором Intellij. Как часть внутреннего контроля версий, он прошел и заблокировал все скрытые файлы git. (По разным причинам я не использовал плагин git, который поставляется с Intellij...)

Поэтому я открыл обычное окно с правами администратора, перешел в каталог и выполнил

attrib -R /S

Это сняло блокировку файлов, и после этого все работало, и я мог синхронизировать свои изменения с помощью клиента Windows GitHub.

Эта ошибка также может быть вызвана тем, что файлы все еще "заблокированы" из-за предыдущих действий git. Это связано с тем, как работает слой файловой системы Windows. Однажды я прочитал хорошее объяснение этого, но я не могу вспомнить, где.

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

#!/bin/sh

set -e

git checkout .
git clean -df
git rebase --continue

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

Если у вас открыт инструмент слияния Meld, закройте его. Он блокирует перезапись файла.

Уничтожение процесса w3wp.exe, связанного с хранилищем, исправило это для меня.

Та же проблема в Windows 10 64-битной версии Git Bash 2.9.0.windows1 с использованием Atom в качестве редактора.

Это сработало для меня: я добавил папку программного обеспечения Git (для меня это была C:\Program Files\Git) в исключения для Защитника Windows.

После того, как исключение было добавлено, git checkout 'file' работал нормально.

В моем случае у меня был запущен сервер разработки веб-пакетов.

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

В моем случае просто обновите клиент git до последней версии и решите проблему.

https://git-scm.com/downloads

В моем случае файл представляет собой скрипт оболочки (*.sh файл) предназначен для развертывания нашего проекта на локальном сервере разработки, для моих разработчиков.

Скрипт оболочки должен работать согласованно и может быть обновлен; поэтому я отслеживал его в том же проекте Git, что и код, который сценарий предназначен для развертывания.

Сценарий оболочки запускает один исполняемый файл, а затем позволяет запускать этот исполняемый файл; поэтому скрипт все еще работает; поэтому моя оболочка все еще имеет открытый скрипт; так что заперто

я Ctrl+Cубил скрипт (теперь мой локальный сервер больше не доступен), теперь я могу свободно оформить заказ.

Та же проблема, но с использованием SourceTree (или любого другого клиента git). Я добавляю свой ответ, так как ни один из ответов не соответствует моему делу.

Изменение ветки с "разработка" на "основной" изменяет фактические файлы и подпапки вашей локальной папки. Может случиться, что папка, которая не существует в "master", не будет полностью стерта, и Windows считает, что вы потеряли только свои права доступа (даже если вы администратор). При слиянии с main на development клиент git пытается получить доступ к папке. Без прав доступа возвращает указанную ошибку.

  • Переключение с одной ветви на последнюю может решить проблему, а затем вернуться к основному (дважды проверьте, действительно ли папки / файлы удалены локально).
  • Закрытие клиента и / или вашего редактора не решает проблему!
  • Перезагрузка помогает, но это пустая трата времени (ИМХО)
Другие вопросы по тегам