リポジトリのルートディレクトリ以外の場所からgit-bisectコマンドのいずれかを実行しようとすると、次のように通知されます。
このコマンドは、作業ツリーの最上位から実行する必要があります。
何故ですか?私はこの要件を持つ他のgitコマンドを知りませんし、bisectが特別であるべきであるという明白な理由もわかりません。マニュアルページにも、この制限については触れられていません。
それは本当に大したことではありません。私はほとんど興味があります。
プロジェクトのいくつかのコミットを見ると、Marcel M. Cary([email protected])によるものがあります。
彼はコミットで言います(それはたまたまgit-pullについてですが、私はそれが関連していると思います)
POSIXシェルにはgetcwd()とは異なる現在の作業ディレクトリの概念があるため、「gitpull」は失敗します。シェルはこのパスをPWDに保存します。その結果、「cd ../」は、シェルスクリプトではCプログラムのchdir( "../")とは異なる方法で解釈される可能性があります。シェルは「../」を本質的にPWDから最後のテキストパスコンポーネントを取り除くことによって解釈しますが、C chdir()はファイルシステムの現在のディレクトリの「..」リンクをたどります。 PWDがシンボリックリンクの場合、これらは異なる宛先です。その結果、GitのCコマンドは正しいトップレベルの作業ツリーを見つけますが、シェルスクリプトは見つけません。
https://github.com/git/git/commit/08fc0608657ee91bc85276667804c36a93138c7d
その理由の一部は、git-bisectがシェルスクリプトであり、それ自体でトップレベルを見つけることを信頼できないためです(シンボリックリンクが含まれている場合)。
二等分プロセスでは、プロジェクトのさまざまなリビジョンをチェックアウトする必要があります。特定のリビジョンに現在のフォルダーが含まれていない場合、現在のフォルダーは削除されます。
その場合、シェルはファイルシステム上にないフォルダーに置かれる可能性があります。その場合、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
を実行するときに発生する可能性があり、事後に簡単に修正できます。 with cd ..
(willollerは、それがシェルでは機能するがgitでは機能しない理由を説明しています)。
ただし、二等分はprocessであるため、開始する前にこの状況を回避することは理にかなっています。特に、git bisect run
などの自動化を使用する場合はそうです。
その結果、GitのCコマンドは正しいトップレベルの作業ツリーを見つけますが、シェルスクリプトは見つけません。
さて、Git 2.21(2019年2月)では、gitbisectはシェルスクリプトからCへの移行を続けています。
commit 06f5608 、 commit 450ebb7 、 commit 129a6cf 、 commit 4fbdbd5 、 commit e3b1e3b を参照してください。 、 commit 0f302 、 commit 5e82c3d (02 Jan 2019)by Pranit Bauva(pranitbauva1997
) 。
支援者: Ramsay Jones(jeffhostetler
) 、および Stephan Beyer(sbeyer
) 。
(Merged by Junio C Hamano --gitster
- in commit 09a9c1f 、07 Feb 2019)
bisect--helper:
bisect_start
シェル関数は部分的にCで
bisect_start
シェル関数を部分的にCで再実装し、bisect-start
サブコマンドをgit bisect--helper
に追加して、git-bisect.shから呼び出します。最後の部分は、別のシェル関数を呼び出すため、変換されません。
bisect_start
シェル関数は、bisect_next
シェル関数がCに移植された後に完了します。
これはまだ完了していませんが、その移行の副作用は、サブフォルダーからgit bisect
を実行できるようになることです。
Git 2.23は、Cへの変換をさらに改善します。
commit 7877ac (2019年5月21日)by Johannes Schindelin(dscho
) を参照してください。
(Merged by Junio C Hamano --gitster
- in commit 5b476dc 、17 Jun 2019)