Что означает git под "неспособностью перенести объекты в постоянное хранилище"?
Что означает git под "неспособностью перенести объекты в постоянное хранилище"?
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 956 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
error: failed to push some refs to 'https://git.patrikx3.tk/server-scripts.git'
To https://git.patrikx3.tk/server-scripts.git
! refs/heads/master:refs/heads/master [remote rejected] (unable to migrate objects to permanent storage)
Done
2 ответа
Вы можете увидеть сообщение об ошибке " unable to migrate objects to permanent storage
"введено в коммите 722ff7f для Git 2.11 в октябре 2016 года.
Объяснение:
receive-pack
: помещать объекты в карантин доpre-receive
принимаетКогда клиент выставляет нам объекты,
index-pack
проверяет сами объекты, а затем устанавливает их на место.
Если мы затем отклоним толчок из-заpre-receive
хук, мы не можем просто удалить файл пакета; другие процессы могут зависеть от этого. Мы должны сделать обычную проверку достижимости на этом этапе с помощьюgit gc
,Но такие объекты могут висеть неделями из-за
gc.pruneExpire
льготный период. И что еще хуже, за это время они могут взорваться из пакета в неэффективные незакрепленные предметы.Вместо этого этот патч учит
receive-pack
поместить новые объекты во временный каталог "карантин".
Мы делаем эти объекты доступными для проверки подключения иpre-receive
перехватить, а затем установить их на место, только если это успешно (и в противном случае удалить их как временные файлы).
Код является:
/*
* Now we'll start writing out refs, which means the objects need
* to be in their final positions so that other processes can see them.
*/
if (tmp_objdir_migrate(tmp_objdir) < 0) {
for (cmd = commands; cmd; cmd = cmd->next) {
if (!cmd->error_string)
cmd->error_string = "unable to migrate objects to permanent storage";
}
return;
}
tmp_objdir = NULL;
tmp_objdir_migrate()
функция происходит из коммита 2564d99 (все еще для Git 2.11)
это помогает вызывающим абонентам создавать временный каталог внутри каталога объектов и временную среду, которую можно передать подпрограммам, чтобы они попросили их записать туда (исходный каталог объектов остается доступным как альтернатива временному каталогу).
Как уже упоминалось, это может произойти из-за проблемы с правами доступа (или из-за дискового пространства)
Кроме того, использование (на стороне сервера) git 2.10 может привести к исчезновению этой ошибки.
В Git 2.13 (второй квартал 2017 года) будет расширено понятие карантина:
Смотрите коммит d8f4481, коммит eaeed07, коммит 360244a (10 апреля 2017 г.) Джеффа Кинга ( peff
)
(Объединено Юнио С Хамано - gitster
- в коммите 9f1384f, 24 апреля 2017 г.)
git receive-pack
Страница man теперь включает в себя:
Карантинная среда
когда
receive-pack
принимает объекты, они помещаются во временный "карантинный" каталог внутри$GIT_DIR/objects
каталог и мигрировали в главное хранилище объектов только послеpre-receive
крюк завершен. Если до этого неудачная отправка не удалась, временный каталог полностью удаляется.Это имеет несколько видимых пользователю эффектов и предостережений:
Выдвигается из-за проблем с входящим пакетом, отсутствующих объектов или из-за
pre-receive
Хук не оставит никаких данных на диске. Это обычно полезно, чтобы предотвратить повторные неудачные попытки заполнения вашего диска, но может сделать отладку более сложной.Любые объекты, созданные
pre-receive
Хук будет создан в карантине (и перенесен только в случае успеха).
pre-receive
hook НЕ ДОЛЖЕН обновлять ссылки на карантинные объекты. Другие программы, обращающиеся к хранилищу, не смогут видеть объекты (и еслиpre-receive
ловушка не работает, эти ссылки будут повреждены).
Предположительно, когда он сжимает объекты, он временно помещает их куда-то, а затем отдельным действием пытается переместить их в их постоянное местоположение. Перемещение их означает копирование их из временного местоположения в постоянное местоположение, а затем либо удаление их из временного местоположения, либо оставление их для другой обработки, возможно, в другое время. Например, многие файлы и каталоги, которые записываются в /tmp
каталог в Linux обычно остается там до тех пор, пока операционная система не удалит их при следующей перезагрузке (если она вообще была).
Ошибка выглядит как отсутствие разрешения на запись в удаленное местоположение. Ошибка произошла, когда git попытался переместить сжатые объекты в удаленное местоположение. https://git.patrikx3.tk/server-scripts.git
что вы указали бы в конфигурации проекта. Менее вероятно, вы могли бы указать это в команде или (я думаю?) В вашей глобальной конфигурации.