Git ошибка pull: невозможно создать временное имя файла sha1
У меня есть небольшая настройка репо с git с единственной реальной целью, которая может быть развита локально на нескольких машинах (работа, домашний, ноутбук). Таким образом, у меня есть одна ветка, и я совершаю/нажимаю, когда я оставляю компьютер, тяну, как только я сяду на следующий. Хорошо работает, до сих пор. Теперь, когда я натягиваю свою машину "live test", я получаю следующее:
remote: Counting objects: 38, done.
remote: Compressiremote: ng objects: 100% (20/20), done.
remote: Total 20 (delta 17), reused 0 (delta 0)
error: unable to create temporary sha1 filename .git/objects/ed: File exists
fatal: failed to write object
fatal: unpack-objects failed
Поиск по сети был единственным реальным ответом, который я мог найти: http://marc.info/?l=git&m=122720741928774&w=2, который в основном утверждает, что это ложная ошибка, которая на вершине кучи и, таким образом, ничего не говорит о том, что действительно не так.
Куда мне идти, чтобы узнать, что не так?
Изменить: удалена локальная копия и повторно клонирована
Ответы
Ответ 1
Для чего это стоит, когда у меня была эта проблема, но когда я совершал ошибку, я пробовал git-repack
и git-gc
, но не работал. Я получил ошибку с разрешением, которая привела меня к chown
всей репо рекурсивно для пользователя, которого я ожидал, и я мог бы тогда совершить/нажать/вытащить без проблем.
Ответ 2
Это упоминается в Re: Ошибка? git svn fetch: "не удалось создать временное имя файла sha1/home/andres/git/общественности/crystal.g":
После переупаковка в репозитории проблема исчезла. Действительно странно.
Вы пытались переупаковать?
git-repack
используется для объединения всех объектов, которые в настоящее время не находятся в "пакете", в пакет. Он также может быть использован для реорганизации существующих пакетов в единый, более эффективный пакет.
Пакет представляет собой набор объектов, индивидуально сжатых, с применением дельта-сжатия, хранящихся в одном файле, с соответствующим индексным файлом.
Пакеты используются для уменьшения нагрузки на зеркальные системы, резервные двигатели, дисковое хранилище и т.д.
И вы пытались перейти на последнюю версию git?
У вас есть разные команды для запуска, чтобы "очистить" ваш репозиторий, от самых безопасных до более агрессивных:
$ git-prune
$ git-gc --aggressive
$ git-repack
$ git-repack -a
$ git-prune-packed
Как упоминалось в "Git сбор мусора, похоже, не полностью работает, git gc --aggressive
не является достаточным или даже достаточно само по себе.
Наиболее эффективной комбинацией будет добавление git repack
, но также git prune
:
git gc
git repack -Ad # kills in-pack garbage
git prune # kills loose garbage
Ответ 3
У нас была та же проблема, в которой пользователь 1 ранее выполнял, после чего каталог объектов /ed был создан и принадлежал пользователю 1. Поскольку права пользователя 1 по умолчанию не позволяли писать пользователю 2, пользователь 2 не мог зафиксировать.
git создает эти каталоги как хэш-ведра какого-то типа по требованию, поэтому вполне возможно, что они могут принадлежать нескольким другим людям с разными разрешениями в соответствии с их umask.
Мы решили это, сначала разбив все каталоги, принадлежащие одной и той же группе, затем chmodding их всех с g + w, чтобы они были записаны в группу и, наконец, установили все umask правильно, чтобы все вновь созданные ведра также были группами записываемые.
Это потому, что мы используем URL-адреса ssh://для проверки из git - я предполагаю, что если бы мы использовали сетевой протокол git, это не произошло бы, потому что демон git имел бы постоянное владение файлами.
Ответ 4
Я видел эту ошибку, когда несколько пользователей фиксируют один и тот же репозиторий, что приводит к проблемам с правами на запись в группе, как следствие ssh и umask
Вы можете создавать новые файлы, сохраняя режим g + w, установив sharedrepository=true
в разделе [core] config:
cd /my/shared/repo.git
git repo-config core.sharedRepository true
# (might also need to "chmod -R g+wX ." for each
# user that owns files in .git/objects)
EDIT:
Этот метод применим только к уже существующим репозиториям. Вы можете сделать это сразу после создания репозитория: git --bare init --shared
.
Ответ 5
В моем случае у меня была эта проблема при попытке нажать.
[email protected] sugarcrmclient [master] git push origin
Counting objects: 16, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (12/12), 3.91 KiB, done.
Total 12 (delta 1), reused 11 (delta 1)
error: unable to create temporary sha1 filename ./objects/7a: File exists
fatal: failed to write object
error: unpack failed: unpacker exited with error code
To [email protected]:sugarcrmclient.git
! [remote rejected] master -> master (n/a (unpacker error))
! [remote rejected] web -> web (n/a (unpacker error))
error: failed to push some refs to '[email protected]:sugarcrmclient.git'
это не проблема разрешения. git gc, git gc --agrressive, git repack или git чернослив локально не помог. Обратите внимание, как ошибка говорит об ошибке "unpacker error", я думаю, что этот ключ, потому что он подразумевает это на другой стороне. Поэтому я пошел в (голый) репозиторий и сделал там git gc. Тогда я мог бы толкнуть.
Ответ 6
У меня возникла эта проблема и чувствую, что я пробовал все вышеперечисленное. Я видел это раньше, и это было связано с разрешениями между разными пользователями, которые нажимают на репо, но в этом случае все подталкивают под одним и тем же пользователем, и только для хорошей меры я (на репо) отдает все нужным пользователю и группа и chmodded u + w и g + w для хорошей меры. Я все еще получаю error: unable to create temporary sha1 filename ./objects/9a
.
Я только что провел немного больше исследований и, похоже, что-то происходит с разрешениями: перед нажатием на репо (который является голой репо, размещенной на сервере), все файлы в объектах имеют разрешения -rw-rw-r--
, что и следовало ожидать. Все они принадлежат одному пользователю и группе. После неудачного нажатия, я могу grep для файлов с разрешениями, установленными на -r--r--r--
, то есть недоступными для записи, и отображать их местоположения с помощью команды bash find . -perm 444 | xargs ls -l
. Выполнение этого дает мне следующее:
-r--r--r-- 1 ourusername ourgroupname 730 Nov 4 15:02 ./objects/46/346f550340bc0d3fec24ea42b25999161f8c7a
-r--r--r-- 1 ourusername ourgroupname 177 Nov 4 15:02 ./objects/4c/664ebbfad568de6101a52c01f5117654945d6d
-r--r--r-- 1 ourusername ourgroupname 730 Nov 4 14:36 ./objects/9e/3f572366da9fb319331dfd924ae35cf9fd00ae
-r--r--r-- 1 ourusername ourgroupname 175 Nov 4 14:36 ./objects/aa/f42d7ed706f1d2e4a0aa1c5eb184e17e917204
Это все недавно измененные файлы (во время публикации 4 ноября, 15:08). Таким образом, похоже, что git обновляет/заменяет файлы (дает им новую временную метку), меняя разрешения в процессе, а затем жалуясь на разрешения. Я полностью зациклен на том, что происходит здесь: (
Ответ 7
Я столкнулся с этой проблемой при использовании git push
Затем я запустил git gc
, он работает.
Из git -gc (1) Ручная страница:
git -gc - очистка ненужных файлов и оптимизация локального репозитория
Ответ 8
Моя проблема была проблемой разрешения
Я пошел вверх по каталогу, затем cp -R repo repo_copy
тогда все снова работало.
тогда я пошел удалять репо и отказался, проверял perms и, конечно же, было изменено perms, что пользователь, которого я запускал, так как не имел доступа на запись...
Ответ 9
Если кто-то еще получит эту ошибку, я столкнулся с ней, когда работаю над разделом windows-linux. Кажется, что если форматы новой строки преобразуются в окна, в некоторых случаях вы можете зафиксировать их, но git затем преобразуется в формат linux.
Итак, если новые строки были единственным изменением, то теперь у нас было две одинаковые фиксации в строке. Поскольку хеши фиксации генерируются из данных файла фиксации, и каждый из них имеет одинаковые данные, они попадают в один и тот же хеш. По крайней мере, в моем случае это означает, что указывает "Файл существует". git все запуталось.
Я исправил это, выполнив git reset --hard
локально и на центральном репо.
Ответ 10
Лично у меня возникла эта проблема, когда я сделал мастер создания координат git.
Решение для меня было:
На моем сервере я вхожу в систему с корнем в каталоге, который содержит мой репозиторий и рекурсивно:
chown -hR MyGitUser MyRepo
и все работает отлично
У меня есть только один пользователь git, а другие соединяются с ssh путем публикации их открытого ключа.
Если вы настроили несколько пользователей git, вы должны сделать то же самое для каждого пользователя.
Ответ 11
Пробовал некоторые из решений, но в итоге понял, что на диске нашего сервера git не осталось свободного места.
Ответ 12
Я видел эту ошибку один раз и отслеживал ее с проблемой разрешений. Я не мог найти, как это было вызвано, но как-то git выполнялось как группа, у которой не было разрешения на запись для какой-либо каталога объектов.
Я не видел в нем очевидной причины и предположил, что это проблема с разрешениями OS X, предположительно из-за неаккуратного make или install.
Ответ 13
У меня была аналогичная ошибка, и это была не проблема с разрешениями (я единственный пользователь репозитория), и ни одна из методов gc/repack не работала. В конечном итоге я просто отодвинул старый удаленный репозиторий и нажал новый. К счастью, это было довольно мало.
Лиам
Ответ 14
Следует отметить, что вам нужно исправить разрешения для репозитория, на который вы нажимаете, а не только на свой рабочий.
Ответ 15
Изменение прав группы пользователей + работало для меня. Я заметил, что некоторые пользовательские коммиты были в разных группах. Изменение всех в ту же группу устранило эту проблему.
Ответ 16
Я получаю такие ошибки при работе над sshfs. Он ремонтирует себя после размонтирования, а затем снова устанавливает ресурс.
Ответ 17
Работа с linux-сервером на локальном Mac - я попробовал несколько предложений выше, не повезло. Перезагрузился, а затем он работал.
Это не очень подходящее решение, но я мог бы помочь кому-то там.
Ответ 18
У меня возникла эта проблема при попытке развернуть на геройку. Оказывается, у меня был драгоценный камень, который написал файл в каталог tmp/, и герою это не понравилось. Взял файл и вуаля, проблема решена. Смотрите это: https://devcenter.heroku.com/articles/read-only-filesystem
Ответ 19
У меня была эта проблема в последнее время, и я пробовал все в этой ветке без везения. На моем VPS было много свободного места на диске, но оказалось, что из-за того, что я не очистил папку развертывания, я превысил лимит inodes (вероятно, из-за JS-библиотек, которые я включил с 100-м файлами, прежде чем хрустить их).
Я удалил загрузку старых развертываний, и все сработало нормально.
Я понимаю, что это немного крайний случай, но это нужно иметь в виду, если все остальное не работает.