Heim >Backend-Entwicklung >Golang >Wenn Sie die Plainclone-Funktion von go-git verwenden, wird an die Git-Repo-URL /git-upload-pack angehängt
Der PHP-Editor Baicao hat eingeführt, dass bei Verwendung der Plainclone-Funktion von go-git bei Angabe der Git-Repo-URL automatisch /git-upload-pack angehängt wird. Dies liegt daran, dass git-upload-pack der Befehl ist, der vom Git-Protokoll zum Klonen und Abrufen von Remote-Repositorys verwendet wird. Mit dieser Funktion können Sie Remote-Repositorys einfach klonen und abrufen, ohne /git-upload-pack manuell hinzufügen zu müssen. Auf diese Weise können Sie mit go-git Git-Vorgänge bequemer ausführen und die Arbeitseffizienz verbessern.
Versuch, ein Repository von Azure Devops zu klonen.
func (gitopt *GitOptions) clone() (*git.Repository, error) { r, err := git.PlainClone(gitopt.RepoDir, false, &git.CloneOptions{ Progress: os.Stdout, URL: "https://<path to repo>", Auth: &http.BasicAuth{ Username: "gituser", Password: gitopt.PAT, }, }) if err != nil { log.Info(err.Error()) return nil, err } return r, nil }
Beim Ausführen dieses Codes wird /git-upload-pack („https://ee9cc9f1d5084f77d50d4774da6c0722/git-upload-pack“) am Ende der Repo-URL hinzugefügt, sodass der Klon mit dem Statuscode 400 fehlschlägt. Ich kann nicht verstehen, warum dies angehängt wird.
Das HTTP-basierte Git-Protokoll besteht aus zwei Schritten, abhängig von der verwendeten Protokollversion. In v0 und v1 lautet die erste Anfrage /info/refs
并读取正在使用的引用,然后第二个请求是 /git-upload-pack
(用于获取和克隆)或 /git-receive- pack
(für Push). In Version 2 sind die Endpunkte dieselben, aber der erste ist die Funktionsanforderung und dann die Referenzanforderung und die Datenübertragung zum zweiten Endpunkt.
In all diesen Fällen ist die von Ihnen angegebene URL lediglich die Grundlage für das Anhängen des Pfads. Verschiedene Pfade erleichtern die Steuerung des Zugriffs auf einen einfachen Git-Server hinter etwas wie Nginx oder Apache, weshalb es nicht nur eine einzelne URL-Komponente gibt.
Die generierte URL ist also tatsächlich korrekt. Der Grund, warum Sie eine 400 sehen, liegt darin, dass ein Problem vorliegt Azure DevOps erfordert, dass der Client multi_ack
Funktionen unterstützt, die go-git nicht unterstützt. Obwohl Server technisch gesehen keine Unterstützung für Clients bereitstellen müssen, die sie nicht möchten, ist das Git-Smart-HTTP-Protokoll im Allgemeinen so konzipiert, dass es sich langsam verschlechtern kann. Es ist daher nicht sicher, dass Clients unbedingt einen bestimmten Satz unterstützen. Funktionalität, und Azure DevOps sollte diese Annahme vermeiden.
Verknüpfte Probleme haben einen Link zu einer Pull-Anfrage, die das Problem in einigen (aber nicht allen) Fällen behebt. Möglicherweise müssen Sie jedoch auf eine höhere Version aktualisieren, um davon profitieren zu können.
Das obige ist der detaillierte Inhalt vonWenn Sie die Plainclone-Funktion von go-git verwenden, wird an die Git-Repo-URL /git-upload-pack angehängt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!