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