首頁 > 後端開發 > Golang > 主體

如何使用 go-git 將特定分支推送到遠端

WBOY
發布: 2024-02-09 09:12:20
轉載
962 人瀏覽過

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

php小編草莓為大家介紹如何使用 go-git 將特定分支推送到遠端。 go-git 是一個基於 Go 語言的開源函式庫,提供了一個簡單的方式來操作 Git 倉庫。推送特定分支到遠端倉庫可以讓團隊成員共享最新的程式碼,並保持程式碼庫的更新。在本文中,我們將詳細介紹使用 go-git 的步驟,幫助大家快速掌握這個實用工具。無論您是 Git 初學者還是有經驗的開發者,本文都將為您提供有用的指導。讓我們一起來學習如何使用 go-git 推送特定分支到遠端倉庫!

問題內容

使用 go-git 將特定單一本地分支推送到特定遠端的規範方法是什麼?

我簽出並使用 go-git 開啟本機儲存庫

repo, err := git.plainopen("my-repo")
登入後複製

該儲存庫具有預設的 origin 遠端。

我正在嘗試將此存儲庫的內容同步到另一個遠端 mirror,因此我添加了遠端

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

首先,我從 origin 取得儲存庫內容

#
err = remote.fetch(&git.fetchoptions{
                remotename: "origin",
                tags:       git.alltags,
            })
登入後複製

...並使用 remote.list() 發現所有感興趣的分支和標籤

最後一步是將分支推送到 mirror,同時根據映射重寫分支名稱。例如。 refs/remotes/origin/master 簽出為 refs/heads/master 應作為 main 推送到 mirror 遠端。因此,我正在迭代分支並嘗試將它們一一推送:

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 格式,例如此處

// 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
登入後複製

但是作為

"+refs/heads/localbranchname:refs/heads/remotebranchname"
登入後複製

相反。請參閱範例

    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,
    })
登入後複製

以上是如何使用 go-git 將特定分支推送到遠端的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!