web-dev-qa-db-ja.com

hgまたはgitの2つのディレクトリ/プロジェクト全体の違いは?

元々CVSに保存されていたすべてのリビジョンのプロジェクトを継承しました。かなりの数の編集を行い、元のディレクトリで行ったすべての変更を、追加された新しいファイルと古いファイルに関して比較しようとしています。

ツリーdiffを実行できるhg/gitに何らかのユーティリティがありますか?つまり、新しく追加されたファイルと削除されたファイルの間にマークがあります、私はあまりにも多くを求めていますか?

48
meder omuraliev

git diffはまさにそれを行います。ただし、gitプロジェクトでのみ機能します。

hg diffsvn diffほとんどすべてのバージョン管理システムがディレクトリツリーを比較できます。

2
knittl

単にdiffパッチを作成する任意の2つのファイルまたはディレクトリからgitのdiff形式で派手なリポジトリのものやバージョン管理なし

git diff --no-index some/path other/path >> some_filename

Knittlの答えに対するJakubNarębskiのコメントは、答えを示唆していました...簡単にするために、それが完全なコマンドです。

>> partはファイルを作成し、出力をリダイレクトします。ファイルが不要で、コンソールに出力を出力してコピーできるようにする場合は、>> some_filenameパート。


コピーと貼り付けに便利なように、cdという名前の元のディレクトリ/ファイルと変更されたディレクトリaを含むディレクトリに既にbedしている場合は、次のようになります。

git diff --no-index a b >> patch
76
user568458

_git diff_ manpage から:

_git diff [--options] [--] [<path>...]_

[...]
パスが2つだけ指定され、少なくとも1つが追跡されていない場合、2つのファイル/ディレクトリを比較します。この動作は_--no-index_によって強制できます。


2つの異なるリポジトリで2つのバージョン(2つのタグ付きリリース、2つのブランチなど)を比較する場合は、Git Wikiの「2つのローカルリポジトリを比較する方法」の GitTips ページで説明されているトリックを使用できます。

あなたが1つのリポジトリ内にいて、2番目のリポジトリが_/path/to/repo_にあると仮定すると、そのGIT_DIRは/path/to/repo/.git_です。

_$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
   git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B
_

ここで、AとBは比較するリビジョンです。もちろん、上記の式でパスリミッターを指定することもできます。

説明:_GIT_ALTERNATE_OBJECT_REPOSITORIES_変数を使用して、gitコマンドで2つのリポジトリのオブジェクトデータベースを連結できます。 _git --git-dir=... rev-parse ..._は、_git-dir_オプションのパラメーターとして指定されたリポジトリ内の名前(拡張SHA-1式)を一意のSHA-1識別子に変換するために使用されます。 $( ... )コンストラクトは、指定されたコマンドの呼び出し結果をコマンドラインに配置します。 _git diff_は、2つのリビジョンを比較するために使用されます(1つは代替オブジェクトリポジトリからのものです)。

別の解決策は、_git remote add_(および_git fetch_)を使用して、指定されたリポジトリに他のリポジトリを単にimportすることです。その後、すべてをローカルに持ち、単一のリポジトリ内で比較を行うことができます。

22
Jakub Narębski

ツリーdiffを実行できるhg/gitのユーティリティがありますか... [s] oつまり、新しく追加されたファイルと削除されたファイルの間にマークがあります... [強調を追加]

はい。私たちはできる git diff別のディレクトリに対する現在のディレクトリおよび...

...追加、削除、および変更されたファイルにマークを付けます:

git diff --name-status --no-index ./ path/to/other/dir

...追加されたファイルのみを表示:

git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir

...削除されたファイルのみを表示:

git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir

...変更されたファイルのみを表示:

git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir

参照: https://git-scm.com/docs/git-diff

9
Shaun Luttin

私はあなたが何を望んでいるか本当に理解していませんが、diff -urあなたに十分ですか?バージョン管理のないディレクトリでも機能します。

7
Thiago Arrais

これはgit固有ではありませんが、Windowsの一般的なdiffユーティリティとして、 WinMerge が大好きです。

7
Andy West