45

git bisect は設計上ブランチ対応であることを認識しているため、適切なコミット (G) と不適切なコミット (B) の間でブランチにマージした場合、バグが発生する可能性があるため、それらの変更も考慮する必要があります。ブランチに含まれます。

私の場合、サイド ブランチとして依存関係があり、時々メイン プロジェクトに変更をマージします。依存関係は、メイン プロジェクトとは異なる実行方法、異なるビルド システムなどを持つライブラリと見なすことができますが、メイン ブランチへのマージを介して最近の変更が必要です。

問題は、このシナリオで二分している間に、依存関係からのコミットでコンパイル不能なコミットになってしまうことです。

二分法を実行している間、各ブランチのマージを単一のコミットと見なしたいだけです。

私がこれまでに見つけた回避策は、有効なコミット G..B のリストを git log --first-parent で作成し、バイセクト中に、現在のコミットがそのリストにない場合は git bisect skip を実行することです。ただし、これには多くの時間がかかります(スキップするたびにチェックアウト/変更するファイルがたくさんあります)。

質問は次のとおりです。 --first-parent を git bisect で実行する方法や、既にコンパイル可能ではないことがわかっているブランチのチェックアウトを回避できる有効なコミットのリストを提供する方法はありますか? 図でoとマークされているコミットのみを確認するにはどうすればよいですか?

G---o---o---o---o---o---o---B メインプロジェクトブランチ
   / / /
  x---x---x---x---x 依存関係
           \ /
            x' 依存プロジェクトのタスクブランチ

編集:明確にするために図を追加

4

10 に答える 10

14

私は可能な解決策を1つ考えましたが、もっとエレガントなものを見つけたいと思っています:

メイン ブランチへのすべてのマージのすべての 2 番目の親を良好としてマークします。

各マージのすべてのリモートの親を良好としてマークすると、それらに先行するすべてのコミットが良好であると見なされます (したがって、bisect によってスキップされます)。このソリューションは、複数のブランチからの複数のマージを処理するのに十分な汎用性があり、メイン ブランチにコミットのみを残す必要があります。

git rev-list --first-parent --merges --parents GOOD..BAD \
| sed 's/^[^ ][^ ]* [^ ][^ ]* //' \
| xargs git bisect good

(GOOD と BAD を関連するコミットに置き換えます)

sed の正規表現は、各行の最初の 2 つのコミットを削除します。マージ コミット自体、および最初の親であり、残りの親 (通常は 2 番目の親のみ) を残します。

質問に記載されている履歴を考えると、ワンライナーを実行すると次のようになります。

G---o---o---o---o---o---o---B メインプロジェクトブランチ
   / / /
  G---x---G---x---G 依存関係
           \ /
            x' 依存プロジェクトのタスクブランチ

これにより、 bisect はメイン ブランチのコミットのみをトラバースします。

    o---o---o---o---o---o

マージされたブランチのいずれかが間接的に問題の原因である場合は、bisect を介してマージ コミットをテストするときに発見されます。これは、そのブランチをさらに調査する理由になる可能性があります。

于 2011-04-13T16:14:58.950 に答える
12

私もこのようなものを探していました。私が持っている限り、それはgit rev-list --bisect --first-parentあなたがやりたいことをしているように見えます.rev-listのドキュメントは、--bisectオプションがbisectが内部で使用するものであることを暗示しています-しかし、git bisectrev-listへの呼び出しにそのフラグを追加するそれほど自明ではないようです:

bisect コマンドはシェル スクリプト git-bisect によって実装され、組み込みコマンドbisect--helperを使用して実際に興味深い部分を実行します (「計算、表示、およびチェックアウト」はコメントを言います...)、明らかに一連の魔法の状態に基づいています。 .git/ 内のファイル。そして、ご想像のとおり、その逆ではなく、bisect--helper のコードを再利用しているのは rev-list コマンドのようです。

そのため、bisect--ヘルパー コードのコミット フィルタリングを拡張してそれを行う必要があると思います。

回避策として、次のようなことがうまくいくかもしれませんgit rev-list --bisect --first-parent

于 2011-04-12T17:12:42.413 に答える
11

履歴が次のようになっている場合:

A - B - C - H - I - J - K - L
         \ /
          D - E - F - G

ここで、L は悪く、B は良く、DEFG ブランチを無視して実行します。

$ git bisect スタート
$ git bisect skip $( git rev-list G ^C )
$ git bisect 悪い L
$ git bisect グッド B

ここで、B、C、G、および L はそれぞれの sha であり、あなたが望むことをしているようです。

于 2011-04-13T14:36:02.990 に答える
4

Björn Steinbrinkの答えはうまくいきますが、最近これを印刷し始めました:

ヒント: /info/grafts のサポートは非​​推奨です
ヒント: 将来の Git バージョンでは削除される予定です。
ヒント:
ヒント: 「git replace --convert-graft-file」を使用してください
ヒント: グラフトを置換参照に変換します。
ヒント:
ヒント: 実行してこのメ​​ッセージをオフにします
ヒント: 「git config advice.graftFileDeprecated false」

これは、グラフトの代わりに「git replace」を使用した彼のソリューションのより現代的なバージョンです。

git rev-list --first-parent --merges --parents HEAD | \
  READ COMMIT PARENT1 PARENT2; 行う
    git replace --graft $COMMIT $PARENT1;
  終わり

残念ながら、大規模なリポジトリの場合ははるかに遅くなります (150k のコミットで約 3 分)。git replaceバルクモードはまだないようです。rev-list を bisect の範囲内のコミットのみに制限したい場合があります。

完了時に置換を削除するには、次のことができrm .git/refs/replace/*ます。

于 2018-07-24T14:23:38.543 に答える
1

I don't see a one-step method, however, based on your current solution: git bisect skip can take a list of commits to skip. git log branchname will list commits on branch branchname. So this should let you specify the list of commits.

If your dependency and your main code live in different filesystem spaces, you can specify the paths to include with git bisect start. Depending on your code layout, that may be the best option. (Almost certainly is if you have a list of files that may contain the bug!)

The man page has details; the see also there is interesting reading, too.

于 2011-04-12T16:24:01.277 に答える
1

git bisect start --no-checkout実際にコミットを作業ツリーにチェックアウトする必要を回避するために使用できる場合があります。次にgit checkout BISECT_HEAD、実際にテストしたいコミット (つまり、メイン ブランチの最初の親コミットのみ) に対して実行できると思います。私はこれを試していませんが、うまくいくことを願っています。

于 2015-10-22T03:31:49.573 に答える