libgit2(获取 & 合并 & 提交)

Mic*_*kis 5 libgit2

我正在尝试从 libgit2 的 repo 中提取。

我的步骤是这些:

  • git_remote_connect - 好的
  • git_remote_download 还是我应该使用 git_remote_fetch ?
  • git_remote_ls 获取 HEAD 的传递给 git_annotated_commit_from_fetchhead (这是 coorect 吗?)。但是有 1 个以上的头,我可以通过带有“HEAD”名称的头吗?
  • git_merge。

这导致 .git 文件夹中的 MERGE_HEAD ,然后我可以与现有提交合并。

问题是,上面的顺序是否正确?为什么 git 创建 FETCH_HEAD 而 libgit2 有 MERGE_HEAD?

Edw*_*son 6

您可能想要使用git_remote_fetch,而不是git_remote_downloadfetch是一个方便的函数,它执行下载更新诸如远程跟踪分支之类的东西,以指向服务器上的数据——对你来说更重要的是——FETCH_HEAD文件。

您可以git_merge通过检查FETCH_HEAD行并识别标记为 的分支来确定要馈送到哪个分支not-for-merge。最简单的方法是使用git_repository_fetchhead_foreach. 将为每一行调用您的回调,您只需记下for_merge设置为 的那个true。标记为的分支for-merge将是与merge配置中的行相对应的远程分支。

也就是说,如果您HEAD指向master,并且您的配置是:

[branch "master"]
    remote = origin
    merge = refs/heads/master
Run Code Online (Sandbox Code Playgroud)

然后,当您从 获取时origin,相应的远程master分支将被标记为for-merge。一旦你确定了这个FETCH_HEAD条目,你就可以从它创建一个带注释的提交并调用git_merge.

请注意,git core 和 libgit2 将FETCH_HEAD在获取MERGE_HEAD时创建s,在合并时创建s 。您只会在合并正在进行时看到后者 - 因此,如果您merge --no-commit在命令行上运行或遇到冲突。您可以使用它来比较 git core 生成的数据,以确保您使用 libgit2 生成相同的数据。