GIT: 如何配置帅哥识别

GIT: how to configure the hunks recognition

我正在研究 git 交互功能,其中对我来说最重要的是帅哥合并和选择。它工作得很好,但我需要大块头变小。在处理源代码文件时,代码块通常包含两个不相关的不同更改(通常彼此相隔几行)。 这可能是因为 git 识别具有给定配置的大块头,例如分隔线,或字符数或类似的东西。

这是否正确?如果正确,是否有任何方法可以更改/重新配置此行为?

非常感谢,

如果您指的只是简单的 git diff,大块上下文大小是可配置的:它是通过 -U 选项设置的,如果指定的话,否则来自您的 diff.context 设置,如果设置。如果所有这些都失败了,默认是三行上下文(上面和下面)。

因此:

$ git config --global diff.context 1

将 diff 上下文在每个方向上减少到一行,而不是 3 行。还有一个 --inter-hunk-context 选项值,您可以使用它来将更多的块融合在一起(这与您想要的相反)我提到它只是为了完整性;请参阅 diff.interHunkContext,在 Git 2.12 及更高版本中可用;另请参阅 --function-context 又名 -W).

然而,git add --interactive 运行 git diff-filesgit diff-index 而不是普通的 git diff,并且 the git config documentation cleverly hides:

diff.autoRefreshIndex

       When using git diff to compare with work tree files, do not consider stat-only change as changed. Instead, silently run git update-index --refresh to update the cached stat information for paths whose contents in the work tree match the contents in the index. This option defaults to true. Note that this affects only git diff Porcelain, and not lower level diff commands such as git diff-files.

(粗体强调我的)。

虽然这里讨论的是 diff.autoRefreshIndex 设置,但它适用于 所有 可配置项:git diff 读取并遵守您的配置,但是 git diff-indexgit diff-files 等等没有(故意的,这样应该使用管道命令而不是瓷器的脚本无论新添加的选项如何,都可以获得正确的行为)。

这最终意味着,如果您具体指的是 git add --interactive,答案是否定的,或者更确切地说,不是没有一点工作。交互式添加 Perl 脚本使用管道命令,而不是瓷器 git diff,因此它必须自己获取和使用任何此类设置。它获取并使用您的diff.algorithmdiff.compactionHeuristic设置,但使用您的diff.context设置。

这样做很容易,但需要稍微修改 Git:

diff --git a/usr/local/libexec/git-core/git-add--interactive b/tmp/git-add--interactive
index 235fb88..ba001a1 100755
--- a/usr/local/libexec/git-core/git-add--interactive
+++ b/tmp/git-add--interactive
@@ -47,2 +47,3 @@ my $normal_color = $repo->get_color("", "reset");
 
+my $diff_context_size = $repo->config('diff.context');
 my $diff_algorithm = $repo->config('diff.algorithm');
@@ -753,2 +754,6 @@ sub parse_diff {
        }
+       if (defined $diff_context_size) {
+               my $Uarg = sprintf("-U%d", $diff_context_size);
+               splice @diff_cmd, 1, 0, "$Uarg";
+       }
        if ($diff_compaction_heuristic) {

(可能有更好的方法来设置 -U 参数;我的 Perl 很笨拙)。如果要遵守您的 diff.context 设置,交互式补丁(或 git add -p)模式需要添加此片段。

当然,您可以在交互式添加期间简单地 split (s) 一个 hunk,如 linking to Can I modify git-add's hunk size?,因此没有真正需要这样做。不过,如果包含它可能会很好。