代码之家  ›  专栏  ›  技术社区  ›  erikvold

是否可以使用winmerge从cygwin查看git差异?

  •  5
  • erikvold  · 技术社区  · 14 年前

    我喜欢在cygwin上使用git,但唯一的缺点是我想在什么时候使用 git difftool 我不能用任何有用的东西。 git diff 对我来说大多数时候都很好,但有时我想使用winmerge通过 git difftool工具

    1 回复  |  直到 14 年前
        1
  •  11
  •   Community CDub    8 年前

    对于cygwin来说 How can I configure Mercurial to use WinMerge for merges, under cygwin? “可应用于git(将以下winmerge脚本与旧问题组合时)” use Winmerge inside of Git to file diff ")

    #!/bin/sh
    "/cygdrive/c/Program Files/WinMerge/WinMergeU.EXE" /e /ub /dl other /dr local `cygpath -aw $1` `cygpath -aw $2` `cygpath -aw $3`
    

    过程

    你在这篇文章中有更多的细节” Git + WinMerge + Cygwin “(从 Thiru Thirunavukarasu
    (但我还是推荐 WinMergeU.exe (以上选项)

    将以下行添加到.gitconfig文件中:

      [diff]
        tool = winmerge
      [difftool "winmerge"]
        cmd = git-difftool-winmerge-wrapper.sh \"$LOCAL\" \"$REMOTE\"
      [difftool]
        prompt = false
    

    最后一个选择( prompt = false

    创建一个名为 git-difftool-winmerge-wrapper.sh 把它放在你的路上。
    PATH=${PATH}:${HOME}

    将以下内容添加到 git difftool winmerge-包装器.sh :

      #!/bin/sh
      echo "Launching WinMergeU.exe \"$(cygpath -aw "$1")\" \"$(cygpath -aw "$2")\""
      if [ -f "$1" -a -f "$2" ]
      then
        "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -u -wl -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
      else
        echo "skipping as one file doesn't exist"
      fi
    

    (同样,使用这些WinMerge选项进行一些测试)


    脚本

    如果您想对diff和merge git函数都使用“all WinMerge”,那么 gist page to follow ecerulm (Ruben Laguna)

    diffmerge-diff.sh

    #!/bin/sh
    # Use SourceGear DiffMerge as mergetool for git in cygwin.
    #   git config --global mergetool.diffmerge.cmd "diffmergetool.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
    #   git config --global mergetool.diffmerge.trustExitCode false
    #   git difftool -t diffmerge branch1..branch2
    
    # Reference: http://www.tldp.org/LDP/abs/abs-guide.pdf
    
    library=githelperfunctions.sh
    
    #[ -f $library ] && . $library
    . $library
    
    echo Launching DiffMerge.exe - diffmerge-diff.sh: 
    
    set_path_vars "$1" "$2" "$3" "$4"
    
    echo "$diffmergewinpath" -t1=FROM_VERSION -t2=TO_VERSION --caption=$caption $localwinpath $remotewinpath
    "$diffmergewinpath" -t1=FROM_VERSION -t2=TO_VERSION --caption="$caption" "$localwinpath" "$remotewinpath"
    

    diffmerge-merge.sh

    #!/bin/sh
    # Use SourceGear DiffMerge as mergetool for git in cygwin.
    #   git config --global mergetool.diffmerge.cmd "diffmergetool.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
    #   git config --global mergetool.diffmerge.trustExitCode false
    #   git mergetool -t diffmerge
    
    # Reference: http://www.tldp.org/LDP/abs/abs-guide.pdf
    
    library=githelperfunctions.sh
    
    #[ -f $library ] && . $library
    . $library
    
    echo Launching DiffMerge.exe - diffmerge-merge.sh: 
    
    set_path_vars "$1" "$2" "$3" "$4"
    
    "$diffmergewinpath" --merge -t1=FROM_VERSION -t2=MERGED -t3=TO_VERSION --result="$mergedwinpath" --caption="$caption" "$localwinpath" "$basewinpath" "$remotewinpath"
    
    unix2dos "$merged"
    

    githelperfunctions.sh

    # Helper functions
    
    
    convert_path () {
        file=$1
    
        if [ "$file" == '/dev/null' ] || [ ! -e "$file" ]
            then 
               file="/tmp/nulla"
               `echo "">$file`
        fi
        echo `cygpath -w -a "$file"`
    }
    
    
    set_path_vars () {
        local=$1
        remote=$2
        base=$3
        merged=$4
    
        echo ========= Cygwin paths =======
        echo "LOCAL   :  $local"
        echo "REMOTE  :  $remote"
        echo "BASE    :  $base"
        echo "MERGED  :  $merged"
    
        localwinpath=$(convert_path "$local")
        remotewinpath=$(convert_path "$remote")
        basewinpath=$(convert_path "$base")
        mergedwinpath=$(convert_path "$merged")
    
        echo ========= Win paths =======
        echo "LOCAL   :  $localwinpath"
        echo "REMOTE  :  $remotewinpath"
        echo "BASE    :  $basewinpath"
        echo "MERGED  :  $mergedwinpath"
    
        caption=`basename "$merged"`
        diffmergewinpath="C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe"
        winmergewinpath="C:/Program Files/WinMerge/WinMergeU.exe"
    #   diffmergewinpath=`cygpath -u C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe`
    #   winmergewinpath=`cygpath -u \"C:\Program Files\WinMerge\WinMergeU.exe\"`
    }
    

    winmerge-diff.sh

    #!/bin/sh
    # Use winmerge as mergetool for git in cygwin.
    #   git config --global difftool.winmerge.cmd "winmerge-diff.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\""
    #   git config --global mergetool.winmerge.trustExitCode false
    #   git difftool -t winmerge branch1..branch2   
    
    # Reference: http://www.tldp.org/LDP/abs/abs-guide.pdf
    # Reference: http://winmerge.org/docs/manual/CommandLine.html
    
    
    library=githelperfunctions.sh
    
    #[ -f $library ] && . $library
    . $library
    
    echo Launching winmerge.exe - winmerge-diff.sh: 
    
    set_path_vars "$1" "$2" "$3" "$4"
    
    "$winmergewinpath" /dl "LOCAL.$caption" /dr "TO_VERSION.$caption" "$localwinpath" "$remotewinpath" 
    

    winmerge-merge.sh

    #!/bin/sh
    # Use winmerge as mergetool for git in cygwin.
    #   git config --global mergetool.winmerge.cmd "winmerge-merge.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
    #   git config --global mergetool.winmerge.trustExitCode false
    #   git mergetool -t diffmerge
    
    # Reference: http://www.tldp.org/LDP/abs/abs-guide.pdf
    # Reference: http://winmerge.org/docs/manual/CommandLine.html
    
    library=githelperfunctions.sh
    
    #[ -f $library ] && . $library
    . $library
    
    echo Launching winmerge.exe - winmerge-merge.sh: 
    
    
    set_path_vars "$1" "$2" "$3" "$4"
    
    # -- use WinMergeU conflictFile
    "$winmergewinpath" "$mergedwinpath"