Maison >développement back-end >Golang >Comment pousser une branche spécifique vers un site distant à l'aide de 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 !
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
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/remotebranchname
Mais cela entraîne git.noerralreadyuptodate
et rien ne se passe sur la 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 stringMais 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!