web-dev-qa-db-ja.com

git diffの/ a / bプレフィックスの理由は何ですか

私はここ数年gitを使用してきましたが、なぜgit diffが変更されたファイルの名前の前にa /およびb /を付けるのか疑問に思っていました。私は最終的にそれが役立つユースケースに出くわすと予想していましたが、今までそれはいつも迷惑で、決して役に立たなかった。

何がいいの?これがデフォルトで有効になっているのはなぜですか?どのような場合に役立ちますか?

60
mkl

diff man page で述べたように、a/et b /はソースと宛先を区別するためのプレフィックスを表します。

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

--no-prefix

ソースまたは宛先プレフィックスを表示しません。

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

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

45
VonC

役に立たない場合は、次のコマンドで無効にできます。

git config --global diff.noprefix true
28
Will Sheppard

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

Gitの前

Git(および他の [〜#〜] vcs [〜#〜] )の前は、複数のファイルのパッチを作成するワークフローは、たとえば次のようになっていました。

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

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

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

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

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

したがって、patch -p1を使用して適用できるパッチを全員に送信させるのが、最も賢明な方法であると思われます。

Gitに戻る

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

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

14
nert

ソースと宛先を区別することです。より意味のあるものに変更することもできます。

--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

6
manojlds

追加する場合はgit diff --no-prefix。gitconfigに手動で追加し、以下を追加します。

[diff]
noprefix = true
4
arush436