私はここ数年gitを使用してきましたが、なぜgit diffが変更されたファイルの名前の前にa /およびb /を付けるのか疑問に思っていました。私は最終的にそれが役立つユースケースに出くわすと予想していましたが、今までそれはいつも迷惑で、決して役に立たなかった。
何がいいの?これがデフォルトで有効になっているのはなぜですか?どのような場合に役立ちますか?
diff man page で述べたように、a/et b /はソースと宛先を区別するためのプレフィックスを表します。
実際には、次のオプションがあります。
--no-prefix
ソースまたは宛先プレフィックスを表示しません。
--src-prefix=<prefix>
「a /」の代わりに、指定されたソースプレフィックスを表示します。
--dst-prefix=<prefix>
「b /」の代わりに指定された宛先プレフィックスを表示します
役に立たない場合は、次のコマンドで無効にできます。
git config --global diff.noprefix true
これらのディレクトリプレフィックスは基本的に互換性のためにあり、適切なデフォルトとして選択されています。次に説明します。
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
コマンドはこれらの形式を適切に検出できますが、パス(削除するディレクトリの数)は少し難しくなります。それに関するいくつかの問題:
patch
でファイルを探すことは危険な場合があります(別のファイルを見つける可能性があるため)。したがって、patch -p1
を使用して適用できるパッチを全員に送信させるのが、最も賢明な方法であると思われます。
Gitが作成されたとき、そのようなオプションには実用的なデフォルト(ほとんどのプロジェクトの提出ガイドライン(主にカーネル)と互換性があります)を採用しています。これにより、gitを使用して、適切にフォーマットされたパッチをpatch
を使用して適用するユーザーに送信したり、その逆を行ったりできます(gitはdiff
で作成したパッチも処理できます)。特にプレフィックスとして「a」と「b」を使用すると、すべてを機能させたまま、スペース(および帯域幅のごく一部)を節約できます。
git config diff.mnemonicprefix true
を設定して、比較対象に応じてgitが異なるプレフィックスを使用できるようにします(詳細については、git help config
を参照してください)。
ソースと宛先を区別することです。より意味のあるものに変更することもできます。
--src-prefix =
<prefix>
Show the given source prefix instead of "a/".
--dst-prefix =
<prefix>
Show the given destination prefix instead of "b/".
追加する場合はgit diff --no-prefix
を。gitconfigに手動で追加し、以下を追加します。
[diff]
noprefix = true