Git gc/git gui: удалена ссылка на файл <имя файла внутренней упаковки>

Запуск версии 1.9.4.msysgit.0 из git, я получаю упомянутые ошибки почти каждый раз, когда я запускаю git gc в командной строке или через git gui, когда он предлагает мне "сжимать свободные объекты" ":

Counting objects: 1110956, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (269562/269562), done.
Writing objects: 100% (1110956/1110956), done.
Total 1110956 (delta 636114), reused 1110956 (delta 636114)
Unlink of file '.git/objects/pack/pack-207f1feb5376880778637c ... 8371cea62.pack'
    failed. Should I try again? (y/n) n
Checking connectivity: 1110956, done.

Единственное решение, похоже, нажимает n для каждого из заблокированных файлов - как предложено этот поток:

Короткий ответ: нажмите 'n', чтобы пройти через все эти, а затем вручную запустить "git gc".

Поток также предполагает, что...

Проблема в том, что файлы хранятся открытым родительским git.exe того, который пытается выполнить gc.

... который, глядя на дерево процессов, вполне правдоподобен:

git process tree

Мой вопрос: есть ли что-то, что я могу сделать, чтобы это предотвратить? Это становится очень раздражающим, когда приходится делать это несколько раз в день... И почему это происходит? Является ли это ошибкой git/w32-only?


Обновить 1: Чтобы уточнить - после нажатия n несколько раз, как описано, git gc завершается, а локальный репозиторий "чист", т.е. перезапуск git gc не вызывает проблемы с блокировкой файлов - но это только на некоторое время. После некоторого рабочего времени на repo – иногда через несколько минут, иногда по часам - ndash; репозиторий снова "грязный", и описанные проблемы преобладают. Выполнение git gc из git-bash вместо cmd, предложенное jsexpert, не помогает. Он также предположил, что другое программное обеспечение не git может содержать блокировки, о которых идет речь. Я скептически отношусь к этому, не в последнюю очередь из-за комментария в теме, связанной выше – Я думаю, что родительский процесс git содержит блокировки – но я все еще должен подтвердить это требование.

Обновление 2: Оказывается, что jsexpert был прав все время - по крайней мере, в моем случае это была действительно блокировка IDE на эти файлы... Итак, это проблема EGit Team Provider для Eclipse, а не git.

enter image description here

Обновление 3: Чтобы найти заблокированные файлы, вы можете, например, использовать один из этих бесплатных инструментов:

  • Process Explorer (к настоящему времени предлагается Microsoft)
  • Process Hacker (к настоящему времени заменил Process Explorer в моем наборе инструментов)

В обоих случаях используйте CTRL F, чтобы открыть диалог "Найти дескриптор".

Ответы

Ответ 1

Я рекомендую вам использовать git из git-bash (т.е. %GIT_HOME%\bin\bash.exe), а не из cmd. После перехода на git-bash вы не должны ожидать этой проблемы, так как cmd - это команда Windows, которая может блокировать ваши файлы, а git-bash похожа на эмулятор UNIX, который не будет блокировать ваши файлы (даже если он действительно смотрит на ваши папки Windows).