Git переименовать из index.lock в индекс не удалось

Используя клиент GitHub Windows, я выполнил синхронизацию, чтобы удалить удаленные изменения на моем локальном компьютере, но до завершения синхронизации у меня закончилось свободное место на диске, и синхронизация завершилась неудачно. Теперь у меня, похоже, есть куча локальных изменений, которые на самом деле являются изменениями, которые вытаскивались из источника. Я попытался запустить git pull, но получил:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git pull
Updating b3a86e1..5afd74f
error: Your local changes to the following files would be overwritten by merge:
        SourceLog.Interface/IChangedFile.cs
        SourceLog.Interface/ILogEntry.cs
        ...
Please, commit your changes or stash them before you can merge.
error: The following untracked working tree files would be overwritten by merge:
        Lib/MSBuildExtensionPack/4.0.6.0/Ionic.Zip.dll
        Lib/MSBuildExtensionPack/4.0.6.0/MSBuild.ExtensionPack.dll
        ...
Aborting

Итак, теперь я пытаюсь отменить локальные изменения, но получаю:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git checkout -- .
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n
fatal: unable to write new index file

Как я могу это очистить? (Перед началом синхронизации у меня не было локальных изменений.)

Update

Не может выглядеть как reset head..

C:\Users\Tom\SourceLog [master +4 ~0 -0 !]> git reset head
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n
error: Could not write new index file.
fatal: Could not reset index file to revision 'head'.

Ответ 1

Похоже, что следующий процесс заблокировал файл .git\index:

ssh-agent.exe
C:\Users\Tom\AppData\Local\GitHub\PortableGit_8810fd5c2c79c73adcc73fd0825f3b32fdb816e7\bin\ssh-agent.exe

Я убил процесс и запустил git reset HEAD и теперь выглядит как нормальный.

Ответ 2

В моем случае это было вызвано использованием одного и того же репозитория Git из командной строки как администратора, так и не администратора. Когда последний git pull был от admin cmd, index создавался им, а затем у non-admin cmd было недостаточно прав для его изменения.

Моим решением было воссоздание index (при сохранении рабочего дерева без изменений):

del .git\index
git reset --mixed head

Ответ 3

Я видел это Rename from '.git/index.lock'... при попытке выполнить

git checkout -b my-branch

Исправить для меня было запустить командную строку в качестве admin.

В частности, я использовал превосходное приложение cmder как non-admin, в результате чего появилось сообщение о переименовании. Путем запуска cmder в качестве администратора, а затем повторного выполнения проверки, он работал нормально.

Ответ 4

Git 2.10 (Q3 2016, 4 года спустя) должен улучшить ситуацию в Windows

См. commit 05d1ed6 (23 августа 2016 г.) Ben Wijen (Ben).

mingw: гарантировать, что временные файлы не наследуются дочерними процессами

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

Симптом:

Rename from 'xxx/.git/index.lock' to 'xxx/.git/index' failed.
Should I try again? (y/n)

Инициирование дочерних процессов с помощью bInheritHandles==FALSE не будет работать потому что никакие дескрипторы файлов не будут унаследованы, даже hStdXxx обрабатывает в STARTUPINFO (stdin/stdout/stderr).

Открытие каждого файла с помощью O_NOINHERIT тоже не работает, например. git-upload-pack ожидает унаследованных дескрипторов файлов.

Это оставляет нам единственный выход: создание временных файлов с флагом O_NOINHERIT. Однако этот флаг является специфичным для Windows.
Для наших целей он эквивалентен O_CLOEXEC (который не существует на Windows), поэтому позволяет просто открывать временные файлы с флагом O_CLOEXEC и сопоставить этот флаг с O_NOINHERIT в Windows.

Ответ 5

Чтобы отменить локальные изменения, перейдите

git reset HEAD

Затем выполните проверку старой фиксации, удалите новую и снова нажмите.

git checkout "hashOld"
git branch -d "hashNew"
git pull

Ответ 6

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

Rename from '.git/..' to '.git/..' failed. Should I try again? (y/n) y

уходит. После того, как я клонировал репозиторий, я снова попробовал свою команду (что в моем случае было GIT COMMIT), и сбой не повторился.

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

Ответ 7

Либо убейте процесс, который блокирует файл, либо новый репо, откройте папку .git rm -rf .git и начните снова с git init

Ответ 8

Я удалил index и index.lock (в папке .git) и запустил git checkout ., чтобы отменить изменения и разрешить, но если бы я хотел зафиксировать изменения, я бы выполнил git add -A после git commit -m "description"

Ответ 9

Я получил эту ошибку несколько раз подряд при запуске git reset HEAD в проекте, хранящемся в папке Google Диска, но через несколько минут проблема исчезла.

Ответ 10

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

Ответ 11

Я использую Черепаху Git. Я только что открыл новый проводник Windows, и он исправил это. (Для командной строки Git, возможно, просто откройте новую оболочку).

Ответ 12

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

Ответ 13

Причина, когда работает антивирус или защитник ОС (например, Защитник Windows). Решение: отключите антивирус на несколько минут, добавьте, подтвердите и отправьте. Tunr на антивирусе.
Это будет работать.