Git2Go获取或硬拉

时间:2015-05-19 19:42:50

标签: git go libgit2

我有一个存储库,但在某些情况下,本地文件可能会被更改。我想做一个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>

1 个答案:

答案 0 :(得分:3)

您要替换的git命令和您编写的代码在服务器上的用途非常不同。合并无法以任何方式模拟硬重置。

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

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

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