46

当社のソフトウェア製品ラインでは、複数のソフトウェア バージョンを同時に開発および維持する必要があります。私たちは比較的 Git の初心者であり、最近、 Driessen の分岐モデルを利用するために Git Flow を採用しました。私たちのソフトウェア チームは非常に小規模で、熱心な開発者はほとんどおらず (全員がさまざまな帽子をかぶっています)、「統合の第一人者」もいません。

Git と Git Flow を私たちのニーズに適応させる方法について、多くの検索を行った結果、具体的なアドバイスはほとんど見つかりませんでした。明らかになったのは、Git Flow は複数のバージョンを同時にサポートするのに適していないということです。SO に関する1 つの関連する議論には、個別のバージョンの履歴を追跡するために個別のブランチ名を使用する必要があることを示す回答があります。これと関連する戦略により、変更されない限り Git Flow は削除されます。これが私たちにとって実用的でない理由については、上記のチームの制限を参照してください。

重要な問題は、複数のリリース ラインをサポートしながら Driessen の分岐モデルをできるだけ厳密に実装するための優れたアプローチであると他の人が見つけた方法は何ですか?

更新:

以下の回答 (特に @Rasmus ') を、よりターゲットを絞った検索といくつかのオプションに関する内部ディスカッションで抽出すると、私たちが実装している次のソリューションにつながります。

Git Flow は今後も使用しません。代わりに、各ブランチ名の前に意図したリリース文字列を付けることで、Driessen のモデルをレポ内の個々のリリース ラインに適用します。

r1.5/develop

プロジェクトのすべてのバージョンは、Git リポジトリに含まれています。新しいプロジェクト バージョンを開始するには、リリース文字列を前に付けた新しい長命のブランチの小さなセットを作成する必要があります (たとえばr1.6/develop、私たちの場合はr1.6/release; nomasterで、現在の単一の良好なビルド可能状態を意味します)。

remoteローカル リポジトリリンクを介してコードを共有するための主要な手段となるサーバー上に、プロジェクトごとに 1 つの中央パブリック リポジトリを確立します。このリポジトリへのプッシュは、他のユーザーが使用する準備ができているコードを意味します。ブランチにマージRX.Y/developしてからプッシュするRX.Y/releaseことは、リリースを意図したコードを意味します。 feature、、、hotfixなど。アル。ブランチも同様に処理されます。特定のリリース ラインのブランチ マージ/コミット履歴は、クリーンでわかりやすいものです。時間の経過とともに構造が分岐する可能性があるようなリポジトリをマージする複雑さを回避するために、典型的な Git 分散リポジトリ戦略は必要ありません。

一部の Git GUI (たとえば SourceTree など) では、このブランチ構造が認識されて階層として表示されるため、ブランチ構造からプロジェクトの最上位の履歴を理解するのに役立ちます。

回答に賛成票を投じなかったことをお詫びします。SOでの私の評判は、そうするために必要な最低限のものではありません。

4

3 に答える 3

9

300 人を超える専任の開発者がいることを除いて、同様のセットアップを行っています。さまざまな顧客に提供する必要があるいくつかのリビジョンがまさにあなたが説明したとおりです。

それを分割したので、refs/heads/platformX.Y/ のような最初の ref があり、その上にビルドします

そのため、何をする必要があるかによって、platformX.Y/develop をチェックアウトし、機能ブランチのその時点から作業を開始し、完了したらマージして開発に戻ります。

これはうまくいき、nvie モデルに従うことができます。

さらに、これらすべての platformX.Y ブランチをメインの開発ブランチにマージしているため、これらのブランチで修正されたエラーは最新のソフトウェアにもリリースされます。

于 2013-08-14T12:59:41.883 に答える
2

私たちの通常の開発プロセスは、Driessen のフロー ワークフローにうまく適合していますが、進行中の開発の大部分を含めたくない特殊なリリースのために、いくつかの機能を備えたブランチを開発する必要がある場合があります。既存のツールを使用してフロー内でこれを行う方法を見つけましたが、追加の手順がいくつかあります。(Mercurial で作業していますが、git flow と hg flow のオプションは同じです。)

たとえば、次の通常のリリースは 23.0 で、特別な「サンドボックス」リリースは 22.4.2 です。これらのケースでは、次のことを行います。

  1. 新機能が作成される前の早い段階で、develop からの特別なリリース用にリリース ブランチ 22.4.2 を作成します。一部の機能が以前に開始されていたとしても、除外したい開発作業の後ではない限り問題ありません。
  2. 便宜上、そこにタグを作成します (start-22.4.2)
  3. start-22.4.2 (develop の変更セット) を parent/base として、新しい 22.4.2 機能をそれぞれ開始します。これにより、その間に開発にマージされた作業がリリース ブランチに漏れるのを防ぎます。コマンドラインと Sourcetree の両方で、ヒントのほかに親の選択がサポートされていgit flow feature startます。
  4. 必要に応じて、22.4.2 ブランチの先端から機能に手動でマージし、必要に応じて何度でも、ブランチから完成した機能を取り込みます。これにより、ブランチの新しい 22.4.2 機能間で懸念される相互作用に対処できます。
  5. git flow feature finishそれをマージして通常どおりに開発する機能。(私たちにとって、これらの機能将来のリリースに含まれることを意図しています。あまりテストされていない作業から 22.4.2 を保護しているだけです。)
  6. の後finish、機能を閉じる前の最後の変更セットを 22.4.2 ブランチに手動でマージします。
于 2014-12-11T21:13:27.363 に答える
1

1 つの解決策は、構成変数を変更することですgitflow.branch.develop。リリースされたバージョンでブランチを作成し、そのブランチを新しい開発ブランチとして使用します。そこから、通常の git-flow コマンドを使用します。その作業を元の開発ブランチに自動的にマージしたい場合はgitflow.branch.develop、git-flow finish コマンドの前に変数を変更してください。

于 2013-08-16T10:17:24.250 に答える