Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-09 09:12:20
avant
962 Les gens l'ont consulté

如何使用 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")
Copier après la connexion

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"},
            })
Copier après la connexion

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,
            })
Copier après la connexion

...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,
            })
Copier après la connexion
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
Copier après la connexion

Mais comme 🎜
"+refs/heads/localbranchname:refs/heads/remotebranchname"
Copier après la connexion
🎜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,
    })
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!