LibGit2 实现“git pull”

问题描述

我选择了以下拉取算法:

  1. 获取()
  2. 获取当前的头部提交
  3. 获取所有未合并的提交(实现取自此处:How can I check if pull is needed using libgit2 in c++?
  4. 从第 3.获取一个未合并的提交(它是最新的)
  5. 合并提交。从 LastFetchedCommit(第 4 步)到 headCommit(第 2 步)。

1-4 完美运行

我有 5 个问题:

git_merge_commits(&rezPointer,repo.pointer,commitFrom.pointer,commitInto.pointer,&mrgOptions)

我正在尝试拉取相对于本地存储库有 2 个额外提交的远程存储库。

错误

错误域=lib.git_index_write_tree 失败:写入树失败。索引文件未由现有存储库备份 Code=-1 “无法写入树。索引文件未由现有存储库备份” UserInfo={NSLocalizedDescription=无法写入树。索引文件未由现有存储库备份,NSLocalizedFailureReason=git_index_write_tree 失败。}

我做错了吗?

解决方法

这可能如 issue 2668

中所述

如果我调用 git_index_write_tree(),它会因写入树失败而失败。 The index file is not backed up by an existing repository

这就是 git_index_write_tree_to() 的用途。

但这不是关于裸与非裸,而是关于您是否向存储库索要索引,或者您是否创建了一个没有任何关联的索引。

有点像在 issue 5015 中,其中显式设置并使用了对索引的引用(没有错误消息):

    git_repository *src,*dst;                                                                                         
    git_index *index;
    git_oid id;
    
    git_libgit2_init();                                                                                                
    
    err = git_repository_open(&src,"src");                                                                            
    err = git_repository_open(&dst,"dst");
    err = git_repository_index(&index,src);

    err = git_index_write_tree_to(&id,index,dst);