c - Git 作为存储后端

标签 c git storage wiki libgit2

<分区>

我想使用 Git 作为一堆文本文件(一个 wiki)的存储后端。看起来 libgit2 是完成这项工作的工具。我认为它让我跳过了拥有文件工作副本(在文件系统中)的步骤,从而实现了多个并发编辑。但我不清楚细节。我希望它像这样工作:获取文件的当前内容以及上次提交的 ID。 (我已经让这部分工作了。)让用户对内容进行更改。然后把内容写回去:

  1. 检查文件内容是否与上次提交不同。如果不是,则什么都不做。

  2. 检查是否有任何新的提交(基于相同的父提交)并尝试与它们 merge 。但是有冲突的分支也是可以接受的。

  3. 创建一个仅包含此文件新内容的新提交。

我什至不确定其中有多少需要手动完成,哪些由 libgit2 自动完成。例如,我可以从上次提交中检索文件内容并自己检查更改,但我怀疑有更简单的方法。为了实现这一点,我需要调用哪些相关函数?

最佳答案

这在很大程度上取决于您的应用程序的作用。如何处理并发编辑不是 Git 处理的事情。它住在上面一层。在用户 merge 工具的典型情况下,您要么必须将工作推送给用户,要么想办法在您的应用程序中处理冲突。

Check if the content of the file differs from the last commit. If not, do nothing further.

您可以在任意缓冲区和对象之间运行 diff。参见 git_diff_blob_to_buffer() .

Check if any new commits have been made (based on the same parent commit) and try to merge with them. But a conflicting branch is also acceptable.

merge API执行 merge 并检测 merge 基础(您可以使用它来判断是否存在任何分歧)。如果 merge 不成功,则由您决定如何操作。这些需要人工干预(或使用了解内容语义的不同 merge 算法)。

Create a new commit with only the new content of this file.

这很可能不是您想要的。 Git 中的提交是一个快照,因此您将删除所有其他文件。假设您想要的是更新特定文件的新提交,创建一个空索引并用基本提交的树填充它,更新条目并将索引写为树,您可以将其用于新提交。所有这些都可以在 index API 中找到.

有一些程序可以处理这方面的不同方面,例如 Gollum这是一个 git 支持的 wiki,SparkleShare这是一个 git 支持的文件同步工具和 Docurium它将文档直接写入分支中的新提交。

关于c - Git 作为存储后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20301315/

相关文章:

git - 私有(private) GIT 存储库是否可用于 Microsoft TFS?

django - 使用 nginx 在多台机器和硬盘驱动器上提供静态文件

php - 将用户上传的文档存储在phpmyadmin 中更好,还是将它们存储在文件夹中更好?

c - 如何使用 cmake 检测 c 源文件中的调试版本?

git - 如何配置 Git 从一个存储库 pull 并推送到另一个存储库?

git - 有点 git 麻烦

mysql - 如果相同的字符串存储在多行中,MYSQL 是否以最佳方式存储它?

c - 功能的可用性?

mysql - MySQL是如何实现事务的

c - 这个 C 代码如何工作,但另一个说需要 L 值?