Heim >Backend-Entwicklung >Golang >So verschieben Sie einen bestimmten Zweig mithilfe von Go-Git in die Ferne

So verschieben Sie einen bestimmten Zweig mithilfe von Go-Git in die Ferne

WBOY
WBOYnach vorne
2024-02-09 09:12:201004Durchsuche

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

php-Editor Strawberry zeigt Ihnen, wie Sie mit go-git einen bestimmten Zweig auf die Fernbedienung übertragen. go-git ist eine Open-Source-Bibliothek, die auf der Go-Sprache basiert und eine einfache Möglichkeit zum Betrieb von Git-Repositorys bietet. Durch das Pushen eines bestimmten Zweigs in ein Remote-Repository können Teammitglieder den neuesten Code teilen und die Codebasis auf dem neuesten Stand halten. In diesem Artikel stellen wir die Schritte zur Verwendung von go-git im Detail vor, damit Sie dieses praktische Tool schnell beherrschen können. Egal, ob Sie Git-Neuling oder ein erfahrener Entwickler sind, dieser Artikel bietet Ihnen hilfreiche Anleitungen. Lassen Sie uns lernen, wie Sie mit go-git einen bestimmten Zweig in das Remote-Repository verschieben!

Frageninhalt

Was ist die kanonische Methode, um mit go-git eine bestimmte einzelne lokale Filiale an eine bestimmte Remote-Station zu verschieben?

Ich habe das lokale Repository ausgecheckt und mit go-git

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

Dieses Repository verfügt über eine Standard-origin-Remote.

Ich versuche, den Inhalt dieses Repositorys mit einer anderen Fernbedienung zu synchronisieren mirror, also habe ich die Fernbedienung hinzugefügt

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

Zuerst erhalte ich den Repository-Inhalt von origin

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

...und nutzen Sie remote.list(), um alle interessanten Branchen und Tags zu entdecken

Der letzte Schritt besteht darin, den Zweig auf mirror,同时根据映射重写分支名称。例如。 refs/remotes/origin/master 签出为 refs/heads/master 应作为 main 推送到 mirror zu verschieben und gleichzeitig den Zweignamen entsprechend der Zuordnung neu zu schreiben. Zum Beispiel. refs/remotes/origin/master ausgecheckt als refs/heads/master sollte als main auf die

Fernbedienung übertragen werden. Also iteriere ich die Zweige und versuche, sie einen nach dem anderen voranzutreiben:

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/remotebranchnameAber das führt zu git.noerralreadyuptodate und auf der Fernbedienung passiert nichts.

Problemumgehung

Beim Pushen eines einzelnen Zweigs an eine Fernbedienung sollte refspec nicht im Format +refs/heads/localbranchname:refs/remotes/remotename/remotebranchname vorliegen. z.B.

Hier:

// 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

Aber als 🎜
"+refs/heads/localbranchname:refs/heads/remotebranchname"
🎜Im Gegenteil. Siehe 🎜Beispiel🎜: 🎜
    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,
    })

Das obige ist der detaillierte Inhalt vonSo verschieben Sie einen bestimmten Zweig mithilfe von Go-Git in die Ferne. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen