英文:
Git2Go Fetch or Hard Pull
问题
我有一个代码库,但在某些情况下,本地文件可能会发生更改。我想使用git2go执行git pull并覆盖更改。在普通的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) //打印repo地址
cbs := &git.RemoteCallbacks{
CredentialsCallback: credentialsCallback,
CertificateCheckCallback: certificateCheckCallback,
}
err = remote.SetCallbacks(cbs)
err = remote.Fetch([]string{}, "")
log.Println("fetch error: ", err) //打印fetch错误
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() //打印合并错误
return err
}
它可以正常编译,并且似乎运行正常-它将错误记录为<nil>
,但被覆盖的文件不会更改为远程文件的内容。我觉得我可能漏掉了一个关键要素...。
我得到的输出是:
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>
英文:
I have a repository, however in some situations the files locally may get changed. I want to do a git pull and over write the changes with git2go. In normal git - i.e on the terminal I could do
git fetch --all
git reset --hard origin/master
I am therefore trying to do the same using 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
}
It compiles fine, and seems to run - it logs the error to be <nil> however the overwritten files don't change to what they are remotely. I feel I am missing one key element...../
The output I get is:
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
得分: 3
你想要替换的git命令和你正在编写的Go服务器代码有非常不同的目的。通过合并无法以任何方式模拟硬重置。
如果你确实想要合并,你应该检查结果索引是否存在冲突,并在必要时解决它们。然后你需要创建合并提交并更新当前分支。
如果你想要执行硬重置的步骤,那么你需要将这些步骤写出来,执行目标树的检出,将目标树读入索引并写出,然后将当前分支更新到目标提交。
这些是非常不同的更新方法,其中一个保留了本地提交,另一个则没有。一个创建历史记录,另一个则没有。我建议首先确定你希望执行哪种形式的更新。
英文:
The git commands you want to replace and the code you're writing in go server very different purposes. A hard reset cannot be simulated in any way by a merge.
If you do want to merge, you should check the resulting index for conflicts and resolve them if necessary. You then need to create the merge commit and update the current branch.
If what you want is to do the steps of a hard reset, then you need to write those out, perform a checkout of your target tree, read the target tree into the index and write that out, and then update the current branch to the target commit.
These are very different approaches to updates, one of them preserves local commits, the other one doesn't. One creates history, the other one doesn't. I would recomment first figuring out which form of update you wish to perform.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论