【问题标题】:How to perform case insensitive diff in Git如何在 Git 中执行不区分大小写的差异
【发布时间】:2013-06-29 12:08:44
【问题描述】:

git diff 不支持不区分大小写的文件比较。 Google 显示很少有人要求该功能,而且也只能与其他一些 git diff 开关结合使用,例如与 -G--color-words 结合使用。

我不关心其他开关,只要git diff 可以显示不区分大小写的差异。

由于我没有看到任何具体的问题,而且我在研究这个问题一个小时后找到了解决方案,所以我添加了这个问题和答案。

【问题讨论】:

标签: git diff case-insensitive


【解决方案1】:

解决方案是使用git difftool。通过以下配置命令,我可以添加一个名为 idiff 的自定义 diff 工具供 Git 使用:

git config --global difftool.idiff.cmd 'diff -i $LOCAL $REMOTE'

通过这种自定义,我可以看到不区分大小写的比较,如下所示:

git difftool --tool idiff <other diff options> <Git references or files>

例如。

git difftool -t idiff HEAD~1 -- my_schema.sql

由于git difftool 每次在调用该工具之前都会提示(是/否),请使用-y 切换difftool 或添加此配置选项以避免提示:

git config --global difftool.prompt 0

更新(2021 年 11 月 26 日):这是我使用的统一配置,它允许我使用 git idiff 命令,其行为方式几乎与 git diff 行为方式相同。

git config --global difftool.idiff.cmd 'diff --unified=3 --color=always --ignore-case $LOCAL $REMOTE | less --raw-control-chars'
git config --global difftool.prompt 0
git config --global alias.idiff 'difftool --tool idiff'

【讨论】:

  • 但是 git-gui 使用 'git diff' 而不是 'git difftool',所以 git-gui 仍然显示所有区分大小写的差异..
  • 您可以先安装colordiff(例如sudo apt-get install colordiff),然后将diff -i $LOCAL $REMOTE替换为diff -i -u $LOCAL $REMOTE | colordiff以获得彩色统一差异,即正常的Git样式。
  • 我为diff 命令git config --global difftool.idiff.cmd 'diff -i --unified --ignore-space-change --ignore-blank-lines --ignore-all-space $LOCAL $REMOTE' 添加了更多选项。有关其他选项的更多信息,请参阅man diff
  • 我试图将输出重定向到一个文件...但它一直挂着直到我做了git config --global difftool.prompt 0
  • 也可以将--color=always 作为选项添加到diff,而不是通过管道连接到colordiff(然后与less -r 一起使用进行分页)
【解决方案2】:

为了扩展 Gurjeet Singh 的 answer 和 caw 的 colordiff comment,在 Windows 中我执行了以下操作以将它们联系在一起:

  1. 如果需要,安装适用于 Windows 的 Strawberry Perl 发行版。任何 Windows Perl 发行版都应该可以工作,但 Strawberry Perl 是免费软件/开源软件,并附带电池。注意网站结果,因为有一个 NSFW 站点具有类似的域 IIRC。使用 Google 而不是猜测。

  2. 安装 MinGW/MSYS。适用于 Windows 的 Git 已经附带了 MSYS 的构建,因此您可以只使用它的 make,但您的里程可能会有所不同。

  3. 下载并安装colordiff Perl 脚本。我编辑了 Makefile 以将安装位置更改为~/bin~/etc(其中~%USERPROFILE%),因为~/bin 已经在我的PATH 中。根据需要进行调整。

  4. (cmd.exe) 编辑您的注册表环境变量(在开始菜单中搜索环境变量)并将.PL 添加到PATHEXT(以及您用于PATH 的任何bin/,如有必要)。

  5. (cmd.exe) 创建一个 bash 脚本(例如,~/bin/colordiffless.bash),将任何参数传递给colordiff.plcolordiff 接受差异选项并自动传递它们)并通过less 传递。 colordiff 输出的颜色代码是 ANSI,cmd.exe 不会理解,但 less 可以。您还可以通过这种方式恢复 Git 的寻呼机行为(必要时配置 LESS 环境变量)。

    #!/bin/bash
    colordiff.pl "$@" | less
    
  6. 像 Gurjeet 一样设置别名,但不是直接调用 diff,而是调用您的 bash 脚本。颜色代码输出是 ANSI,所以你需要一些东西来转换它们。我碰巧知道 MSYS less 会这样做,而且您还保留了 Git 的寻呼机行为!

    git config --global difftool.cldiff.cmd "colordiffless.bash -ui $LOCAL $REMOTE"
    

    (来自 cmd.exe,所以双引号是文字,$LOCAL$REMOTE 也是文字)

  7. 最后,为difftool 命令设置别名,这样您就可以键入单个自定义命令,而不是difftool 命令:

    git config --global alias.cldiff "difftool -y -t cldiff"
    

编辑

我弄错了寻呼机的行为回来了。 difftool 为每个文件调用命令,因此您将获得每个文件的分页器,而不是每个差异都获得一个分页器输出。为了解决这个问题,您可能希望将 difftool -y 包装在一个脚本中,并将其整个输出通过管道传输到 less

【讨论】:

    【解决方案3】:

    有点固定 - 补丁中不需要有无用的颜色:

    git config --global difftool.idiff.cmd 'diff --unified=3 --color=never --ignore-case $LOCAL $REMOTE | less --raw-control-chars'
    git config --global difftool.prompt 0
    git config --global alias.idiff 'difftool --tool idiff'
    

    然后应该可以从例如生成漂亮的HTML

    <!DOCTYPE html>
    <html lang="en-us">
      <head>
        <meta charset="utf-8" />
        <!-- Make sure to load the highlight.js CSS file before the Diff2Html CSS file -->
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.1/styles/github.min.css" />
        <link
          rel="stylesheet"
          type="text/css"
          href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"
        />
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
      </head>
      <script>
        function show(diffString) {
          var targetElement = document.getElementById('myDiffElement');
          var configuration = {
            drawFileList: true,
            fileListToggle: false,
            fileListStartVisible: false,
            fileContentToggle: false,
            matching: 'lines',
            outputFormat: 'side-by-side',
            synchronisedScroll: true,
            highlight: true,
            renderNothingWhenEmpty: false,
          };
          var diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
          diff2htmlUi.draw();
          diff2htmlUi.highlightCode();
        }
      </script>
      <body>
        <div id="myDiffElement"></div>
        <textarea onchange="show(this.value)" rows=30 cols=160></textarea>
      </body>
    </html>

    【讨论】:

    【解决方案4】:

    为了比较两个 Git 提交而不考虑大小写,我创建存档文件并使用外部工具比较文件内容 - 在本例中为 WinMerge(便携式):

    git archive 991f70fe --format=zip > Archive/arcL.zip
    git archive cffd466a --format=zip > Archive/arcR.zip
    WinMergePortable.exe /ignorecase /ignoreeol /m Full Archive/arcL.zip Archive/arcR.zip
    

    git archive master --format=zip > Archive/arcL.zip
    git archive master --format=zip --remote=ssh://user@192.168.1.2/volume1/git/Tools20 > Archive/arcR.zip
    WinMergePortable.exe /ignorecase /ignoreeol /m Full Archive/arcL.zip Archive/arcR.zip 
    

    最后一个命令打开显示差异的 GUI。

    【讨论】:

    • 创建提交档案对我来说似乎有点过于严厉了。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 2020-11-17
    • 2011-08-10
    • 2023-03-25
    • 2016-07-24
    • 2012-02-12
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多