GIT:如何配置帅哥识别

标签 git diff config

我正在研究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-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-index 和 git diff-files 等则不然(故意的,这样应该使用管道命令而不是瓷器的脚本可以获得正确的无论新添加的选项如何,行为都会发生)。

这最终意味着,如果您具体指的是 git add --interactive,答案是否定的,或者更确切地说,不做一点工作就不行。交互式 add 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)模式需要添加此代码段。

当然,您可以在交互式添加期间简单地分割(s)一个 block ,如 pedrorijo91 reminded us in a comment链接到Can I modify git-add's hunk size? ,所以实际上没有必要这样做。不过,如果包含它可能会很好。

关于GIT:如何配置帅哥识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419193/

相关文章:

localization - 查找 .po 文件中的差异

php - 在 Symfony 中使用 config.php 和 doctrine.yaml 使用动态数据库名称

git - git diff hunk header 中的摘录来自哪里?

vim - 如何在Vim的diff模式下显示变化总数?

mercurial - 在公共(public) Mercurial 存储库中跟踪私有(private)文件的最佳方式是什么?

linux - bash 脚本没有在 nohup 中运行,但可以独立运行

python - 我可以大约多少钱。使用 dvc 减少磁盘体积?

android - 在下载 Android 源代码时,我得到的只是一堆空文件夹

git - .gitignore 中定义的一些文件和文件夹在推送到 GitHub 时不会被忽略

git - tfs 服务器上的身份验证失败