1

AとBの2つのプロジェクトがあります。私が取り組んでいるプロジェクト「B」は「A」の下流にあります。つまり、BはAにさまざまな機能を追加し、さまざまな方向に成長しました。しかし、それらは共通の歴史を共有しています。

少し前に、BはAのメジャーリリースごとに定期的に更新されて維持されていました。しかし、これはもはや当てはまりません。

Bのメモリリークを追跡したところ、1年以上前にAで修正され、パフォーマンスを向上させるためにAに多くの変更が加えられたことがわかりました。

これらの変更はすべてプロジェクトBに統合する必要があることが決定されました。

これが私が今していることです。明らかに、タスクを管理不能にするかなりの数の問題があります。しかし、それらのどれも私の質問に本当に関係していません。

コンポーネントごとにdiffのコンポーネントを作成し始め、何が変更されたかを確認し、Aには存在しなかったBの機能を中断せずに何を含めることができるかを判断しました。

コンポーネントごとに新しいブランチを作成しました(管理しやすくするために、特定のコンポーネントの外部で変更されたコードに対する参照を保持しているものを特定します)元々はマージを実行できると考えていましたが、以前にマージを使用したことを覚えているようです。ものを書きすぎる; しかし、何らかの理由でAのコンポーネントをBとマージしようとすると、Bに固有のコードのほとんどが失われました。

しかし、うまくいく可能性があるのは、私が気付いていないピットフォールの可能性があるテクニックに時間を費やすことを躊躇しているのですが、diffから作成されたパッチを編集するだけです。

次に、編集したパッチを適用します。

パッチではコードの両側を並べて表示できるため、コードを削除したくないビット(-)を削除して、ケースバイケースで競合を心配することができます。

誰かがこれを試しましたか?または、この種の問題を処理するためのより主流の手法を知っている人はいますか?

もう1つの問題は、gitシステムによって破損することなく、パッチをどのように変更できるかということです。

4

1 に答える 1

1

gitパッチを編集する代わりに、興味深いコミットを選択し、作業ディレクトリで適用された差分を変更することをお勧めします。

git cherry-pick --no-commit upstream/commit1
(edit changes in working directory)
git commit

潜在的に興味深いコミットがたくさんある場合は、インタラクティブなリベースを試すことができます。

git checkout upstream/master -b upstream-new
git rebase -i master

このようにして、多くのコミットを簡単に確認して選択できます。たとえば、サブシステムにのみ影響するコミットのみを選択します。-を実行すると、選択プロセスを支援できます。git log --oneline subsystem1/ >/tmp/subsystem1_commits.txtこれにより、で受け入れられるのと同様の構文のファイルが作成されgit rebase -iます。

あなたのワークフローについて:あなたの問題に対する簡単な解決策はないと思います。アップストリームリポジトリとブランチが長期間分岐する場合、gitの主な利点である分岐とマージが簡単に失われます。あなたが残しているのは、ほぼ手動のパッチシステムであり、これは常に苦痛です。ただし、アップストリームリポジトリを年に1〜2回更新できる場合は、次のことを行う価値があります。

  • バージョンupstream/masterから開始し、コミットを適用します(=> master-1ブランチ)
  • 必要に応じてアップストリーム/マスターからホットフィックスを選択してください
  • アップストリームブランチに更新する時間がある場合は、master-1ブランチをアップストリーム/マスターにリベースしますが、すでに厳選されたホットフィックスは使用しません(これはで実行できますgit rebase -i)。このブランチをmaster-2と呼びましょう。

このようにして、次の履歴が得られます。

A-A-A-A-A- (upstream/master at the beginning)
          \
           -B-B-A-B (your master-1 branch, with a cherry-pick)
          \
           -A-A-A-A-A-A-A-A -B-B-B (your master-2 branch, after the rebase)
于 2012-05-07T00:18:51.247 に答える