对于一个简单的实时编码环境,我正在编写一个 git add、commit 和 push 函数,当两个用户在文件的同一部分编码时,除了冲突的情况外,它工作正常。它正确执行冲突分析并加载结果:
// Live-Editor, Processing / Javascript
fill(130, 52, 130);
<<<<<<< HEAD
textSize(130);
=======
textSize(120);
>>>>>>> master
text( "𝄠",160, 100);
显示 git 风格的差异。但是当我在编辑器中进行更改并再次添加/提交/推送时,它会导致同样的冲突。就好像它没有“记住”冲突已经存在并再次出现。(与 git 命令行行为不同。)
这是我的代码(我去掉了错误处理以使其更短......)
// Add
repo, err := git.OpenRepository(dir)
index, err := repo.Index()
err = index.AddAll([]string{}, git.IndexAddDefault, nil)
err = index.Write()
treeId, err := index.WriteTreeTo(repo)
tree, err := repo.LookupTree(treeId)
// Commit
sig := &git.Signature{
Name: userName,
Email: userName + "@" + beego.AppConfig.String("userdata::emailserver"),
When: time.Now(),
}
var currentCommit *git.Oid
if firstCommit == true {
_, err = repo.CreateCommit("HEAD", sig, sig, message, tree)
} else {
currentBranch, err := repo.Head()
currentTip, err := repo.LookupCommit(currentBranch.Target())
currentCommit, err = repo.CreateCommit("HEAD", sig, sig, message, tree, currentTip)
}
remote, err := repo.LookupRemote("origin")
// Pull
if firstCommit == false {
// Pull possible changes from remote repo
err = remote.Fetch([]string{}, nil, "")
remoteBranch, err := repo.LookupReference("refs/remotes/origin/master")
annotatedCommit, err := repo.AnnotatedCommitFromRef(remoteBranch)
// Do the merge analysis
mergeHeads := make([]*git.AnnotatedCommit, 1)
mergeHeads[0] = annotatedCommit
analysis, _, err := repo.MergeAnalysis(mergeHeads)
if analysis&git.MergeAnalysisUpToDate == 0 && analysis&git.MergeAnalysisNormal != 0 {
err := repo.Merge([]*git.AnnotatedCommit{annotatedCommit}, nil, nil)
}
}
}
// Push
err = remote.Push([]string{"refs/heads/master"}, nil, sig, message)
我猜关键部分是在// Check for conflicts不知何故使 git 目录处于一种让我们执行相同分析的状态之后。我考虑过在用户进行更改并再次提交项目后不进行分析,但与此同时另一个用户可能已经更改了远程仓库中的某些内容。
如何用 git2go 处理此类冲突的好方法?
暮色呼如
相关分类