Vimdiff и Git все сразу
Я использую vimdiff в качестве моего difftool с git.
Допустим, я изменил двенадцать файлов. Проблема в том, что иногда я бегу git diff
и вокруг четвертого или пятого файла я вижу что-то, что я хочу отредактировать / изменить. Иногда мне нужно сделать еще несколько изменений вне этого. Проблема в том, что я не могу просто :qa
и вернемся к взлому, потому что в vimdiff появилось еще шесть или семь различий. Это становится действительно утомительным для :qa
все эти файлы, не просматривая каждый раз, когда я хочу прервать git diff.
Есть ли способ установить vimdiff как difftool для git, чтобы все diff-файлы открывались в одном и том же экземпляре vim, например, в отдельных вкладках?
5 ответов
Вы можете использовать плагины vim, опубликованные здесь. Тогда вам просто нужно установить difftool:
[multidiff]
tool = vd -f
В качестве альтернативного приложения я бы предложил meld
, который покажет вам измененные файлы - вы можете выбрать только те файлы, которые вы хотите увидеть.
Смотрите скриншот здесь для примера.
В дополнение к Маркосу полезный комментарий, как третий (ручной вариант), если вы хотите использовать vimdiff
Я бы порекомендовал следующее meld
Стратегия в сценарии (возможно python
):
- использование
git diff-files --name-status
а такжеgit diff-index --name-status --cached HEAD
идентифицировать файлы, которые необходимо изучить. - Получить кэшированные версии этих файлов и поместить в
/tmp/
- Откройте все эти файлы - измененные файлы и их кэшированные версии - сразу в
vimdiff
- хотя, скорее всего, это невозможно в том смысле, в котором вы нуждаетесь - см. ниже.
Тем не менее, как vimdiff
Само собой, похоже, не обрабатывает сразу несколько вкладок различий. Я рекомендую одно из моих предложений выше.
Очень простой способ - добавить эту опцию в ваш файл ~/.gitconfig.
[difftool]
tool = vimdiff $LOCAL $REMOTE
prompt = true
Таким образом, перед каждым сравнением файлов вам будет предложено пропустить файл, ответив "нет", или прервать сравнение файлов с помощью Ctrl+C.
Пример:
$ git difftool
Viewing: 'file1.js'
Launch 'vimdiff' [Y/n]: y
2 files to edit
Viewing: 'file2.js'
Launch 'vimdiff' [Y/n]: n
Это то, что я использую. Требуется, чтобы вы использовали vim-fugitive
[alias]
dt = "!f() { vim -p $(git diff --name-only) +\"tabdo Gdiff $@\" +tabfirst; }; f"
git dt
затем откроет каждую пару различий в отдельной вкладке. затем :tabclose
закрыть одну пару, или :qa
выходить.
Есть гораздо более простое решение, которое еще не опубликовано.
Добавьте следующее в свой
~/.gitconfig
-
[difftool]
trustExitCode = true
Теперь ты можешь бежать
:cq
в любой момент во время процесса, чтобы перестать распространять другие файлы.
Я придумал следующий скрипт для достижения того же поведения, которое обеспечивает git difftoll + vimdiff, но с использованием вкладок:
#!/bin/bash
commit1=$1
commit2=$2
files=`git diff ${commit1} ${commit2} --name-only`
cmd="set nosplitright | set nobackup | set noswapfile"
EXE="| silent exe"
for f in $files; do
if [ -z "$commit2" ]; then
cmd+="$EXE ':tabnew $f'"
else
cmd+="$EXE ':tabnew | f <${commit2}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit2}:$f'"
fi
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':vnew | f <${commit1}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit1}:$f'"
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':windo diffth'"
done
cmd+="$EXE 'bd 1 | tabfirst'"
vim -c "$cmd"
Назовите это так:vimgd <commit1> <commit2>