23

Git でバージョン管理された Vim 内の複数のファイルを比較するために、vimdiff+ dirdiff.vimを使用しようとしています。

Mercurial の場合、mercurial extdiff拡張で可能です。

Vim を Git diff と統合するために Web で見つけた唯一の方法は、この投稿で説明されているように、単一のファイルで vimdiff を使用することです。

vimdiff + dirdiff + gitの使い方を知っている人はいますか?

4

4 に答える 4

18

git バージョン 1.7.11 より前

git-diffall私が必要としているものです、どうもありがとう。git difftool に関するこのページ、コマンド ラインからの 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 myを入れた後 PATH、たとえば作業ディレクトリとブランチdevを次のように比較できます。

git diffall dev

これ--copy-backは、Vim から永続的に作業ディレクトリを変更する場合にも必要です。

git diffall --copy-back dev

git バージョン 1.7.11 以降

バージョン1.7.11以降、「git difftool」は「--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
于 2011-11-17T08:13:05.563 に答える
6

Tim Pope's fugitiveは、vim の典型的な git プラグインです。dirdiff の機能はないかもしれませんが、git status出力を美しく統合し、変更されたファイル間を簡単にナビゲートするためのキー マッピングを備えています。出力にリストされているファイルgit statusは、マッピングと簡単に比較でき、変更に含まDれる正確な変更をカスタマイズできます。

于 2011-11-16T18:43:45.530 に答える
2

( git 1.7.11、2012 年 6 月) 以降、git はディレクトリを比較できるようになったため (つまり、 を開く前に、比較するすべてのファイルを表示します) 、 Vim モジュール fugitiveのコミットを監視することは興味深いでしょう。difftool

git difftool「ディレクトリを比較するには?」を参照してください。

したがって、その機能を に追加することfugitive.vimは、ファイルからファイルへの差分アプローチからの進化になります。

ただし、Zyxはコメントでそのアプローチの限界を指摘しています。

これを機能させるために必要なのは次のとおりです。

  1. git diff --name-status
  2. git cat-file

それ以上はありません (一部のvimscriptコードを除く)。
そして、 とは異なり、これは vcsおよび vcsをサポートするgit difftoolすべての VCS で機能します。diffcat-file

Zyx は、そのファイルごとのアプローチの例として、彼のプロジェクトaurumについて言及しています。

私のオーラムにはdirdiffのような機能があり(違いのあるファイルを表示AuVimDiff fullするタブの束を開きますvimdiff)、いかなる種類のdifftoolサポートも使用しませんでした。

(スクリプトを参照aurum / autoload / aurum / vimdiff.vim)

Zyx は次のように付け加えます。

この機能を逃亡者に追加したい人にとっては、良いガイドにはなりません:
実際の呼び出しは、アクセスされた asgit diff --name-statusによって呼び出される関数の git ドライバー内に隠されています(mercurial は を使用していないため、これはかなり論理的だと思います)。 したがって、ここでは 3 つのレベルの抽象化をトラバースする必要があります (リポジトリ インターフェイス、シェル コマンド ラッパー、そして実際の git 呼び出しのみ)。 最初から全部書いた方が早いs:git.statusrepo.functions.statushg status -r rev1:rev2hg diff --name-status

于 2012-06-18T16:48:36.733 に答える
2

Git はディレクトリの差分を直接サポートしていませんが、サード パーティの拡張機能を使用して実行できます。

チェックアウトしてくださいgit diffall(開示:私はこのスクリプトを書きました)。このスクリプトは、によって設定されたツールと連携してgit config diff.tool <TOOL>、真のディレクトリ差分を実行します。

また、次の関連する質問も参照してください。

于 2011-11-16T18:42:57.037 に答える