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>

Другие вопросы по тегам