Xcode libgit2:如何在一个大块头中表演特定的台词
我正在编写一个mac应用程序,它只允许我将包含特定文本的行作为子字符串。基本上,我尝试构建源代码树为其用户提供的功能。将选定的行暂存到大块中。我的选择逻辑是,选择包含特定文本的行作为子字符串。但我不知道如何用libgit2实现这一点 我已经像这样初始化了回购协议Xcode libgit2:如何在一个大块头中表演特定的台词,xcode,atlassian-sourcetree,libgit2,git-patch,git-stage,Xcode,Atlassian Sourcetree,Libgit2,Git Patch,Git Stage,我正在编写一个mac应用程序,它只允许我将包含特定文本的行作为子字符串。基本上,我尝试构建源代码树为其用户提供的功能。将选定的行暂存到大块中。我的选择逻辑是,选择包含特定文本的行作为子字符串。但我不知道如何用libgit2实现这一点 我已经像这样初始化了回购协议 int error = git_repository_open(&repo, gitRepoString.UTF8String); 然后我创建一个到工作目录的diff索引,如下所示 error = git_diff_index
int error = git_repository_open(&repo, gitRepoString.UTF8String);
然后我创建一个到工作目录的diff索引,如下所示
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);
在这之后,我可以使用如下回调函数迭代每个大块头和每个大块头中的行
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允许通过本答案中给出的补丁实现这一点。
我最终手动实现了这一点。结果比我想象的要容易 我运用帅哥的方法:
- 将目标文件的行拆分为数组
- 从hunk收集“上下文”和“旧”行,并确保它们与现有内容匹配
- 收集“context”和“new”行,并替换mylines数组中的context/old部分
- 将数据写回,尝试匹配现有的行尾
我的代码在这里(在Swift中,使用Objective Git):目前还没有一种简单的方法可以做到这一点。我们的fork()中有一组补丁,它们增加了对部分补丁应用程序的支持。我想尽快把这些运到上游去。我会在提交后发布一个到PR的链接。顺便说一句,我不知道SourceTree是如何做到的,但我怀疑它不依赖libgit2功能。FWIW,我提交了一个pull请求()来启用部分修补程序。如果它被合并,我可以添加一个答案,解释如何使用它来实现单个帅哥和台词的登台。非常感谢@JasonHaslam,期待看到您的解决方案!