1

我正在编写一个 mac 应用程序,它允许我仅将包含特定文本的行作为子字符串暂存。基本上,我尝试构建源树为其用户提供的功能。在大块中分期选定的行。我的选择逻辑是,选择包含特定文本的行作为子字符串。但我不知道如何使用 libgit2 来实现这一点。

我已经像这样初始化了回购

int error = git_repository_open(&repo, gitRepoString.UTF8String);

然后我正在为工作目录创建一个差异索引,如下所示。

error = git_diff_index_to_workdir(&diff, repo, NULL, NULL);

之后,我可以使用下面的回调函数遍历大块和每个大块中的行。

error = git_diff_foreach(diff, each_file_cb,
                                    each_binary_cb,
                                     each_hunk_cb,
                                     each_line_cb,
                                     &d);

并且为大块中的每一行调用回调。

int each_line_cb(const git_diff_delta *delta,
                 const git_diff_hunk *hunk,
                 const git_diff_line *line,
                 void *payload)
{
    return 0;
}

现在我意识到我需要以某种方式创建一个补丁,并且只将差异中的必要行添加到补丁中。

任何人都可以指导正确的方向吗?如果 libgit2 还不允许这样做,是否还有其他库可以让我这样做。atlassian 源代码树似乎也在后台使用 libgit2。他们怎么可能实现这一点?

顺便说一句,git CLI 允许通过此答案中给出的修补来做到这一点。 https://stackoverflow.com/a/32311872/569497

4

1 回答 1

3

我最终手动实现了这个。结果比我预期的要容易。

我申请大块的方法:

  • 将目标文件的行拆分为一个数组
  • 从大块中收集“上下文”和“旧”行,并确保它们与现有内容匹配
  • 收集“上下文”和“新”行,并替换我的行数组中的上下文/旧部分
  • 写回数据,尝试匹配现有的行尾

应该很容易适应只应用特定的行。

我的代码在这里(在 Swift 中,使用 Objective Git):https ://github.com/Uncommon/Xit/blob/369dd52d444d4650759c22414121dd2a6be282d2/Xit/XTDiffDelta.swift

于 2017-03-28T17:35:14.513 回答