Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menolak cawangan tertentu ke jauh menggunakan go-git

Bagaimana untuk menolak cawangan tertentu ke jauh menggunakan go-git

WBOY
WBOYke hadapan
2024-02-09 09:12:201000semak imbas

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

editor php Strawberry akan memperkenalkan anda cara menggunakan go-git untuk menolak cawangan tertentu ke alat kawalan jauh. go-git ialah perpustakaan sumber terbuka berdasarkan bahasa Go yang menyediakan cara mudah untuk mengendalikan repositori Git. Menolak cawangan tertentu ke repositori jauh membolehkan ahli pasukan berkongsi kod terkini dan memastikan pangkalan kod dikemas kini. Dalam artikel ini, kami akan memperkenalkan langkah menggunakan go-git secara terperinci untuk membantu anda menguasai alat praktikal ini dengan cepat. Sama ada anda baru menggunakan Git atau pembangun berpengalaman, artikel ini akan memberi anda panduan yang berguna. Mari belajar cara menggunakan go-git untuk menolak cawangan tertentu ke repositori jauh!

Kandungan soalan

Apakah cara berkanun untuk menolak cawangan tempatan tunggal tertentu ke alat kawalan jauh tertentu menggunakan go-git?

Saya mendaftar keluar dan membuka repositori tempatan menggunakan go-git

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

Repositori ini mempunyai origin alat kawalan jauh lalai.

Saya cuba menyegerakkan kandungan repositori ini ke alat kawalan jauh yang lain mirror, jadi saya menambah alat kawalan jauh

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

Pertama, saya mendapat kandungan repositori daripada origin

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

...dan gunakan remote.list() untuk menemui semua cawangan dan tag yang menarik

Langkah terakhir ialah menolak cawangan ke mirror,同时根据映射重写分支名称。例如。 refs/remotes/origin/master 签出为 refs/heads/master 应作为 main 推送到 mirror sambil menulis semula nama cawangan mengikut pemetaan. Contohnya. refs/remotes/origin/master ditandakan keluar kerana refs/heads/master harus ditolak ke

remote sebagai utama. Jadi saya mengulangi dahan dan cuba menolaknya satu demi satu:

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/remotebranchnameTetapi ini menghasilkan git.noerralreadyuptodate dan tiada apa yang berlaku pada alat kawalan jauh.

Penyelesaian

Apabila menolak satu cawangan ke alat kawalan jauh, refspec seharusnya tidak berada dalam format +refs/heads/localbranchname:refs/remotes/remotename/remotebranchname, cth.

Di sini:

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

Tetapi sebagai 🎜
"+refs/heads/localbranchname:refs/heads/remotebranchname"
🎜Sebaliknya. Lihat 🎜Contoh🎜: 🎜
    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,
    })

Atas ialah kandungan terperinci Bagaimana untuk menolak cawangan tertentu ke jauh menggunakan go-git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam