How to get diff working like git-diff?

前端 未结 14 2226
慢半拍i
慢半拍i 2020-12-12 10:42

I like the output formatting of git diff. The color and the +/- representation of changes between lines is easier to read than GNU di

相关标签:
14条回答
  • 2020-12-12 10:53

    You are looking for colordiff:

    sudo apt-get install colordiff
    
    0 讨论(0)
  • 2020-12-12 10:57

    The other option is to do it from outside the repository so git knows to diff between files. eg. a shell function something like:

    gdiff() {
        (
            dir=`pwd`
            cd ./$(git rev-parse --show-cdup)/..
            git diff  $dir/$1 $dir/$2
        )
    }
    
    0 讨论(0)
  • 2020-12-12 11:00

    Since bat has nice colorizing, I've tested if that works with diff too and surprisingly it worked really well out of the box.

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

    So I suppose you could make a function like this below to be more efficient:

    function bdiff () { diff -u $@ | bat;}
    
    0 讨论(0)
  • 2020-12-12 11:05

    I think the config setting :

    [color]
         ui = true
    

    combined with "diff" command's --relative=<path> option would do what you wanted. Did you try ?

    0 讨论(0)
  • 2020-12-12 11:06

    I don't know how to do color but this will do the +/- rather than < and >.

    diff -u file1 file2
    
    0 讨论(0)
  • 2020-12-12 11:06

    Using only bash, diff, tput, and less, we can closely approximate the output of git diff. There will be some notable differences, though, due to the short-sightedness of the diff programmers.

    Put the following Bash function definition in some file that gets sourced automatically by your user account, and you'll be able to access the function from the command line:

    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
    }
    

    This function works as follows:

    1. Ultimately, diff gets invoked with various formatting options to specify how changes within the files will be displayed.
    2. tput is used to insert ANSI color codes into those formatting options. Note that when using non-ANSI terminals, you may have to replace tput setaf with tput setf.
    3. The output of diff is piped into less. -R allows ANSI colors to be preserved. -X prevents less from clearing the screen upon exiting. -F prevents less from operating as a pager if the output fits within one screen.
    4. If the first parameter is @full, the function will display all unchanged lines in addition to added and removed lines.

    Note the following differences between this approach and git diff:

    1. git diff reports three lines of context surrounding each change. Unfortunately, diff seems to complain and exit if you want to specify the number of context lines while also simultaneously specifying formatting options. (At least it does in Mac OS X Yosemite). Thanks diff programmers. Therefore, you can either request no lines of context surrounding each change, which is the default behavior, or you can request that all unchanged lines within the file are also reported, by specifying @full as the first parameter.
    2. Because the lines of context are different from git diff, the line numbers reported by this function will also vary from those reported by git diff.
    3. You may see the presence of single-line changes reported, which is the correct behavior, but annoying when your changed file contains the insertion of single empty lines. I think git diff deals with this better, via its lines of context. You could try passing different options to diff to better deal with whitespace, if you prefer.
    0 讨论(0)
提交回复
热议问题