web-dev-qa-db-ja.com

なぜgit-bisectを作業ツリーの最上位ディレクトリから実行する必要があるのですか?

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

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

何故ですか?私はこの要件を持つ他のgitコマンドを知りませんし、bisectが特別であるべきであるという明白な理由もわかりません。マニュアルページにも、この制限については触れられていません。

それは本当に大したことではありません。私はほとんど興味があります。

55
Parker Coates

プロジェクトのいくつかのコミットを見ると、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がシェルスクリプトであり、それ自体でトップレベルを見つけることを信頼できないためです(シンボリックリンクが含まれている場合)。

52
willoller

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

その場合、シェルはファイルシステム上にないフォルダーに置かれる可能性があります。その場合、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などの自動化を使用する場合はそうです。

7
joeytwiddle

その結果、GitのCコマンドは正しいトップレベルの作業ツリーを見つけますが、シェルスクリプトは見つけません。

さて、Git 2.21(2019年2月)では、gitbisectはシェルスクリプトからCへの移行を続けています。

commit 06f5608commit 450ebb7commit 129a6cfcommit 4fbdbd5commit e3b1e3b を参照してください。 、 commit 0f302commit 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)

2
VonC