Многофункциональные инструменты
Я установил свой git для использования P4Merge в качестве инструмента diff, как описано здесь. Итак, git diff
вызовет P4Merge.
Однако иногда я считаю, что работа с UNIX diff
выполняется быстрее и эффективнее (потому что GUI не задействован). Как настроить git, чтобы я мог легко выбрать, какой инструмент diff я бы хотел вызвать? Это возможно? Например:
$ git diff # to trigger P4Merge
$ git difftool # to trigger UNIX diff
Мой git config --list
:
code.editor=vi
merge.tool=p4merge
mergetool.extMerge.cmd=extMerge $BASE $LOCAL $REMOTE $MERGED
mergetool.extMerge.trustexitcode=false
diff.external=extDiff
mergetool.prompt=false
mergetool.keepbackup=false
mergetool.p4merge.path=/usr/local/bin/p4merge
Ответы
Ответ 1
UPDATE:
Если вы используете OP, вы хотите сделать git difftool
вызывать функциональность diff по умолчанию вместо внешнего инструмента, тогда будет работать простая версия в конце этого ответа. Однако метод, который я предпочитаю и рекомендую, если вы просто хотите использовать несколько инструментов diff, - это метод файла .gitconfig, как описано в ответе DrStrangeprok.
В качестве внешнего инструмента редактирования вы можете установить следующий bash script.
(то есть: замените содержимое extDiff на него)
Это не так просто, как git diif1/git diff2, но он работает.
EDIT: см. Снизу для более простой версии
#!/bin/bash
# Parameters from git:
# 1 2 3 4 5 6 7
# path old-file old-hex old-mode new-file new-hex new-mode
CONTINUE=1
while [ $CONTINUE == 1 ]
do
# Present Options
echo "1. P4Merge"
echo "2. Unix diff"
echo "3. Cancel"
echo -n "Choose diff tool[1]: "
# Read in user choice
read -n 1 OPTION
# move down a line
echo ""
# if user didn't enter a choice default to 1
if [[ $OPTION == "" ]] ; then
OPTION="1"
fi
# Launch diff tool based on OPTION
case $OPTION in
1) /Applications/p4merge.app/Contents/MacOS/p4merge "$2" "$5" ; CONTINUE=0 ;;
2) diff "$2" "$5" ; CONTINUE=0 ;;
3) exit ;;
*) echo "\"$OPTION\" is not valid " ;;
esac
# This sleep has two purposes
# 1) on an invalid choice it delays the menu just a hair
# 2) keeps this script alive long enough that git will not just move onto the next file
# instantly if diffing multiple files.
sleep 1
done
Простая версия без меню
добавьте эту функцию в ваш .bashrc
если вы используете 'git difftool', тогда он будет использовать стандартный diff
function git {
if [[ $1 == "difftool" ]] ; then
git config --global --unset diff.external
command git diff
git config --global diff.external extDiff
else
command git "[email protected]"
fi
}
Ответ 2
Git может легко управлять визуальной и командной строкой diff. Никакой фантазии не требуется
Git diff (по умолчанию) использует unix diff
если вы хотите использовать визуальный инструмент для удаления, а правильный способ его настройки находится в вашем файле ~/.gitconfig
с таким разделом:
[difftool "Kaleidoscope"]
cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\"
Что происходит после того, как cmd =
является специфическим для вашего конкретного визуального различного приложения.
Нестандартная практика заключается в том, чтобы манипулировать git diff
для отправки контента в визуальное приложение. Таким образом, вопрос ищет ответ, который на 100% отстает от встроенных функций.
Подробнее см. git -difftool man.
Ответ 3
Вы можете просто указать, какой difffool вы хотите использовать. У меня это в моем ~/.gitconfig
:
[diff]
tool = vimdiff
[difftool "winmerge"]
name = WinMerge
trustExitCode = true
cmd = "/c/Users/rkasten/Google\\ Drive/Apps/WinMerge/WinMergeU.exe" -u -e $LOCAL $REMOTE
И у меня есть следующая настройка псевдонимов:
alias gdt='git difftool'
alias gdtw='git difftool --tool=winmerge'
Используя пример masukomi, вы можете просто добавить следующее в свой gitconfig:
[difftool "Kaleidoscope"]
cmd = ksdiff --whatevs
И используйте alias gdtk='git difftool --tool=Kaleidoscope'
для использования Калейдоскопа.
Все это работает в git 2.7.
Ответ 4
Было бы неплохо, если бы Git может каким-то образом иметь разные настройки для каждого, но если нет, чтобы развернуть ответ Appak, следующее добавленное к .bashrc
может вызывать текстовые diff, opendiff (FileMerge) или P4Merge diff
function git {
if [ $1 == "tdiff" ]
then
git config --global --unset diff.external
command git diff
elif [ $1 == "diff" ]
then
git config --global diff.external ~/bin/git-diff-opendiff
command git diff
elif [ $1 == "pdiff" ]
then
git config --global diff.external ~/bin/git-diff-p4diff
command git diff
else
command git "[email protected]"
fi
}
и просто убедитесь, что у вас уже установлены правильные git-diff-opendiff
и git-diff-p4diff
(это скрипты оболочки).
Ответ 5
Вы пишете
Однако иногда я нахожу работу с UNIX diff быстрее и более эффективный (потому что не задействован GUI). Как настроить git, чтобы я мог легко выбрать, какой инструмент diff я бы хотел вызвать?
Таким образом, ответ на этот вопрос должен просто использовать возможность git различать консольные и графические инструменты diff и не полагаться на запись внешней команды.
Предоставляя -g
опцию git difftool
, используемый инструмент diff будет считываться из сконфигурированной переменной diff.guitool
вместо diff.tool
.
[alias]
d = difftool -g
dc = difftool
[diff]
guitool = p4merge
tool = diff
Что это. Вы будете использовать свой инструмент gui p4merge
с помощью git d <file1> <file2>
или аналогичного и консольного инструмента с помощью git dc <file1> <file2>
.