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-files
或 git 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-index
和 git diff-files
等等没有(故意的,这样应该使用管道命令而不是瓷器的脚本无论新添加的选项如何,都可以获得正确的行为)。
这最终意味着,如果您具体指的是 git add --interactive
,答案是否定的,或者更确切地说,不是没有一点工作。交互式添加 Perl 脚本使用管道命令,而不是瓷器 git diff
,因此它必须自己获取和使用任何此类设置。它获取并使用您的diff.algorithm
和diff.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?,因此没有真正需要这样做。不过,如果包含它可能会很好。
我正在研究 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-files
或 git 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-index
和 git diff-files
等等没有(故意的,这样应该使用管道命令而不是瓷器的脚本无论新添加的选项如何,都可以获得正确的行为)。
这最终意味着,如果您具体指的是 git add --interactive
,答案是否定的,或者更确切地说,不是没有一点工作。交互式添加 Perl 脚本使用管道命令,而不是瓷器 git diff
,因此它必须自己获取和使用任何此类设置。它获取并使用您的diff.algorithm
和diff.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,如