Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode libgit2:如何在一个大块头中表演特定的台词_Xcode_Atlassian Sourcetree_Libgit2_Git Patch_Git Stage - Fatal编程技术网

Xcode 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

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

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

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,期待看到您的解决方案!