Git pull error: невозможно создать временное имя файла sha1
У меня есть небольшая настройка git-репо с единственной реальной целью, чтобы иметь возможность разрабатывать локально на нескольких машинах (работа, дом, ноутбук). Таким образом, у меня есть одна ветвь, и я фиксирую / толкаю, как только выхожу из компьютера, тяну, когда я сижу за следующей. Работал нормально, до сих пор так и есть. Теперь, когда я использую мой тестовый компьютер, я получаю следующее:
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 который в основном утверждает, что это фиктивная ошибка, которая находится на вершине кучи и, таким образом, ничего не говорит о том, что на самом деле не так.
Куда мне пойти отсюда, чтобы узнать, что не так?
Редактировать: удалил локальную копию и повторно клонировал
19 ответов
Для чего это стоит, когда у меня была эта проблема - но при совершении - я пытался git-repack
а также git-gc
, но ни один не работал. Я получил ошибку отказа в разрешении, которая привела меня к chown
все репо рекурсивно для пользователя, которого я ожидал, и я мог без проблем выполнить /push/pull.
Это упоминается в " Re: Bug? Git svn fetch: ", не в состоянии создать временное имя файла sha1 /home/andres/git/public/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
Я видел эту ошибку, когда несколько пользователей фиксируют один и тот же репозиторий, что приводит к проблемам с правами на запись в группу из-за 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)
РЕДАКТИРОВАТЬ:
Этот метод применим только к уже существующим репо. Вы можете сделать правильно один раз при создании репозитория: git --bare init --shared
,
У нас была та же проблема, когда пользователь 1 ранее фиксировал, после чего каталог objects/ed был создан и принадлежал пользователю 1. Поскольку разрешения пользователя 1 по умолчанию не разрешали запись для пользователя 2, пользователь 2 не смог зафиксировать.
git создает эти каталоги как хеш-пакеты некоторого вида по требованию, поэтому вполне возможно, что они будут принадлежать нескольким разным людям с разными разрешениями в зависимости от их umask.
Мы решили это, сначала выполнив chgrping для всех каталогов, принадлежащих одной и той же группе, затем отредактировав их все с помощью g + w, чтобы они были доступны для записи в группе, и, наконец, правильно установив все umask, чтобы все вновь созданные сегменты также были доступны для записи в группе.
Это потому, что мы используем ssh:// URL для извлечения из git - я предполагаю, что если бы мы использовали сетевой протокол git, этого бы не произошло, потому что у демона git было бы постоянное владение файлами.
В моем случае у меня была эта проблема при попытке подтолкнуть.
dieter@dieter-dellD620-arch 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 gitosis@tiktak.kangaroot.net: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 'gitosis@tiktak.kangaroot.net:sugarcrmclient.git'
это не было проблемой разрешения. git gc, git gc --agrressive, git repack или git prune локально не помогли. Обратите внимание, как ошибка говорит "ошибка распаковщика", я думаю, что это ключ, потому что это подразумевает, что это на другой стороне. Поэтому я пошел в (голое) хранилище и сделал там git gc. Тогда я мог бы толкнуть нормально.
Я столкнулся с этой проблемой при использовании git push
Тогда я бегу git gc
, оно работает.
Из git-gc(1) Страница руководства:
git-gc - очищает ненужные файлы и оптимизирует локальный репозиторий
У меня возникла эта проблема, и я чувствую, что перепробовал все вышеперечисленное. Я видел это раньше, и это было связано с правами доступа разных пользователей к репо, но в этом случае все запускаются под одним и тем же пользователем, и я просто (на репо) все перебил нужному пользователю. и группа и chmodded u + w и g + w для хорошей меры. Я все еще получаю error: unable to create temporary sha1 filename ./objects/9a
,
Я только что провел более подробное исследование, и похоже, что-то происходит с разрешениями: перед принудительным размещением в репо (который является голым репозиторием, размещенным на сервере), все файлы в объектах имеют разрешения -rw-rw-r--
установить, что вы и ожидаете. Все они принадлежат одному пользователю и группе. После неудачного нажатия я могу выполнить поиск файлов с разрешениями, установленными на -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 обновляет / заменяет файлы (дает им новую временную метку), изменяет разрешения в процессе, а затем жалуется на разрешения. Я в полном недоумении от того, что здесь происходит:(
Если кто-то еще получит эту ошибку, я сталкивался с ней при работе через Windows-Linux. Кажется, что если форматы новой строки конвертируются в окна, вы все равно можете зафиксировать их в некоторых обстоятельствах, но затем git преобразуется в формат linux.
Так что если новые строки были единственным изменением, то теперь у нас было два одинаковых коммита подряд. Поскольку хеши фиксации генерируются из данных файла фиксации, и у каждого были одинаковые данные, они заканчивались одинаковым хешем. По крайней мере, в моем случае, это то, что указывает "Файл существует". Git запутался.
Я исправил это, делая git reset --hard
локально и на центральном репо.
Лично у меня возникла эта проблема, когда я сделал мастер git push origin. Решение для меня было: На моем сервере я захожу с root'ом в каталог, содержащий мой репозиторий, и делаю рекурсивно:
chown -hR MyGitUser MyRepo
и все работает отлично
У меня есть только один пользователь git, а другие подключаются к ssh, публикуя свой открытый ключ. Если вы настраиваете несколько пользователей git, вы должны сделать то же самое для каждого пользователя.
Моя проблема была проблема с разрешением
Я пошел вверх по каталогу, затем cp -R repo repo_copy
тогда все снова заработало.
Затем я удалил репозиторий и отказал в разрешении, проверил разрешения и убедился, что было изменено достаточно разрешений, чтобы у пользователя, с которым я работал, не было доступа на запись...
Пробовал некоторые решения, но в итоге понял, что на диске нашего git-сервера не осталось свободного места.
У меня была эта проблема при попытке развернуть на героку. Оказывается, у меня был гем, который записал файл в каталог tmp /, а heroku это не понравилось. Вынул файл и вуаля, проблема решена. Смотрите это: https://devcenter.heroku.com/articles/read-only-filesystem
Следует отметить, что вам нужно исправить разрешения для репозитория, к которому вы отправляете, а не только ваш рабочий.
Изменение группы пользователей + разрешение работало для меня. Я заметил, что коммиты некоторых пользователей были в другой группе. Изменение всех в одну группу решило эту проблему.
У меня была эта проблема недавно, и я попробовал все в этой теме без удачи. На моем VPS было достаточно дискового пространства, но оказалось, что из-за того, что я не удалял папку развертываний, я превысил лимит инодов (вероятно, из-за библиотек JS, которые я включал в файлы с сотнями до их сжатия).
Я удалил загрузку старых развертываний, и все работало нормально.
Я понимаю, что это немного необычный случай, но об этом следует помнить, если ничего не помогает.
Я однажды видел эту ошибку и отследил ее до проблемы с разрешениями. Я не мог найти, как это было вызвано, но каким-то образом git работал как группа, у которой не было разрешения на запись в какой-либо объектный каталог.
Я не видел никакой очевидной причины для этого в коде и предположил, что это была проблема с разрешениями OS X, предположительно из-за неаккуратной сборки или установки.
Я получаю такие ошибки при работе над sshfs. Он восстанавливает сам себя после размонтирования, а затем снова устанавливает общий ресурс.
У меня была похожая ошибка, и это не было проблемой с разрешениями (я единственный пользователь хранилища), и ни один из методов gc/repack не сработал. В итоге я просто отодвинул старый удаленный репозиторий и перенес новый. К счастью, это было довольно мало.
Liam
Работая на сервере Linux с локальным Mac - я попробовал несколько из вышеперечисленных предложений без удачи. Перезагрузился и тут все заработало.
Это не совсем правильное решение, но я думаю, что это может кому-то помочь.