Мне нравится использовать git на cygwin, но единственный недостаток, который у меня есть, - это когда я хочу git difftool
, я не могу использовать ничего полезного. git diff
в большинстве случаев мне подходит, но иногда я хотел бы использовать Winmerge для просмотра этих различий через git difftool
. Есть ли способ настроить это?
Можно ли использовать winmerge для просмотра различий git из cygwin?
Ответы (1)
Для cygwin вопрос SO "Как могу ли я настроить Mercurial для использования WinMerge для слияний в cygwin? "можно применить к git (при объединении следующего сценария winmerge со старым вопросом" использовать Winmerge внутри Git для файла 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 "(из Тиру Тирунавукарасу):
(но я все же рекомендую WinMergeU.exe
варианты, указанные выше)
Добавьте следующие строки в ваш файл .gitconfig:
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = git-difftool-winmerge-wrapper.sh \"$LOCAL\" \"$REMOTE\"
[difftool]
prompt = false
Последний вариант (
prompt = false
) не обязателен. Вы можете опустить его, если хотите, чтобы Git выводил запрос перед открытием каждого файла diff.Создайте файл с именем
git-difftool-winmerge-wrapper.sh
и поместите его на свой путь.
Я только что поместил его в свой домашний каталог. Вы можете изменить путь Cygwin по умолчанию, чтобы включить ваш домашний каталог, изменив файл .bash_profile (также в вашем домашнем каталоге) и добавивPATH=${PATH}:${HOME}
Добавьте в
git-difftool-winmerge-wrapper.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)
Скрипты
Если вы хотите использовать «все WinMerge», как для функций diff, так и для слияния git, у вас есть эта основная страница, на которую можно подписаться из 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"
if [ -f "$1" -a -f "$2" ]
, иначе тест не прошел; не уверен, зависит ли это от версии.
- person Chris; 08.03.2017