私が使用しているビルド システムでは、通常、フル ビルドを実行する前に、プロジェクト データをローカル リポジトリにコミットする必要があります。これは、頻繁にコミットし、パブリック リポジトリにプッシュする前にリベースするという私の通常の習慣に加えて、通常、リモート ヘッドの上にコミットのスタックがあることを意味します。それらのほとんどは、「s」のようなコミット メッセージを持っています。
ここでの状況は、コミットのリストをリベースするステップの 1 つを自動化することです。特定のファイルに加えたすべての変更をパブリックリポジトリにプッシュするべきではないことを知っています。各コミットを編集して、そのファイルへの変更を個別のコミットに分割する方法を探していました。リベース。
たとえば、オリジンの HEAD の場合、私が一番上に持っているコミットは次のとおりです。
* 6f42745 (HEAD, master-dave) s
* b33bc68 s
* 0b787e8 s
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
master..master-dave からのすべてのコミットを反復処理し、./file.txt への変更を抽出して、次のようにします。
* 6f42745 (HEAD, master-dave) s
* ------- DD (changes to file.txt)
* b33bc68 s
* ------- DD (changes to file.txt)
* 0b787e8 s
* ------- DD (changes to file.txt)
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
そして最後に、git rebase -i origin/master を実行し、すべての「DD」コミットをまとめて押しつぶし、すべての「s」コミットを「master ブランチで更新された pkg」に入れ、並べ替え、master を更新します。 、原点にプッシュし、最終的には次のようになります。
* ------- (HEAD, master-dave) DD: dave dev
* ------- (origin/master, master) brought pkg up-to-date with master branch
* 422cf73 Add missing build scripts.
答えは git filter-branch にあると確信していますが、その方法がわかりません。
編集:
- --autosquash は「s」コミットの煩わしさを修正しますが、それは主な問題ではありません。変更を特定のファイルに分割する方法はまだわかりません。これは、それらをつぶす前に行う必要があります。
- smudge/clean フィルターは気の利いたものですが、私はキーワードの置換を行っていません。また、個人のブランチで維持したい変更が、スクリプトを作成するのに十分なほど予測可能になるとは思いません。私は常に公開マスターよりも少なくとも 1 コミット先にいる必要があると思います。