Was bedeutet die git-Fehlermeldung "Server lässt keine Anforderung für ein unbeworbenes Objekt zu"?

23

Ich versuche, eine Prüfung von Github durchzuführen, und ich erhalte die folgende Fehlermeldung:

[user@arch ~]$ git clone --recursive https://github.com/simsong/tcpflow.git
Cloning into 'tcpflow'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 4190, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 4190 (delta 21), reused 29 (delta 12), pack-reused 4146
Receiving objects: 100% (4190/4190), 50.27 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (2954/2954), done.
Submodule 'src/be13_api' (https://github.com/simsong/be13_api.git) registered for path 'src/be13_api'
Submodule 'src/dfxml' (https://github.com/simsong/dfxml.git) registered for path 'src/dfxml'
Submodule 'src/http-parser' (https://github.com/nodejs/http-parser.git) registered for path 'src/http-parser'
Cloning into '/home/user/tcpflow/src/be13_api'...
remote: Counting objects: 1203, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 1203 (delta 2), reused 5 (delta 1), pack-reused 1194
Receiving objects: 100% (1203/1203), 477.47 KiB | 1.96 MiB/s, done.
Resolving deltas: 100% (821/821), done.
Cloning into '/home/user/tcpflow/src/dfxml'...
remote: Counting objects: 1929, done.
remote: Total 1929 (delta 0), reused 0 (delta 0), pack-reused 1929
Receiving objects: 100% (1929/1929), 572.09 KiB | 2.89 MiB/s, done.
Resolving deltas: 100% (1294/1294), done.
Cloning into '/home/user/tcpflow/src/http-parser'...
remote: Counting objects: 1487, done.
remote: Total 1487 (delta 0), reused 0 (delta 0), pack-reused 1487
Receiving objects: 100% (1487/1487), 667.24 KiB | 2.46 MiB/s, done.
Resolving deltas: 100% (916/916), done.
Submodule path 'src/be13_api': checked out 'c81521d768bb78499c069fcd7c47adc8eee0350c'
Submodule path 'src/dfxml': checked out 'c31224626cf5f6678d42cbcfbfcd4e6191c9a864'
error: Server does not allow request for unadvertised object 5bbcdc5df9d01b521e8da011bab0da70bdec3653
Fetched in submodule path 'src/http-parser', but it did not contain 5bbcdc5df9d01b521e8da011bab0da70bdec3653. Direct fetching of that commit failed.
[user@arch ~]$

Also bin ich der Betreuer dieser Repos. Der src / http-Parser ist eine Abzweigung eines anderen Repos, und die Betreuer dieses Repos haben meine Pull-Anforderungen (ohne Angabe von Gründen), der .gitignoreDatei einige automatisch generierte Dateien hinzuzufügen, durchweg nicht akzeptiert . Aber ich denke nicht, dass das hier das Problem ist.

vy32
quelle
Ich habe den gleichen Befehl ausprobiert und es gab keinen Fehler. Haben Sie noch ein Problem? Übrigens, in meinem Fall hat es ein anderes Commit Submodule path 'src/http-parser': checked out '6b05cce82da5c4d407e5576ab892bc20a17b0394'
ausgecheckt
Das Problem ist weg. Ich denke, dass es bedeutet, dass die Submodulreferenz für eine Kasse war, die nicht existiert. Aber ich bin mir nicht sicher.
13.
Als Hinweis für verwirrte andere kann diese Meldung jedoch auftreten, wenn Sie ein Submodul aktualisieren, ein übergeordnetes Modul auf das neue Festschreiben aktualisieren und das neue Festschreiben niemals in das Submodul verschieben. Dann haben Sie natürlich Probleme beim Auschecken eines Commits, das auf der Fernbedienung des Submoduls nicht vorhanden ist!
Patrick Sanan
Das Problem scheint zu sein, dass ich das Submodul aktualisiert, das übergeordnete Repo aktualisiert, das übergeordnete Repo verschoben, das Submodul jedoch nicht verschoben habe. Das übergeordnete Repo verwies also wörtlich auf ein Commit, das nicht im Repo des Submoduls auf Github enthalten war.
VY32

Antworten:

8

jgit - Was sind die beworbenen Refs von git? - Stapelüberlauf :

Während eines Abrufs kann der Server Verweise auflisten, über die er verfügt und die der Client möglicherweise abrufen möchte. Dies sind die ausgeschriebenen Referenzen.

  • Es sieht so aus, als ob Sie keinen einzelnen spezifischen Commit direkt vom Server erhalten können, nur Refs (dh Zweige und Tags). Oder vielmehr, dass Github-Server so konfiguriert sind, dass solche Anforderungen nicht zugelassen werden.
  • Also, wenn Sie eine bestimmte bekommen begehen mit --depth, es höchstens sein muss <depth>-1Commits vom geholt ref (das ist der Zweig / Tag im Submodul Metadaten angegeben)

    In der Regel raten die Leute, nur eine deptheinigermaßen große, aber immer noch viel kleinere Anzahl als die Gesamtzahl der Festschreibungen im Repository 50oder zu wählen 100. Zum Beispiel 50ist das, was Travis verwendet , wenn für das Projekt den anfänglichen Klon zu tun.

Wenn Sie das Submodul nicht mit aktualisieren, bedeutet das Nichtfinden --depthdes Commits Folgendes:

  • der Baum des Submoduls ist im "flachen" Zustand und das oben Gesagte gilt (nur möglich, wenn es zuvor mit aktualisiert wurde --depthoder sein Eintrag in .gitmoduleshatshallow = true )
  • Das Commit befindet sich nicht in dem Zweig, den das Submodul verwendet
  • Das Commit befindet sich überhaupt nicht im Repo des Submoduls:
    • entweder hat jemand einen Fehler gemacht,
    • oder es war einmal da, wurde aber durch einen erzwungenen Stoß gelöscht

In Ihrem speziellen Fall war es der letzte Fall: Festschreiben 5bbcdc5df9d01b521e8da011bab0da70bdec3653ist überhaupt nicht im https://github.com/simsong/http-parser.gitRepo.

ivan_pozdeev
quelle
Was ist depth?
Vy32
@ vy32 hat Informationen für den Fall hinzugefügt, dass Sie nicht mit aktualisieren --depth.
ivan_pozdeev
"es war einmal da, wurde aber durch einen erzwungenen Stoß gelöscht" - gibt es einen Rückgriff in dieser Situation?
Skolsuper
1
@skolsuper wählen Sie ein anderes Commit zum Abrufen. Wenn das zB ein Submodul war, schalten Sie es im Superprojekt auf ein anderes Commit.
ivan_pozdeev
3

Ein Weg, um Zugriff auf ein unbewusstes Objekt zu erhalten, ist die Synchronisierung. Dann sollte ein Submodul-Update funktionieren, wie:

git submodule sync --recursive
git submodule update
Schnitzer
quelle
1
+1 zur Vereinfachung. Für mich ist git submodule updateein anderes Submodul ausgefallen, aber als ich diese beiden Zeilen auf alle meine Submodule in der richtigen Reihenfolge angewendet habe , hat es endlich funktioniert.
Bizhan
2
Bei potenziell großen Superprojekten wird empfohlen, $ git submodule sync --recursive; git submodule updateOR auszuführen , wenn dies nur nach dem Klonen einer Remote erfolgt $ git submodule update --init --recursive. Dadurch wird der Dateibaum Ihres Projekts /project/root/je nach Inhalt von unten nach unten durchlaufen /project/root/.gitmodules. Viel mehr bei $ git submodule --help...
Cbhihe
Danke @Cbhihe Ich bearbeite die Antwort so, dass sie die --recursiveFlagge enthält.
Carver