72

私はここ数年 Git を使用しておりgit diff、変更されたファイルの名前の前にa/b/. 最終的には便利なユースケースに出くわすだろうと思っていましたが、今までは常に面倒で役に立たなかった.

それは何のために良いですか?これがデフォルトで有効になっているのはなぜですか? どのような状況で役立ちますか?

4

5 に答える 5

54

diff の man ページで説明されているように、ソースと宛先を区別するためのプレフィックスa/b/表します。

実際には、次のオプションがあります。

--no-prefix

送信元または宛先のプレフィックスを表示しません。

--src-prefix=<prefix>

"a/" の代わりに、指定されたソース プレフィックスを表示します。

--dst-prefix=<prefix>

「b/」の代わりに指定された宛先プレフィックスを表示します

于 2011-07-20T16:08:15.820 に答える
20

これらのディレクトリプレフィックスは、基本的に互換性のためにあり、適切なデフォルトとして選択されています。説明は次のとおりです。

gitの前

git (およびその他のVCS ) が登場する前は、複数のファイルのパッチを作成するワークフローは、たとえば次のようになっていました。

  • asdfディレクトリにプロジェクトのソース コードがあるとしますasdf-source.latest
  • ディレクトリを新しいディレクトリにコピーします (たとえばasdf-source.new、理想的には内部のファイルをハードリンクします)。
  • これで、すべての変更を で行いasdf-source.new、コードのコンパイルやテストなどを試すことができます。
  • 完了したら、eg を使用してパッチを作成しますdiff -r asdf-source.latest asdf-source.new >new_feature.patch。出力も時間とともに進化しました。他のこととは別に、git はデフォルトで「統一された」出力を使用します。これは、diff の-uパラメーターを使用して取得される可能性があります。

これで、ディレクトリ名を使用して変更されたファイルへのパスがパッチに含まれていることがわかります。

パッチを適用する人 (またはビルド スクリプトなど) は、orpatchの代わりに を使用します。コマンドが適切なファイルを見つけるためには、パッチのオプションを使用してディレクトリ名をパスから削除する必要があります (N は、削除するディレクトリ名とセパレータの数を示します)。上記の場合、使用されるコマンドは. これにより、パッチの作成者が自分のディレクトリ名を使用できるようになります。git applygit am-pNpatch -p1 <new_feature.patch

多くのパッチを使用してプロジェクトにパッチを適用するスクリプトに遭遇した場合 (通常、Linux ディストリビューションの安定したパッケージ バージョンのバックポートパッチに使用されます)、パッチの形式が異なる場合があります。コマンドはこれらpatchの形式を適切に検出できますが、パス (削除するディレクトリの数) については少し難しくなります。それに関するいくつかの問題:

  • 開発者に 0 ディレクトリの使用を強制するのはあまり良いことではありません。
  • ファイルをpatch探すのは危険です (別のファイルが見つかる可能性があるため)。

したがって、適用可能なパッチを全員に送信してもらうpatch -p1のが最も賢明な方法のようです。

git に戻る

git が作成されたとき、そのようなオプションに適切なデフォルト (ほとんどのプロジェクトの提出ガイドライン、主にカーネルと互換性があります) が採用されました。これにより、git を使用して、適切な形式のパッチをpatch適用する人に送信したり、その逆を行ったりすることができます (git は、diff作成されたパッチも処理できます)。特にプレフィックスとして「a」と「b」を使用すると、すべての機能を維持しながら、スペース (および帯域幅のごく一部) を節約できます。

git config diff.mnemonicprefix true比較対象に応じて git が異なるプレフィックスを使用するように設定できます (詳細についてgit help configは、を参照してください)。

于 2013-12-04T08:33:39.690 に答える
5

出発地と目的地を区別するためです。より意味のあるものに変更することもできます。

--src-prefix=<prefix>

Show the given source prefix instead of "a/".

--dst-prefix=<prefix>

Show the given destination prefix instead of "b/".

http://git-scm.com/docs/git-diff

于 2011-07-20T16:09:25.803 に答える