指定された2つのタグ間の変更を取得したいのですが、コマンドは次のとおりです。
git log `Tag1...Tag2 --cherry-pick --no-merges --right-only
しかし、それは非常に遅いです。
パラメータを1つずつテストします。を使用した場合にのみ--cherry-pick
、gitログは非常に遅くなります。
なんで?誰かが私を助けることができますか?
指定された2つのタグ間の変更を取得したいのですが、コマンドは次のとおりです。
git log `Tag1...Tag2 --cherry-pick --no-merges --right-only
しかし、それは非常に遅いです。
パラメータを1つずつテストします。を使用した場合にのみ--cherry-pick
、gitログは非常に遅くなります。
なんで?誰かが私を助けることができますか?
--cherry-pick
コミットのセットが対称的な違いで制限されている場合、「反対側」の別のコミットと同じ変更を導入するコミットを省略します。たとえば、A と B の 2 つのブランチがある場合、すべてのコミットを片側のみに一覧表示する通常の方法は --left-right を使用することです (以下の --left-right オプションの説明の例を参照してください)。 . ただし、他のブランチからチェリー ピックされたコミットが表示されます (たとえば、「b の 3 番目」はブランチ A からチェリー ピックされる可能性があります)。このオプションを使用すると、そのようなコミットのペアは出力から除外されます。
類似性を探すためにすべてのコミットを比較する必要があります。これは、比較をまったく行う必要がない場合と比較して、非常に遅い操作になります。
使ってきました
git log tag1 --not tag2
これにより、tag2 ではなく tag1 のすべてのコミットが得られます。ブランチとタグでもうまく機能します。
チェリー ピッキングはそれほど高速ではない可能性があります。特に、HEAD から遠く離れた場所にあるものをチェリー ピッキングしている場合は、おそらくマージの一部として名前の変更が検出され、コストがかかる可能性があるためです。
git config にgc.auto = 0
( git config --get gc.auto
) が含まれている可能性があるため、有効になっているかどうかを再確認するか、次のコマンドを実行してください。
git gc
不要なファイルをクリーンアップし、ローカル リポジトリを最適化するため。
config 変数をもっと小さい値に設定することもできますmerge.renamelimit
(例: 0 は制限なしを意味するため、1 など)。これで問題が解決しない場合は、git のプロファイルを作成して (たとえば、strace
またはを使用してperf record git cherry-pick ...
)、ボトルネックを見つけてください。
参照:チェリーピックは遅い
マージ再帰の場合、常に各サイドと祖先の間のペアごとの名前変更を計算する必要があります。そのため、チェリーピックの宛先への差分は、常に高価な O(ソースと宛先の間の変更の数) 操作になります。
名前を変更しないと、3 方向のツリー ウォークを使用して実際のマージをより適切に行うことができます。たとえば、一部のサブツリーが と のツリーではツリー A に
ours
ありancestor
ますが、 ではツリー B にあることがわかりますtheirs
。したがって、さらに下に降りる必要はなく、"take theirs" (theirs
値を取得するには下に降りる必要があります) と言うことができます。しかし、インデックスとの相互作用でより複雑になると思います (とにかく、名前の変更の問題のために、おそらく多くの労力を費やす価値はありません)。-ペフ