Что означает 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 крюк завершен. Если до этого неудачная отправка не удалась, временный каталог полностью удаляется.

Это имеет несколько видимых пользователю эффектов и предостережений:

  1. Выдвигается из-за проблем с входящим пакетом, отсутствующих объектов или из-за pre-receive Хук не оставит никаких данных на диске. Это обычно полезно, чтобы предотвратить повторные неудачные попытки заполнения вашего диска, но может сделать отладку более сложной.

  2. Любые объекты, созданные pre-receive Хук будет создан в карантине (и перенесен только в случае успеха).

  3. pre-receive hook НЕ ДОЛЖЕН обновлять ссылки на карантинные объекты. Другие программы, обращающиеся к хранилищу, не смогут видеть объекты (и если pre-receive ловушка не работает, эти ссылки будут повреждены).

Предположительно, когда он сжимает объекты, он временно помещает их куда-то, а затем отдельным действием пытается переместить их в их постоянное местоположение. Перемещение их означает копирование их из временного местоположения в постоянное местоположение, а затем либо удаление их из временного местоположения, либо оставление их для другой обработки, возможно, в другое время. Например, многие файлы и каталоги, которые записываются в /tmp каталог в Linux обычно остается там до тех пор, пока операционная система не удалит их при следующей перезагрузке (если она вообще была).

Ошибка выглядит как отсутствие разрешения на запись в удаленное местоположение. Ошибка произошла, когда git попытался переместить сжатые объекты в удаленное местоположение. https://git.patrikx3.tk/server-scripts.git что вы указали бы в конфигурации проекта. Менее вероятно, вы могли бы указать это в команде или (я думаю?) В вашей глобальной конфигурации.

Другие вопросы по тегам