68

リポジトリのルート ディレクトリ以外の場所から git-bisect コマンドを実行しようとすると、次のように通知されます。

このコマンドは、作業ツリーの最上位から実行する必要があります。

何故ですか?この要件を持つ他の git コマンドを私は知りませんし、bisect が特別であるべき明確な理由もわかりません。man ページにも、この制限については言及されていません。

それは本当に大したことではありません。私は主に好奇心旺盛です。

4

3 に答える 3

65

プロジェクトのいくつかのコミットを見ると、Marcel M. Cary (marcel@oak.homeunix.org) によるものを見つけました。

彼はコミットで言っています(たまたまgit-pullについてですが、関連していると思います)

POSIX シェルには getcwd() とは異なる現在の作業ディレクトリの概念があるため、「git pull」は失敗します。シェルはこのパスを PWD に格納します。その結果、"cd ../" は、シェル スクリプトでは C プログラムの chdir("../") とは異なる方法で解釈される可能性があります。シェルは、基本的に PWD から最後のテキスト パス コンポーネントを取り除くことによって「../」を解釈しますが、C の chdir() は、ファイル システムの現在のディレクトリの「..」リンクに従います。PWD がシンボリック リンクの場合、これらは異なる宛先です。その結果、Git の C コマンドは正しいトップレベルの作業ツリーを見つけますが、シェル スクリプトは見つけません。

https://github.com/git/git/commit/08fc0608657ee91bc85276667804c36a93138c7d

その理由の一部は、git-bisect がシェル スクリプトであり、(シンボリック リンクが関係している場合) 単独でトップレベルを見つけることが信頼できないためだと思います。

于 2012-09-22T08:04:42.907 に答える
11

二等分プロセスでは、プロジェクトのさまざまなリビジョンをチェックアウトする必要があります。特定のリビジョンに現在のフォルダーが含まれていない場合、現在のフォルダーは削除されます。

その場合、シェルはファイルシステム上にないフォルダーに置かれてしまう可能性があります! Git はトップレベルの.gitフォルダーを見つけることができないため、バイセクト プロセスは介入なしでは続行できません。

デモンストレーション:

$ git rev-parse --show-toplevel
/path/to/project
$ mkdir tmp
$ cd tmp
$ rmdir ../tmp
$ git rev-parse --show-toplevel
fatal: Unable to read current working directory: No such file or directory

もちろん、これと同じ問題は実行時に発生する可能性がgit checkoutあり、事後に簡単に修正できますcd ..

しかし、二等分はプロセスであるため、開始する前にこの状況を回避することは理にかなっています。特に などの自動化を使用する場合はそうですgit bisect run

于 2016-08-15T02:06:27.617 に答える