6 votes

Que veut dire git par "impossible de migrer les objets vers le stockage permanent" ?

Que veut dire git par "impossible de migrer les objets vers le stockage permanent" ?

 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

8voto

VonC Points 414372

Vous pouvez voir le message d'erreur " unable to migrate objects to permanent storage "introduit dans commettre 722ff7f pour Git 2.11 en octobre 2016.

L'explication est la suivante :

receive-pack : mettre les objets en quarantaine jusqu'à ce que pre-receive accepte

Quand un client nous envoie des objets, index-pack vérifie les objets eux-mêmes, puis les installe en place.
Si nous rejetons alors la poussée en raison d'une pre-receive nous ne pouvons pas simplement supprimer le fichier packfile ; d'autres processus peuvent en dépendre. Nous devons effectuer une vérification d'accessibilité normale à ce stade via git gc .

Mais de tels objets peuvent rester en place pendant des semaines en raison de la gc.pruneExpire période de grâce. Et pire encore, pendant cette période, ils peuvent être éclatés du lot pour devenir des objets détachés inefficaces.

Au lieu de cela, ce patch enseigne receive-pack pour placer les nouveaux objets dans un répertoire temporaire de "quarantaine".
Nous mettons ces objets à la disposition du contrôle de connectivité et de la pre-receive et ensuite les installer en place seulement si elle est réussie (et sinon les supprimer en tant que tempfiles).

Le code est :

    /*
     * 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;

En tmp_objdir_migrate() provient de la fonction commettre 2564d99 (toujours pour Git 2.11)

il aide les appelants à créer un répertoire temporaire à l'intérieur du répertoire objet, et un environnement temporaire qui peut être passé aux sous-programmes pour leur demander d'y écrire (le répertoire objet original reste accessible en tant qu'alternatif du temporaire).

Comme mentionné, cela peut résulter d'un problème de permission (ou d'espace disque).

De plus, l'utilisation (côté serveur) d'un git 2.10 ferait probablement disparaître cette erreur.


Git 2.13 (Q2 2017) développera cette notion de quarantaine :
Voir commettre d8f4481 , commettre eaeed07 , commettre 360244a (10 avril 2017) par Jeff King ( peff ) .
(fusionné par Junio C Hamano -- gitster -- en commettre 9f1384f , 24 avril 2017)

git receive-pack page de manuel comprend maintenant :

Environnement de quarantaine

Lorsque receive-pack prend des objets, ceux-ci sont placés dans un répertoire temporaire de "quarantaine" au sein de l'entreprise. temporaire de "quarantaine" dans le $GIT_DIR/objects et migré dans le magasin d'objets principal seulement après que la pre-receive crochet est terminée. Si la poussée échoue avant cela, le répertoire temporaire est supprimé entièrement.

Cela a quelques effets et réserves visibles pour l'utilisateur :

  1. Les poussées qui échouent en raison de problèmes avec le paquet entrant, d'objets manquants, ou en raison d'une perte de contrôle. ou à cause de la pre-receive crochet ne laissera aucune données sur le disque. Ceci est généralement utile pour éviter les échecs répétés des répétées de remplir votre disque, mais peut rendre le débogage plus difficile. plus difficile.

  2. Tous les objets créés par le pre-receive crochet sera créé dans le répertoire de quarantaine (et migré seulement s'il réussit).

  3. En pre-receive Le crochet NE DOIT PAS mettre à jour les références pour pointer sur objets mis en quarantaine. Les autres programmes accédant au référentiel ne pourront ne seront pas en mesure de voir les objets (et si les pre-receive Le crochet échoue, ces références seraient corrompues).

0voto

Aaron Mansheim Points 325

Je suppose que lorsqu'il compresse des objets, il les place temporairement quelque part, puis, dans une action distincte, il essaie de les déplacer vers leur emplacement permanent. Les déplacer signifie les copier de l'emplacement temporaire à l'emplacement permanent, puis les supprimer de l'emplacement temporaire ou les laisser être supprimés par un autre traitement, éventuellement à un autre moment. Par exemple, un grand nombre de fichiers et de répertoires qui sont écrits dans le dossier /tmp dans Linux sont habituellement laissés là, jusqu'à ce que le système d'exploitation les supprime au prochain redémarrage (si jamais il y a un redémarrage).

L'échec ressemble à un manque de permission d'écrire sur l'emplacement distant. L'échec est survenu lorsque git a essayé de déplacer les objets qu'il a compressés vers l'emplacement distant. https://git.patrikx3.tk/server-scripts.git que vous auriez spécifié dans la configuration du projet. Moins probable, vous auriez pu le spécifier dans la commande ou (je pense ?) dans votre configuration globale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X