我想使用Git作为一堆文本文件(维基)的存储后端。看起来libgit2是工作的工具。我认为它让我跳过了文件系统的工作副本(在文件系统中)的步骤,从而启用了几个并发编辑。但我不清楚细节。我希望它像这样工作:获取文件的当前内容以及上次提交的ID。 (我已经完成了这部分工作。)让用户对内容进行更改。然后写回内容:
检查文件内容是否与上次提交不同。如果没有,请不要再做任何事了。
检查是否有任何新的提交(基于相同的父提交)并尝试与它们合并。但是一个冲突的分支也是可以接受的。
仅使用此文件的新内容创建新提交。
我甚至不确定需要手动完成多少操作以及libgit2自动执行哪些操作。例如,我可以从上次提交中检索文件内容并自行检查更改,但我怀疑有一种更简单的方法。为实现这一目标,我需要调用哪些相关功能?
答案 0 :(得分:4)
这很大程度上取决于您的应用程序的功能。如何处理并发编辑不是Git处理的。它住在上面一层。在用户合并工具的典型情况下,您要么必须将工作推送给用户,要么找出应用程序中的方式来处理冲突。
检查文件的内容是否与上次提交不同。如果没有,请不要再做任何事了。
您可以在任意缓冲区和对象之间运行diff。请参阅git_diff_blob_to_buffer()。
检查是否有任何新的提交(基于相同的父提交)并尝试与它们合并。但是一个冲突的分支也是可以接受的。
有merge API执行合并并检测合并基础(您可以用它来判断是否存在任何分歧)。如果合并没有成功,那取决于你该怎么做。这些需要人工干预(或使用不同的合并算法来了解竞争的语义)。
仅使用此文件的新内容创建新提交。
这很可能不是你想要的。 Git中的提交是一个快照,因此,您将删除其他所有文件。假设您想要的是更新特定文件的新提交,创建一个空索引并用基础提交树填充它,更新条目并将索引写为树,您可以将其用于新提交。所有这些都在index API中提供。
有一些程序可以处理这方面的不同方面,例如Gollum是一个由git支持的wiki,SparkleShare是一个git支持的文件同步工具,Docurium它将文档直接写入分支中的新提交。