Git, vimdiff и dirdiff

Я пытаюсь использовать vimdiff + dirdiff.vim, чтобы различать файлы Vim с версиями Git.

Для Mercurial это возможно с расширением mercurial extdiff.

Единственный способ, которым я нашел в Интернете интеграцию Vim с Git diff - использовать vimdiff в одном файле, как описано в этом сообщении.

Кто-нибудь знает, как использовать vimdiff + dirdiff + git?

Ответ 1

До git версия 1.7.11

git-diffall - это то, что мне нужно, большое спасибо. С помощью этой страницы о git difftool и этой one о запуске vim + dirdiff из командной строки, я написал свой $HOME/.gitconfig как:

[diff]
  tool = default-difftool

[difftool "default-difftool"]
  cmd = vim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)' $LOCAL $REMOTE

[difftool]
  prompt = false

После размещения git-diffall в моем PATH, я могу разделить, например, рабочий каталог с веткой dev с помощью:

git diffall dev

--copy-back - это то, что мне нужно, если я хочу постоянно изменять рабочий каталог из Vim:

git diffall --copy-back dev

Так как git версия 1.7.11

Поскольку версия 1.7.11, "git diffftool" узнал опцию "--dir-diff", которая упрощает вещи и git-diffall больше не требуется.

.gitconfig содержит:

[diff]
  tool = default-difftool
[difftool "default-difftool"]
  cmd = vim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)' $LOCAL $REMOTE '+syntax off'

И, например, рабочий каталог с веткой dev выполняется с помощью:

git difftool -d dev

Ответ 2

Тим Папа fugitive - это квинтэссенциальный git плагин для vim. Он может не иметь функциональности dirdiff, но он отлично интегрирует вывод git status, при этом сопоставления клавиш легко перемещаются между измененными файлами. Любые файлы, перечисленные в вашем выводе git status, могут быть легко различимы с отображением D, что позволяет настраивать точные изменения, внесенные в ваши изменения.

Ответ 3

Git не поддерживает дистрибутивы каталога напрямую, но это может быть сделано с сторонним расширением.

Отъезд git diffall (раскрытие: я написал это script). Этот script работает с набором инструментов, установленным git config diff.tool <TOOL>, для выполнения истинного diff каталога.

Также см. следующие вопросы:

Ответ 4

Было бы интересно следить за для модуля Vim для скрытых объектов, потому что, начиная с (git 1.7.11, июнь 2012 г.), git теперь могут создавать каталоги diff (т.е. отображать все файлы, которые нужно сравнить, перед тем, как открыть difftool)

См. "git difftool, чтобы сравнить каталог?"

Поэтому добавление этой функции в fugitive.vim будет эволюцией от подхода к файлу diff.

Однако Zyx указывает в комментарии пределы этого подхода:

Все, что вам нужно для этого:

  • git diff --name-status и
  • git cat-file,

ничего больше (кроме некоторого кода vimscript).
И, в отличие от git difftool, это работает для любого VCS с поддержкой vcs diff и vcs cat-file

Zyx упоминает в качестве примера того, что этот файловый файл использует свой проект aurum:

У моего aurum есть функция типа dirdiff (AuVimDiff full открывает кучу вкладок с просмотром vimdiff файлов с различиями) и никогда не использовала какую-либо поддержку difftool.

(см. script aurum / autoload / aurum / vimdiff.vim)

Zyx добавляет:

это не может быть хорошим руководством для человека, который хочет добавить эту функциональность в бегство:
Фактический вызов git diff --name-status скрыт внутри драйвера git в функции, вызванной s:git.status, доступ к которой используется как repo.functions.status (поскольку mercurial использует hg status -r rev1:rev2, а не hg diff --name-status, и я считаю это довольно логичным).
Таким образом, вы должны пройти три уровня абстракции здесь (интерфейс репозитория, оболочка команд оболочки и только тогда фактический вызов git).
С самого начала писать все с нуля