Maison  >  Article  >  développement back-end  >  Lors de l'utilisation de la fonctionnalité Plainclone de go-git, l'URL du dépôt git aura /git-upload-pack ajouté

Lors de l'utilisation de la fonctionnalité Plainclone de go-git, l'URL du dépôt git aura /git-upload-pack ajouté

WBOY
WBOYavant
2024-02-12 08:06:08425parcourir

使用 go-git 的 Plainclone 功能时,git repo url 会附加 /git-upload-pack

L'éditeur PHP Baicao a introduit que lors de l'utilisation de la fonction Plainclone de go-git, lorsque vous fournissez l'URL du dépôt git, /git-upload-pack sera automatiquement ajouté. En effet, git-upload-pack est la commande utilisée par le protocole git pour cloner et extraire des référentiels distants. Avec cette fonctionnalité, vous pouvez facilement cloner et extraire des référentiels distants sans ajouter /git-upload-pack manuellement. De cette façon, vous pouvez utiliser go-git pour effectuer des opérations git plus facilement et améliorer l'efficacité du travail.

Contenu de la question

Essayer de cloner un référentiel à partir d'Azure Devops.

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
}

L'exécution de ce code ajoute /git-upload-pack ("https://87673d4bab84f8a5d784bdb9c7504a91/git-upload-pack") à la fin de l'URL du dépôt, de sorte que le clone échoue avec le code d'état 400. Je ne comprends pas pourquoi cela est ajouté.

Solution de contournement

Le protocole Git basé sur HTTP se compose de deux étapes, selon la version du protocole utilisée. En v0 et v1, la première requête est /info/refs 并读取正在使用的引用,然后第二个请求是 /git-upload-pack (用于获取和克隆)或 /git-receive- pack (pour push). Dans la version 2, les points de terminaison sont les mêmes, mais le premier est la demande de fonctionnalité, puis la demande de référence et le transfert de données vers le deuxième point de terminaison.

Dans tous ces cas, l'URL que vous fournissez n'est que la base pour ajouter le chemin. Différents chemins facilitent le contrôle de l'accès à un simple serveur Git derrière quelque chose comme nginx ou Apache, c'est pourquoi il n'y a pas qu'un seul composant URL.

L'URL générée est donc réellement correcte. La raison pour laquelle vous voyez un 400 est parce que il y a un problème Azure DevOps nécessite que le client prenne en charge multi_ack fonctionnalité, que go-git ne prend pas en charge. Bien que techniquement, les serveurs ne soient pas obligés de prendre en charge les clients qu'ils ne souhaitent pas, le protocole HTTP Git Smart est généralement conçu pour se dégrader progressivement, il n'est donc pas sûr de supposer que les clients prennent nécessairement en charge un ensemble particulier. fonctionnalité, et Azure DevOps devrait éviter de faire cette hypothèse.

Les problèmes liés ont un lien vers une pull request qui résout le problème dans certains cas (mais pas tous). Cependant, vous devrez peut-être mettre à jour vers une version supérieure pour en profiter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer