Maison >développement back-end >Golang >Comment pousser une branche spécifique vers un site distant à l'aide de go-git

Comment pousser une branche spécifique vers un site distant à l'aide de go-git

WBOY
WBOYavant
2024-02-09 09:12:201004parcourir

如何使用 go-git 将特定分支推送到远程

l'éditeur php Strawberry vous présentera comment utiliser go-git pour pousser une branche spécifique vers la télécommande. go-git est une bibliothèque open source basée sur le langage Go qui fournit un moyen simple d'exploiter les référentiels Git. Le transfert de branches spécifiques vers des référentiels distants permet aux membres de l'équipe de partager le dernier code et de maintenir la base de code à jour. Dans cet article, nous présenterons en détail les étapes d'utilisation de go-git pour vous aider à maîtriser rapidement cet outil pratique. Que vous soyez nouveau sur Git ou développeur expérimenté, cet article vous fournira des conseils utiles. Apprenons à utiliser go-git pour pousser une branche spécifique vers le référentiel distant !

Contenu de la question

Quelle est la manière canonique de pousser une branche locale unique spécifique vers une télécommande spécifique à l'aide de go-git ?

J'ai extrait et ouvert le référentiel local en utilisant go-git

repo, err := git.plainopen("my-repo")

Ce référentiel a une origin télécommande par défaut.

J'essaie de synchroniser le contenu de ce référentiel avec une autre télécommande mirror, j'ai donc ajouté la télécommande

repo.createremote(&config.remoteconfig{
                name: "mirror",
                urls: []string{"[email protected]:foo/mirror.git"},
            })

Tout d'abord, je récupère le contenu du référentiel de origin

err = remote.fetch(&git.fetchoptions{
                remotename: "origin",
                tags:       git.alltags,
            })

...et utilisez remote.list() pour découvrir toutes les branches et tags d'intérêt

La dernière étape consiste à pousser la branche vers mirror,同时根据映射重写分支名称。例如。 refs/remotes/origin/master 签出为 refs/heads/master 应作为 main 推送到 mirror tout en réécrivant le nom de la branche en fonction du mappage. Par exemple. refs/remotes/origin/master extrait en tant que refs/heads/master doit être poussé vers la

télécommande en tant que main. J'itère donc les branches et j'essaie de les pousser une par une :

refSpec := config.RefSpec(fmt.Sprintf(
                "+%s:refs/remotes/mirror/%s",
                localBranch.Name().String(),
                // map branch names, e.g. master -> main
                mapBranch(remoteBranch.Name().Short()),
            ))
err = repo.Push(&git.PushOptions{
                RemoteName: "mirror",
                Force:      true,
                RefSpecs:   []config.RefSpec{refSpec},
                Atomic:     true,
            })
git.noerralreadyuptodate 并且 mirror 远程上没有任何反应。

解决方法

当将单个分支推送到远程时,refspec 不应采用 +refs/heads/localbranchname:refs/remotes/remotename/remotebranchnameMais cela entraîne git.noerralreadyuptodate et rien ne se passe sur la télécommande.

Solution de contournement

Lorsque vous poussez une seule branche vers une télécommande, refspec ne doit pas être au format +refs/heads/localbranchname:refs/remotes/remotename/remotebranchname, par exemple

Ici :

// refspec is a mapping from local branches to remote references.
...
// eg.: "+refs/heads/*:refs/remotes/origin/*"
//
// https://git-scm.com/book/en/v2/git-internals-the-refspec
type refspec string

Mais comme 🎜
"+refs/heads/localbranchname:refs/heads/remotebranchname"
🎜Au contraire. Voir 🎜Exemple🎜 : 🎜
    refSpecStr := fmt.Sprintf(
        "+%s:refs/heads/%s",
        localBranch.Name().String(),
        mapBranch(remoteBranch.Name().Short()),
    )
    refSpec := config.RefSpec(refSpecStr)
    log.Infof("Pushing %s", refSpec)
    err = repo.Push(&git.PushOptions{
        RemoteName: "mirror",
        Force:      true,
        RefSpecs:   []config.RefSpec{refSpec},
        Atomic:     true,
    })

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