Docker コンテナー内の Git ワークツリー ディレクトリ内で、error: unknown option `cached'
実行時にエラーが発生しますgit diff --cached
。
Git はバージョン 2.32.0 にあり、存在する必要があることを明確に示しています。
メインリポジトリに戻ってコンテナにマウントすると、コマンドは正常に機能します。
何が起きてる?
Docker コンテナー内の Git ワークツリー ディレクトリ内で、error: unknown option `cached'
実行時にエラーが発生しますgit diff --cached
。
Git はバージョン 2.32.0 にあり、存在する必要があることを明確に示しています。
メインリポジトリに戻ってコンテナにマウントすると、コマンドは正常に機能します。
何が起きてる?
したがって、問題は 2 つの側面に分かれていました。
git diff
他のほとんどの Git コマンドとは異なり、Git リポジトリ ツリーの外でも動作するように設計されています。これは、Git リポジトリが検出されたかどうかに応じて CLI インターフェイスを変更することで実現されます。
この変更 CLI インターフェイス ロジックは、「現在のリポジトリが有効でない場合は、非 Git CLI オプションを使用する」ようです。
この例では、現在のディレクトリを Docker コンテナーにバインド マウントしていました。現在のディレクトリが Git ワークツリーの場合、.git
ノードはメイン リポジトリへのパスを含む通常のファイルでした。ただし、そのリポジトリのパスはコンテナ内に存在しなかったため、Git は現在のディレクトリが「有効なリポジトリ」ではないgit diff
と判断し、オプションを足元から切り替えました。
.git
さらに、Git の検出は「見つかりましたが有効ではありません」というエラーを発生させたくないようで、そのような場合は黙って無視します。IRC チャネルのユーザーによるとgit diff
、現在のディレクトリが Git であることを強制的に期待する方法はありません。無効な場合はエラー。
いくつかの回避策がありますが、ほとんどは裏技です。それは演習として読者に任せます。
tl;drがファイル.git
(ワークツリー内にある) であり、そのファイルが指すディレクトリが存在しない場合、git
現在のディレクトリを非リポジトリとしてサイレントに処理し、git diff
設計されているためにCLI オプションを変更します。非リポジトリをサポートします (他のほとんどのgit
コマンドとは異なります)。