4

У меня есть существующий проект, развернутый на героку и под контролем git. Я регулярно добавляю и фиксирую код.

Я недавно восстановил компьютер, на котором я работаю (OSX, 10.6), и теперь, когда я вызываю

git status

Я вижу свои изменения, но когда я пытаюсь добавить измененные файлы для фиксации, я получаю

Dans-iMac-335:[app-name-obscured] apple$ git add public/javascripts/*
fatal: Unable to write new index file

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

Кто-нибудь испытал это, и есть идеи, с чего начать?


Крис: спасибо за исчерпывающий ответ.

Я могу запустить Git с помощью sudo. В этом смысле кажется, что проблема связана с разрешениями, хотя каталог принадлежит 755 и принадлежит мне, а вложенные файлы 644 снова принадлежат мне (тот же пользователь, которому принадлежат файлы проекта). На диске много места, и предположение о том, что каталог доступен для записи, является хорошим, но я запускал git из каталога, в котором находится проект - нужно ли ему тогда создавать путь?

Я не нахожу в своей системе ktrace, и я не очень разбираюсь в терминальных манипуляциях, но я попытался запустить dtruss. Это не показало никаких проблем, но мне пришло в голову, что из-за того, что мне пришлось использовать sudo для запуска dtruss, это означало, что процесс, за которым следил dtruss, также выполнялся как суперпользователь. В любом случае, в тот момент он мог добавлять элементы в git, а также с помощью sudo я смог зафиксировать их только сейчас. Проблема заключается в добавлении нового элемента, а не измененного. Если бы я сделал что-то вроде

sudo dtruss su <my_username> git add some/file/name/*

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

Я могу жить с использованием sudo для операций, где элементы добавляются и фиксируются на данный момент. Что я хочу сделать, так это сделать репо «Герою» встроенным в текущую работу: тогда я подумаю, что смогу клонировать это и посмотреть, исчезнет ли проблема. В противном случае я вернусь ...

1 ответ1

4

Индекс обычно хранится на верхнем уровне каталога .git хранилища. Его местоположение может быть переопределено с помощью переменной среды GIT_INDEX_FILE (возможно, стоит проверить это: printf '%s\n' "$GIT_INDEX_FILE").

Если каталог индексного файла недоступен для записи, вы получите более раннее сообщение об ошибке:

fatal: Unable to create '/path/to/.git/index.lock': Permission denied

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

Сообщение об ошибке, о котором вы сообщили, выдается в самом конце действия для git add. К сожалению, errno не сообщается git add ; если бы об этом сообщили, мы могли бы сделать предположение о проблеме на основе сообщенной ошибки.

git add показывает ошибку, о которой вы сообщили, если возникла проблема с записью содержимого нового индекса (содержимое записывается в файл .lock ) или когда он пытается зафиксировать файл блокировки (переименуйте файл .lock чтобы получить место существующего индексного файла; это «фиксация» транзакции файла блокировки, а не то, что делает git commit ).

Проблема с дисковым пространством?

Как свободное место на томе, где хранится ваш индексный файл? Может быть, это почти полный. Мне удалось воспроизвести сообщение об ошибке, когда индекс находится на томе, на котором достаточно свободного места для создания файла .lock но недостаточно для хранения всего содержимого.

Вопрос «Флаг»?

Есть ли какие-либо флаги в файле индекса? В моей системе, установленной в индексном файле uchg («неизменяемый на уровне пользователя») или uappnd («добавляемый только на уровне пользователя»), файл git add выдаст то же сообщение об ошибке, что и вы. Проверьте флаги с помощью ls -lO в вашем файле индекса (флаги отображаются после владельца группы и перед размером; он покажет - если флаги не установлены). Если вы видите флаги, используйте команду chflags, чтобы удалить их. Возможно, вы захотите выяснить, как флаги попали туда и есть ли они в других файлах (возможно, с помощью ls -lOR).

Используйте ktrace

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

ktrace git add whatever
kdump | less
: Go to the bottom. Search for the error message.
: What CALL is RETurning -1? What is the reported errno?

Когда объем заполнен, я вижу это:

 4728 git      CALL  write(0x9,0x116d24,0x18b0)
 4728 git      RET   write -1 errno 28 No space left on device
 4728 git      CALL  write(0x2,0xbfffcd00,0x26)
 4728 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "

Когда у меня установлен несовместимый флаг, я вижу это:

 4742 git      CALL  rename(0x105bdd,0xbfffdfa8)
 4742 git      NAMI  ".git/index.lock"
 4742 git      NAMI  ".git/index"
 4742 git      RET   rename -1 errno 1 Operation not permitted
 4742 git      CALL  write(0x2,0xbfffcd40,0x26)
 4742 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .