5

クライアントごとにカスタマイズされた基本システムがあります。ベースは独自のリポジトリに存在し、各クライアントは独自のリポジトリに存在します (元はベースからクローンされています)。

目標は、必要に応じてクライアントに伝播できるバグ修正/機能をベースに追加できるようにすることです。

これまでのワークフローは次のとおりです。

  • ベースの修正/機能のコミット/トピック ブランチを作成します: (ベース、マスター)git commit -m "Fix admin typo"
  • これらの変更をクライアントにマージします: (on client, master) git merge base/master。明らかに、これにはベースとクライアントのカスタマイズ間の競合の修正が含まれます。
  • マージをクライアントのオリジンにプッシュします: (クライアント、マスター上)git push origin master
  • 私たちの慣例は、rebase でプルすることです (履歴を読みやすくするため)。そのため、クライアント プロジェクトで作業している別の開発者が (クライアント、マスターで)git pull --rebase origin master

この時点で、そのプル/リベースで重大な問題が発生します。開発者は、ベースからクライアントへのマージ後に実行されるプル/リベースで競合を取得します。そして、それはほんの少しの競合ではなく、多くの競合であり (多くのコミットがリプレイされていますか?)、特定の開発者がまったく触れていないコードが頻繁に発生します。これは理不尽で持続不可能だと思います。

ここで最善の解決策は何ですか?

私の唯一の考えは、プルするときにリベースの使用をやめ、ずさんで読みにくいログに対処することですが、これを行う必要はありません。これらのクライアント プロジェクトは何年も存続する可能性があり、今後も基本システムのマージをある程度理解できるようにしたいと考えています。

4

1 に答える 1

3

あなたのレポでこれをまっすぐにさせてください:

  1. メインプロジェクトは別のもので、呼ばれますbase
  2. 各クライアント プロジェクトは から複製されbase、更新のみをプルします
  3. client_foo開発者は公開リポジトリから作業し、/そこからpush/へpull

client_foo1 つの開発者がリポジトリからの新しいコミットにブランチをリベースbaseして にプッシュバックしているため、ワークフローが失敗していclient_fooます。client_fooこれにより、次のプルを実行しようとするときに使用している他のすべての開発者が壊れてしまいます。したがって、それを行うことはできず、git が自動的に処理することを期待してください。

クライアント リポジトリごとに 1 つの開発者だけであれば、おそらくそれでうまくいくでしょう。そうではないと思います。

オプション:

  1. あなたがしていることを続けますが、開発者がリベースされclient_fooたブランチ (新しいbaseコミットを含む) をパブリックclient_fooリポジトリにプッシュすると、他の全員がreset --hardonを実行する必要がありorigin/masterます。プッシュされていないすべての変更をプライベート トピック ブランチに保持する場合、それらをrebase新しい に戻す必要がありclient_foo/masterます。

  2. 開発者を からにmerge変更します。これにより、回避しようとしていると言ったマージコミットが得られますが、最も正確な履歴が得られます。開発者が「pull --rebase」を実行すると、現在発生している競合の長いリストが表示されなくなります。baseclient_fooclient_foo

  3. 開発者に からへcherrypickの変更を依頼します。これにより、履歴は線形に保たれますが、git は'd コミットが から来たことを追跡しなくなります。別の方法で追跡する必要があります。baseclient_foocherrypickbase

それがgitの動作方法であるため、#2に固執すると思います。ただし、他の誰かがより良い非自明な解決策を考えるかもしれません。

于 2010-08-20T22:14:28.417 に答える