2012-04-02 9 views
7

.gitディレクトリにあるときに、どのコマンドが許可されているのか、どのコマンドが許可されていないのかは、いくつかの矛盾があるようです。例えばなぜいくつかのgitコマンドは.gitディレクトリで許可されていませんか?

git symbolic-ref HEAD 

または

git diff --staged 

は大丈夫です。

しかし

git diff 

または

git status 

はエラーメッセージを生成します。 fatal: This operation must be run in a work tree

さらに驚くべきことにgit stのように、上記の失敗のいずれかのコマンドのエイリアスを作成git statusなら、それは

すべての論理的な説明はありますか?そしてなぜ失敗したコマンドのエイリアスが突然それがエイリアスだからといって動作しますか?

答えて

3

論理的な説明があります。引数のコマンドは、作業ツリーを必要とし、.gitリポジトリにいるときは作業ツリーはなく、リポジトリファイルのみが存在するため、失敗しました。引数がの他のコマンドは、作業ツリーを必要としないため、成功しました。

+0

良い点。それは論理のようです。しかし、エイリアスの動作については説明していません。 –

+0

エイリアスとは何ですか? – GoZoner

+0

ダンクルス氏が言うように、いくつかのエイリアスはリポジトリの外で動作するかもしれませんが、それは依存するべきではなく、率直に言って危険なものです。 – GoZoner

1

何が起こっているのかを知るGitコミット(git wrapper: allow setup_git_directory_gently() be called earlierCall setup_git_directory() much earliergit --paginate: paginate external commands again)があります。組み込みコマンドとエイリアスのさまざまな動作は、組み込みコマンドが先にGit設定情報に到達する必要があった以前の問題に起因すると思われます。これはGitディレクトリと作業ツリーをレポ固有の設定にする必要がありました。

Gitソースをローカルに持っている場合は、git log --grep='setup_git_directory_gently'を実行して、気付いている動作に関連するコミットのリストを取得できます。別名は、彼らが行うように動作する理由については

Accept git aliases outside a git repositoryは説明する:

af05d67(setup_git_directory_gentlyで必ず設定* nongit_okを()、 2008-03-25)は、結果、もともと提出したパッチからの変更がありましたgitリポジトリの外部でエイリアスを無効にする場合は です。

それは一部の人々はgitの外で非インデックス差分(または gitリポジトリを必要としない任意のコマンド)を使用する $ HOME/.gitconfigに「alias.fubar =差分--color-単語を」使用したことが判明リポジトリにアクセスして、この変更によってそれらが壊れてしまいました。 これにより、このような使用法のサポートが復活します。

関連する問題