我有一个存储库,但是在某些情况下,本地文件可能会更改。我想做一个git pull并用git2go覆盖更改。在普通git中-即在终端上我可以做

git fetch --all
git reset --hard origin/master

因此,我试图使用git2go做同样的事情
func Pull(source string, dest string) error {
    repo, err:= git.OpenRepository(dest)
    remote, err:= repo.LookupRemote("origin")
    log.Println(repo) //print repo address

    cbs := &git.RemoteCallbacks{
        CredentialsCallback:      credentialsCallback,
        CertificateCheckCallback: certificateCheckCallback,
    }

    err = remote.SetCallbacks(cbs)
    err = remote.Fetch([]string{}, "")
    log.Println("fetch error: ", err) //print fetch error
    remote_master, err := repo.LookupReference("refs/remotes/origin/master")
    mergeRemoteHead, err := repo.AnnotatedCommitFromRef(remote_master)
    mergeHeads := make([]*git.AnnotatedCommit, 1)
    mergeHeads[0] = mergeRemoteHead
    err = repo.Merge(mergeHeads, nil, nil)
    log.Println("err: ", err)
    repo.StateCleanup() //print merge error
    return err
}

它可以正常编译,并且似乎可以运行-它记录错误,但是被覆盖的文件不会更改为远程文件。我觉得我缺少一个关键要素...../

我得到的输出是:
2015/05/19 20:40:15 GitHandler.go:44: &{0x7f46cc000a40}
2015/05/19 20:40:22 GitHandler.go:53: fetch error:  <nil>
2015/05/19 20:40:22 GitHandler.go:59: err:  <nil>

最佳答案

您要替换的git命令和您在go服务器中编写的代码用途完全不同。 merge 不能以任何方式模拟硬重置。

如果确实要 merge ,则应检查结果索引是否存在冲突,并在必要时解决它们。然后,您需要创建 merge 提交并更新当前分支。

如果要执行硬重置步骤,则需要将其写出,对目标树执行 checkout ,将目标树读入索引并将其写出,然后将当前分支更新为目标提交。

这些是非常不同的更新方法,其中一种保留本地提交,而另一种则不保留。一个创造历史,另一个创造历史。我建议先弄清楚您希望执行哪种更新形式。

关于git - Git2Go抓取或硬 pull ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30334749/

10-10 00:17