【问题标题】:GIT: how to configure the hunks recognitionGIT:如何配置帅哥识别
【发布时间】:2017-03-18 01:58:12
【问题描述】:

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

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

非常感谢,

【问题讨论】:

标签: git diff config


【解决方案1】:

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

因此:

$ git config --global diff.context 1

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

但是,git add --interactive 运行 git diff-filesgit diff-index 而不是普通的 git diff,以及 the git config documentation cleverly hides

diff.autoRefreshIndex

       使用 git diff 与工作树文件进行比较时,不要将仅统计更改视为已更改。相反,静默运行git update-index --refresh 以更新工作树中的内容与索引中的内容匹配的路径的缓存统计信息。此选项默认为 true。 请注意,这仅影响 git diff Porcelain,而不影响较低级别的 diff 命令,例如 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 很笨拙)。交互式补丁(或git add -p)模式需要添加这个sn-p才能遵守你的diff.context设置。

当然,您可以在交互式添加过程中简单地split (s) 一个大块,因为pedrorijo91 reminded us in a comment 链接到Can I modify git-add's hunk size?,所以没有真正需要这个。不过,如果包含它可能会很好。

【讨论】:

猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2013-07-26
  • 2020-04-29
  • 2021-09-15
  • 1970-01-01
  • 2022-12-08
相关资源
最近更新 更多