Назад | Перейти на главную страницу

Git fatal: невозможно записать файл new_index

Мы компания по веб-разработке, которая переходит на Git.

В конечном итоге мы намерены запустить его полностью локально, но в настоящее время у нас есть веб-сайты разработки, размещенные на сервере Linux, где также находятся репозитории Git (которые я создаю через Tower на моем собственном компьютере).

Наши разработчики подключаются к этому серверу через AFP (Mac) или Samba (Windows / Linux) и используют комбинацию Tower и Sourcetree для регистрации этих изменений.

Наша папка веб-разработки на этом сервере является общей и разрешенной, поэтому все операции чтения / записи выполняются от имени пользователя www-data. Ни в коем случае не идеальный вариант и не то, чем я бы занимался в производстве, но это работает для нас. В основном....

Время от времени при попытке обработать измененные файлы или зафиксировать их появляется это сообщение об ошибке:

fatal: unable to write new_index file

Иногда это просто «индекс» без префикса «new_».

Я обнаружил, что подключение по SSH к серверу в качестве пользователя www-data, переход к папке .git в проекте, а затем переименование индекса во что-то другое и обратно часто решает эту проблему. Разрешения (660) верны для файла до и после этого, но трюк с переименованием, похоже, работает.

Помимо очевидной долгосрочной цели по запуску Git / веб-сайтов на собственных машинах разработчика, есть ли решение для этого - или просто не рекомендуется удаленное управление репозиторием Git?

Похоже, вы действительно разделяете то же самое работает репо для нескольких пользователей, что в целом не очень хорошая идея:

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

Я бы предложил создать групповой голый репозиторий git (специально разработан для обмен) на том же самом разделе, доступном для машин разработчиков так же, как и в текущем репо (там много информации, вы можете начать с https://stackoverflow.com/questions/7632454/how-do-you-use-git-bare-init-repository):

  • разработчики git clone/git pull из этого голого репо в свои местные работает репо, где они делают git commit их изменения, а затем git push их обратно в общее репо
  • другое репо будет извлечено www-данными из чистого репо на сервере Linux для обслуживания веб-сайтов разработки; а git pull в этом случае можно будет «обновить» контент со всеми коммитами, вставленными в голое репо с момента последнего git pull (после этого может потребоваться перезапуск httpd)