我正在研究git的交互功能,其中对我来说最重要的是帅哥的 merge 和选择。它效果很好,但我需要大块头更小。使用源代码文件时, block 通常包含两个不相关的不同更改(通常彼此相距几行)。 这可能是因为 git 可以识别具有给定配置的 block ,例如分隔行、字符数量或类似的东西。
这是正确的吗?如果是,有什么方法可以更改/重新配置此行为吗?
非常感谢,
最佳答案
如果您指的是普通的 git diff
,则 block 上下文大小是可配置的:它是通过 -U
选项(如果指定)设置的,否则从您的 diff.context
设置(如果设置)。如果所有这些都失败,则默认为三行上下文(上方和下方)。
因此:
$ git config --global diff.context 1
将 diff 上下文减少到每个方向一行,而不是 3 行。还有一个 --inter-hunk-context
选项值,您可以使用它来将更多 block 融合在一起(这是与你想要的相反,所以我提到它只是为了完整性;请参阅 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
,答案是否定的,或者更确切地说,不做一点工作就不行。交互式 add 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
)模式需要添加此代码段。
当然,您可以在交互式添加期间简单地分割
(s
)一个 block ,如 pedrorijo91 reminded us in a comment链接到Can I modify git-add's hunk size? ,所以实际上没有必要这样做。不过,如果包含它可能会很好。
关于GIT:如何配置帅哥识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419193/