倧芏暡プロゞェクトのgitブランチず制埡モデル

ほが2幎前、私たちはフラッグシップのDBMS Linterプロゞェクトの開発に新しいブランチおよびgitサブモゞュヌル管理モデルの䜿甚を開始したした。 この間に開発者グルヌプが数䞇件のコミットを行ったため、ある皋床の確実性を持っおむノベヌションを成功させるこずができたす。 この蚘事は、gitモゞュヌル、既存の分岐戊略、およびlinflowツヌルキットの代替実装に基づいた倧芏暡プロゞェクトで゜ヌスコヌドリポゞトリを敎理する原則の抂芁です。







モノリポゞトリ、gitサブモゞュヌル、gitサブツリヌたたは...



以前は、LINTER゜ヌスコヌドはCVSに保存されおいたした。 このバヌゞョン管理システムの道埳的陳腐化にもかかわらず、私たちが積極的に䜿甚した特定の機胜がありたしたこれにより、この「恐竜」がランク内で長く続くこずができたした特定のタスクで䜜業するには、その䟝存関係を持぀必芁なモゞュヌルのみを抜出できたした これは、プロゞェクト内のモゞュヌルのほずんどが盞互に䜎く自由にペアリングされおいるため䟿利です。



技術的には、必芁な゜ヌスコヌドを取埗するプロセスは可胜な限りシンプルに線成されたした。サヌバヌは䞀連のモゞュヌルをディレクトリに栌玍し、開発者は特定の技術プロセスに必芁なツリヌの抜出ツヌルずファむル蚘述子を保持したした。 より明確にするために、このような蚘述子の小さな断片を瀺したす。



#RepositoryDir Unix RELAPI relapi LINDESKX lindeskx KERNEL5/SQL sql KERNEL5/TSP tsp
      
      





ルヌルによっお、抜出するモゞュヌルだけでなく、それらを抜出する堎所、぀たり䞭倮リポゞトリのツリヌず䜜業コピヌのツリヌが異なるこずも決定されたこずがわかりたす。 これらの蚘述子ファむルは、さたざたなタヌゲット配垃、オペレヌティングシステム、およびDBMSのバヌゞョンごずに倉曎されたした。



しかし、ご存じのずおり、gitはリポゞトリの䞀郚を耇補するための単玔なメカニズムを提䟛しおいたせん。 したがっお、CVSからgitに移行するずいう疑問が生じた堎合、たず、プロゞェクトツリヌ党䜓で単䞀のリポゞトリモノリポゞトリを䜿甚し、補品のアセンブリプロセスぞの倉曎が䞍可避的に導入されるか、プロゞェクトを独立したモゞュヌルのセットに栌玍する2぀の最も明癜な方法を怜蚎したしたgitのサブモゞュヌル/サブツリヌを䜿甚しおそれらを操䜜したす。



モノリポゞトリ



プロゞェクトツリヌ党䜓で1぀のストアを䜿甚するずいう考えは、すぐに攟棄されたした。 そしお、正圓な理由がありたした





gitサブモゞュヌル/ gitサブツリヌ



モゞュヌルのグルヌプをメむンリポゞトリに保存するずいう芳点から問題がなければ、正しい䜜業ツリヌにクロヌンを䜜成するのは困難でした。 もちろん、gitはネむティブのサブモゞュヌルずサブツリヌをサポヌトしおいたすが、それらを䜿甚するこずには十分な欠点がありたす http://habrahabr.ru/post/75964/を参照。これらはこのバヌゞョン管理システムのアヌキテクチャ機胜です。 しかし、最も䞍快な瞬間は、子モゞュヌルの非公開状態ぞの参照がコンテナヌモゞュヌルのメむンリポゞトリに入らないようにする必芁があるこずでした。 そのため、実隓リポゞトリを䜿甚しお、クラむアント偎でモゞュヌルを管理するための代替メカニズムが必芁であるずいう結論に達したした。



linmodules



ネむティブgitサブモゞュヌルずgitサブツリヌの欠点を排陀するために、gitレベルで動䜜する独自のモゞュヌル管理メカニズムを開発したした。 このメカニズムの実装は、linflowず呌ばれるツヌルキットの䞀郚になりたした。



スキヌムは非垞に単玔です。各プロゞェクトモゞュヌルは、゚クスポヌトされた履歎ずずもに個別のリポゞトリに栌玍され、モゞュヌルの1぀この䟋ではlinter.gitずいう名前は、゜ヌスコヌドを含たないコンテナモゞュヌルであり、その䞻なタスクはみんなのためのグロヌバルブランチツリヌ。 コンテナモゞュヌル内のこれらのグロヌバルブランチはそれぞれ、独自の蚘述子ファむル.linmodulesずいう名前を持぀こずができたす。これは、正しいプロゞェクトツリヌを取埗するために必芁です。



ネむティブのgitサブモゞュヌルを毎日䜿甚しない幞運な読者にずっおは、どんなに驚くべきこずに聞こえるかもしれたせんが、そのようなスキヌムは暙準実装よりも簡単で䟿利であるこずが刀明したした。





図1゜ヌスツリヌバリアントの取埗方法。 1-蚘述子ファむルを䜿甚しおコンテナモゞュヌルを耇補したす。2-初期化、3-登録枈みモゞュヌルをタヌゲットディレクトリに耇補したす。



テンプレヌトの説明の構文.linmodulesファむルは、「ネむティブ」構文を完党に繰り返したす。これは、gitで.gitmodulesファむルに䜿甚されたす。 これは、埌方互換性のために意図的に行われたした。



図1の配眮テンプレヌトのフラグメントを次に瀺したす。



 [submodule "tick"] path = lib/tick url = git@linter-git.common.relex.ru:TICK [submodule "odbc"] path = odbc url = git@linter-git.common.relex.ru:ODBC [submodule "inl"] path = app/inl url = git@linter-git.common.relex.ru:INL
      
      





したがっお、モゞュヌルを任意の䜜業コピヌ構造に抜出する機胜を維持するこずができたした。 テンプレヌトの最初の圢成ずその埌の倉曎は、linflowを䜿甚しお行われたす。



分岐モデル



gitベヌスのリポゞトリの最適な組織を探しおいる倚くの開発者がVincent Driessenの仕事「Gitブランチモデルの成功」に粟通しおいるず考えるのは倧きな間違いではありたせんこれを行う時間がなかった人は垞に元のhttp// nvieを読むこずができたす .com / posts / a-successful-git-branching-model /たたはHaberの翻蚳http://habrahabr.ru/post/106912/ 。 私たちも䟋倖ではなく、モデルをテストした埌、モデルを調敎したした。その結果、「芪」モデルの䞀郚の機胜を継承した独自のモデルになりたした。 元の蚘事のタむトルは䞍誠実ではありたせんがモデルは本圓に成功しおいたす、これは長い歎史を持぀本圓に倧きなプロゞェクトにそれを適甚する必芁があるたで正確です。



Vincent Driessenの「成功した」モデルに倉曎が必芁な理由はいく぀かありたした。 発生ず解決の順序で最も重芁なもののみを瀺したす。



「成功した」モデルの倉曎に関する䜜業の結果、独自の戊略が䜜成されたした。これは、元の甚語、芏則、呜名、および䜜業プロセスの䞀郚を継承したす。 簡単にするために、以䞋で詳现に説明する䞻な倉曎点を匷調したす。







図2モゞュヌルでコヌドを分岐およびラップするためのオプション。 リリヌス2のリリヌスブランチは最新であり、マヌゞを䜿甚しお線集を転送できたす。リリヌス1は以前のバヌゞョンをサポヌトし、遞択的に倉曎を受け取りたす。



䞻な支店



䞭倮リポゞトリには、 垞にすべおのモゞュヌルに存圚するブランチのグルヌプが含たれおいたす 。



オリゞン/リリヌスブランチはメむンの本番ブランチず芋なされたす。぀たり、それらの゜ヌスコヌドはい぀でもバヌゞョンをリリヌスしたりビルドしたりできるようにする必芁がありたす。 origin / masterブランチはメむンの本番ブランチず芋なされ、プロゞェクトぞのすべおの倉曎が含たれ、 origin / releaseを䜜成するための゜ヌスずしお機胜したす。 origin / masterの゜ヌスコヌドをリリヌスする準備ができたら、倉曎を特定の方法で察応するorigin / releaseに転送するか、新しいバヌゞョンを生成する必芁がありたす。したがっお、 origin / releaseにブランチを䜜成したす。



補助枝



メむンブランチに加えお、リポゞトリの構造䞭倮コピヌず䜜業コピヌの䞡方は、次のタむプの補助ブランチの存圚を意味したす。



これらのタむプのブランチにはそれぞれ、特定の目的ず䞀連のメンテナンスルヌルがありたす。これらに぀いおは以䞋で説明したす。





図3モゞュヌルによるブランチの分垃メむンブランチはすべおに存圚し、補助ブランチは必芁なものにのみ存圚したす。



䞀般芏則



䞭倮およびロヌカルリポゞトリでブランチを管理するための䞀般的なルヌル





リリヌスブランチ



リリヌスブランチはrelease / Blinter_AB_Cず呌ばれたす 。ここで、 Aはメゞャヌバヌゞョン、 Bはマむナヌバヌゞョン、 Cはリリヌス番号です。 リリヌスブランチは、developから生成され、LINTERバヌゞョンが垞にサポヌトされおいたす。 ブランチはコヌドの受信者であり、開発は実行されたせん。 新しいビルドのリリヌスの各ファクトは、 Blinter_AB_C_Dの圢匏の察応するタグでマヌクされたす。ここで、 Dはビルド番号です。 このタむプのブランチは、別のリリヌスブランチぞのリンク組織の芳点からoriginぞ にするこずができたす。 この堎合、これらのブランチの1぀で公開されるず、関連するすべおのブランチが曎新されたす。 リリヌスブランチはグロヌバルです。぀たり、コンテナモゞュヌルで䜜成された堎合、すべおのモゞュヌルに存圚したす。 ビルドタグを持぀タグは、すべおのモゞュヌルで䞀床に蚭定されたす。



ブランチを修正



修正ブランチはホットフィックス/ *ず呌ばれ、開発䞻にたたはリリヌスから生成でき、 開発マスタヌおよびリリヌスにマヌゞできたす。 修正に1぀のコミットが含たれる堎合、マヌゞコミットを䜜成せずにマヌゞが実行されたす。 コメント本文の最埌のコミットには、バグトラッカヌの察応するチケットの番号ぞの参照が含たれおいたす。 線集を転送した埌、パッチブランチは閉じられたす。



機胜ブランチ



関数ブランチはfeature / *ず呌ばれ、Developer masterからのみ生成されたす。

機胜ブランチは、珟圚たたは将来のリリヌスで衚瀺される新しい機胜を開発するために䜿甚されたす。 機胜の開発が継続しおいる限り、ブランチが存圚したす。 䞭間結果が達成されるず、ブランチは䞭倮リポゞトリに公開されたす。 ブランチでの䜜業が完了するず、埌者は必然的にメむンの開発ブランチ機胜が次のリリヌスで远加されるこずを意味したすにマヌゞされ、オプションでリリヌスブランチにマヌゞされたす。 コヌド転送埌、機胜ブランチは閉じられたす。



linflow



䞊蚘のテキストで䜕床か蚀及されたlinflowツヌルキットに぀いおいく぀かの蚀葉を蚀う䟡倀がありたす。 Linflowは、゜ヌスツリヌのモゞュヌルを䜿甚した操䜜、および分岐モデルのサポヌト甚に蚭蚈されおいたす。 linflowのクラむアント郚分はgit-flowプロゞェクト https://github.com/nvie/gitflow のフォヌクです。これは、戊略のために倉曎され、linmodulesをサポヌトするように拡匵されおいたす。 さらに、gitoliteの拡匵機胜ずしお機胜するサヌバヌパヌツを開発したした http://gitolite.com 。



linflowのモゞュヌル管理機胜を䜿甚するず、次のこずができたす。



linflowのブランチ管理機胜により、次のこずが可胜になりたす。



サヌバヌ偎の機胜により、次のこずが可胜になりたす。



珟圚、分岐モデルおよびlinflowツヌルの完党な技術ドキュメントを公開する可胜性の問題に぀いお議論されおいたす。 この出版物ぞの応答たたは䞍圚は、これにおける最も重芁な圹割ではありたせん。



All Articles