如何让diff像git-diff一样工作?

时间:2011-01-31 23:27:47

标签: git diff git-diff

我喜欢git diff的输出格式。线条之间的变化的颜色和+ / -表示比GNU差异更容易阅读。

我可以在git repo之外使用git diff标志运行--no-index,它运行正常。但是,它似乎缺少--exclude选项,用于从递归diff中排除文件或子目录。

有没有办法让两全其美? (GNU差异的+-选项的颜色选项和git diff / --exclude格式)。

我已尝试使用colordiff,但我仍然更喜欢git diff的输出格式

14 个答案:

答案 0 :(得分:135)

我不知道如何做颜色,但这样做+/-而不是<>

diff -u file1 file2

答案 1 :(得分:81)

您还可以使用git diff --no-index -- A B(通过manpage)。

答案 2 :(得分:23)

  1. 安装colordiff

  2. 更新你的〜/ .colordiffrc(如有必要,首先复制/ etc / colordiffrc):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. colordiff -u file1 file2用于两个文件或colordiff -ruN path1 path2用于递归比较路径。

  4. 它不完全相同,但它非常接近。

答案 3 :(得分:15)

这是我建议的,而且非常接近

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff:您必须安装此功能
      在我的Mac上
    • brew install colordiff
    • 某些Mac上的
    • port install colordiff
    • Debian或Ubuntu上的
    • sudo apt-get install colordiff
    • 对于其他平台,请从the main pageGitHub下载源代码并关注the installation instructions
  • -R:这告诉Less显示颜色而不是原始代码。

我最终使用-w,因为我不想看到空白差异。

diff -w -u FILE1 FILE2 | colordiff | less -R

编辑:正如@Ciprian Tomoiaga在评论中所建议的那样,你可以将它作为一个函数并将它放在你的~/.bashrc文件中。

function gdiff () { diff -u $@ | colordiff | less -R; }

答案 4 :(得分:2)

您正在寻找colordiff

sudo apt-get install colordiff

答案 5 :(得分:2)

仅使用bashdifftputless,我们可以非常接近git diff的输出。但是,由于diff程序员的短视,会有一些显着的差异。

将以下Bash函数定义放在由您的用户帐户自动获取的某个文件中,并且您将能够从命令行访问该函数:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

此功能的工作原理如下:

  1. 最终,diff会被各种格式化选项调用,以指定文件中的更改将如何显示。
  2. tput用于将ANSI颜色代码插入到这些格式选项中。请注意,使用非ANSI终端时,您可能必须将tput setaf替换为tput setf
  3. diff的输出通过管道传输到less-R允许保留ANSI颜色。 -X阻止less在退出时清除屏幕。如果输出适合一个屏幕,-F会阻止less作为寻呼机运行。
  4. 如果第一个参数是@full,除了添加和删除的行之外,该函数还会显示所有未更改的行。
  5. 请注意此方法与git diff之间的以下区别:

    1. git diff报告围绕每项更改的三行背景。不幸的是,diff似乎抱怨并退出,如果您想指定上下文行数,同时还要同时指定格式选项。 (至少它在Mac OS X Yosemite中)。谢谢diff程序员。因此,您可以请求不围绕每个更改的上下文行,这是默认行为,或者您可以通过将@full指定为第一个参数来请求报告文件中所有未更改的行。
    2. 由于上下文行与git diff不同,此函数报告的行号也会与git diff报告的行号不同。
    3. 您可能会看到报告存在单行更改,这是正确的行为,但是当您更改的文件包含插入单个空行时会很烦人。我认为git diff通过其背景来更好地处理这个问题。如果您愿意,可以尝试将不同的选项传递给diff以更好地处理空格。

答案 6 :(得分:2)

根据Unix SE上的this answer,GNU --color自2016年末版本3.4起有-u个选项。与git diff一起应该足以模仿diff -u --color=always file1 file2 | less -r

的输出

--color

在管道中使用时,

always必须为autoless -R会关闭管道中的颜色。

我只在Windows上使用Git Bash尝试过此操作,其中less -r只会为大块的第一行着色。 df3=`is.na<-`(df2,is.na(df1)) df3 Col1 Col2 Col3 Col4 1 7 0 5 7 2 NA 8 NA 0 3 9 9 NA 2 在这种情况下为我修好了。

答案 7 :(得分:1)

将其放在.bashrc.zshrc

diff() { git diff --no-index "$1" "$2" | colordiff; }

要求:gitcolordiff应该事先安装。

用法:diff file1 file2

示例:for $ diff .tmux.conf .zshrc.pre-oh-my-zsh

diff function example

答案 8 :(得分:0)

另一个选择是从存储库外部执行它,因此git知道在文件之间进行区分。例如。 shell函数类似于:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

答案 9 :(得分:0)

使用colordiff

安装:

sudo apt-get install colordiff

用法:

colordiff -u file_one file_two

给出与git diff完全相同的差异。

答案 10 :(得分:0)

如果您没有colordiffgit diff,则可以通过vim获得颜色。

cdiff() { diff -u $@ | vim -R -; }

或者简单地

cdiff() { diff -u $@ | view -; }

答案 11 :(得分:0)

由于bat的着色效果很好,我已经测试了它是否也可以与diff一起使用,而且令人惊讶的是,它开箱即用地很好。

$ diff file1 file2 | bat$ diff -u file1 file2 | bat

所以我想您可以使下面的函数更高效:

function bdiff () { diff -u $@ | bat;}

答案 12 :(得分:0)

在debian 9中测试 diff -u --color=always file1 file2

答案 13 :(得分:-1)

我认为配置设置:

[color]
     ui = true

结合“diff”命令的--relative=<path>选项可以做你想要的。你试过吗?