34

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

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

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

4

3 回答 3

32

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

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每次在调用工具之前都会提示(是/否),因此请使用-yswitch fordifftool或添加此配置选项以避免提示:

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'
于 2013-06-29T12:19:32.783 回答
3

为了扩展 Gurjeet Singh 的回答和 ca​​w 的colordiff评论,在 Windows 中,我做了以下操作将它们联系在一起:

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

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

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

  4. (cmd.exe) 编辑您的注册表环境变量(在开始菜单中搜索环境变量)并添加.PLPATHEXT(以及您在必要时bin/使用的任何内容)。PATH

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

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

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

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

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

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

编辑

我误认为寻呼机行为回来了。difftool为每个文件调用命令,因此您将获得每个文件的分页器,而不是每个差异都获得一个分页器输出。为了解决这个问题,您可能想要包装difftool -y一个脚本并将其整个输出传递给less

于 2017-02-28T15:51:13.607 回答
0

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

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>

于 2022-01-03T10:10:58.167 回答