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

mefy6pfw  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(174)

使用go-git将特定单个本地分支推送到特定远程分支的规范方法是什么?

我使用go-git checkout 并打开了一个本地存储库

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

存储库具有默认的origin远程。
我正尝试将此存储库的内容同步到另一个远程mirror,因此我添加了远程

  1. repo.CreateRemote(&config.RemoteConfig{
  2. Name: "mirror",
  3. URLs: []string{"git@github.com:foo/mirror.git"},
  4. })

首先,我从origin获取存储库内容

  1. err = remote.Fetch(&git.FetchOptions{
  2. RemoteName: "origin",
  3. Tags: git.AllTags,
  4. })

...并使用remote.List()发现所有感兴趣的分支和标记
最后一步是将分支推送到mirror,同时基于Map重写分支名称。例如,refs/remotes/origin/master checkout 为refs/heads/master,应推送到mirror remote为main。因此,我正在迭代分支并尝试逐个推送:

  1. refSpec := config.RefSpec(fmt.Sprintf(
  2. "+%s:refs/remotes/mirror/%s",
  3. localBranch.Name().String(),
  4. // map branch names, e.g. master -> main
  5. mapBranch(remoteBranch.Name().Short()),
  6. ))
  7. err = repo.Push(&git.PushOptions{
  8. RemoteName: "mirror",
  9. Force: true,
  10. RefSpecs: []config.RefSpec{refSpec},
  11. Atomic: true,
  12. })

但这会导致git.NoErrAlreadyUpToDate,并且mirror遥控器上没有任何事情发生。

2guxujil

2guxujil1#

refSpec在将单个分支推送到远程时,NOT的格式应为+refs/heads/localBranchName:refs/remotes/remoteName/remoteBranchName,如下所示:

  1. // RefSpec is a mapping from local branches to remote references.
  2. ...
  3. // eg.: "+refs/heads/*:refs/remotes/origin/*"
  4. //
  5. // https://git-scm.com/book/en/v2/Git-Internals-The-Refspec
  6. type RefSpec string

而是作为

  1. "+refs/heads/localBranchName:refs/heads/remoteBranchName"

。请参阅示例:

  1. refSpecStr := fmt.Sprintf(
  2. "+%s:refs/heads/%s",
  3. localBranch.Name().String(),
  4. mapBranch(remoteBranch.Name().Short()),
  5. )
  6. refSpec := config.RefSpec(refSpecStr)
  7. log.Infof("Pushing %s", refSpec)
  8. err = repo.Push(&git.PushOptions{
  9. RemoteName: "mirror",
  10. Force: true,
  11. RefSpecs: []config.RefSpec{refSpec},
  12. Atomic: true,
  13. })
展开查看全部

相关问题