我有一个存储库,但在某些情况下,本地文件可能会被更改。我想做一个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>
答案 0 :(得分:3)
您要替换的git命令和您编写的代码在服务器上的用途非常不同。合并无法以任何方式模拟硬重置。
如果您确实想要合并,则应检查生成的索引是否存在冲突,并在必要时解决它们。然后,您需要创建合并提交并更新当前分支。
如果您想要执行硬重置的步骤,则需要将其写出来,执行目标树的检出,将目标树读入索引并将其写出,然后更新当前分支到目标提交。
这些非常不同的更新方法,其中一种保留本地提交,另一种则不保留。一个创造历史,另一个没有。我建议首先弄清楚您希望执行哪种更新形式。