libgit2:如何在大块中暂存特定行
libgit2: how to stage particular lines in a hunk
我正在编写一个 mac 应用程序,它将允许我仅暂存包含特定文本作为子字符串的行。基本上,我尝试构建源代码树为其用户提供的功能。在大块头中暂存 selected 行。我的 selection 逻辑是 select 包含特定文本作为子字符串的行。但我无法弄清楚如何使用 libgit2.
实现这一点
我已经像这样初始化了 repo
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);
并且正在为 hunk 中的每一行调用回调。
int each_line_cb(const git_diff_delta *delta,
const git_diff_hunk *hunk,
const git_diff_line *line,
void *payload)
{
return 0;
}
现在我意识到我需要以某种方式创建一个补丁,并只将 diff 中必要的行添加到补丁中。
任何人都可以指导正确的方向吗?如果 libgit2 还不允许这样做,是否有任何其他库可以让我这样做。 Atlassian 源代码树似乎也在后台使用 libgit2。他们是如何实现的?
顺便说一句,git CLI 允许通过此答案中给出的补丁来做到这一点。
我最终手动实现了这个。结果比我想象的要容易。
我申请帅哥的方法:
- 将目标文件的行分割成一个数组
- 从大佬那里收集"context"和"old"行,并确保它们与现有内容相匹配
- 收集 "context" 和 "new" 行,并替换我的行数组中的 context/old 部分
- 写回数据,尝试匹配现有的行结尾
应该很容易适应仅应用特定行。
我的代码在这里(在 Swift 中,使用 Objective Git):https://github.com/Uncommon/Xit/blob/369dd52d444d4650759c22414121dd2a6be282d2/Xit/XTDiffDelta.swift
我正在编写一个 mac 应用程序,它将允许我仅暂存包含特定文本作为子字符串的行。基本上,我尝试构建源代码树为其用户提供的功能。在大块头中暂存 selected 行。我的 selection 逻辑是 select 包含特定文本作为子字符串的行。但我无法弄清楚如何使用 libgit2.
实现这一点我已经像这样初始化了 repo
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);
并且正在为 hunk 中的每一行调用回调。
int each_line_cb(const git_diff_delta *delta,
const git_diff_hunk *hunk,
const git_diff_line *line,
void *payload)
{
return 0;
}
现在我意识到我需要以某种方式创建一个补丁,并只将 diff 中必要的行添加到补丁中。
任何人都可以指导正确的方向吗?如果 libgit2 还不允许这样做,是否有任何其他库可以让我这样做。 Atlassian 源代码树似乎也在后台使用 libgit2。他们是如何实现的?
顺便说一句,git CLI 允许通过此答案中给出的补丁来做到这一点。
我最终手动实现了这个。结果比我想象的要容易。
我申请帅哥的方法:
- 将目标文件的行分割成一个数组
- 从大佬那里收集"context"和"old"行,并确保它们与现有内容相匹配
- 收集 "context" 和 "new" 行,并替换我的行数组中的 context/old 部分
- 写回数据,尝试匹配现有的行结尾
应该很容易适应仅应用特定行。
我的代码在这里(在 Swift 中,使用 Objective Git):https://github.com/Uncommon/Xit/blob/369dd52d444d4650759c22414121dd2a6be282d2/Xit/XTDiffDelta.swift