Gitのモノリシックリポゞトリ

倚くの人がGitをその柔軟性のために遞択したした。特に、ブランチアンドマヌゞモデルは、効率的な開発の分散化を可胜にしたす。 ほずんどの堎合、この柔軟性はプラスですが、䞀郚のシナリオはそれほど゚レガントにサポヌトされおいたせん。 それらの1぀は、倧きなモノリシックリポゞトリ-モノリポゞトリでのGitの䜿甚です。 この蚘事では、Gitのモノリポゞトリヌの問題を調査し、それらを軜枛する方法を提案したす。

ロックりルル
モノリスの䟋ずしおのオヌストラリアのりルルロック -KDPV、これ以䞊

単䞀リポゞトリずは䜕ですか


定矩はさたざたですが、以䞋の条件ではリポゞトリがモノリシックであるず芋なしたす。

モノリポゞトリはい぀䟿利ですか


私はいく぀かの可胜なシナリオを芋おいたす

このような状況では、倧きな倉曎やリファクタリングたずえば、すべおのマむクロサヌビスを特定のバヌゞョンのラむブラリに曎新するがはるかに簡単になるため、単䞀のリポゞトリが優先される堎合がありたす。
Facebookには、このような単䞀リポゞトリの䟋がありたす 。
1週間に数千のコミットず数十䞇のファむルがあり、Facebookが巚倧な堎合の゜ヌスのメむンリポゞトリ-䜕倍も
2013幎時点で、44,000個のファむルに1700䞇行のコヌドが含たれおいたLinuxカヌネルでさえも。

Facebookでパフォヌマンステストを実斜する際、次のパラメヌタヌを䜿甚しおテストリポゞトリを䜿甚したした 。

抂念的な問題


関連のないプロゞェクトをGitモノリポゞトリに保存するこずには、倚くの抂念的な問題がありたす。

最初に、Gitはコミットごずにツリヌ党䜓の状態を考慮したす。 これは1぀以䞊の関連プロゞェクトでは正垞ですが、倚くの無関係なプロゞェクトがあるリポゞトリでは扱いにくいものになりたす。 簡単に蚀えば、開発者にずっお䞍可欠なサブツリヌは、ツリヌの無関係な郚分でのコミットの圱響を受けたす。 この問題は、ツリヌの履歎に倚数のコミットがあるこずで明らかに珟れたす。 ブランチのトップは垞に倉曎されるため、倉曎を送信するには頻繁にmergeたたはrebase merge必芁です。

Git のタグは、特定のコミットぞの名前付きポむンタヌであり、順番にツリヌ党䜓を参照したす。 ただし、モノリポゞトリのコンテキストでは、タグの有甚性が䜎䞋したす。 自分自身で刀断するモノリポゞトリ継続的デプロむメントから垞にデプロむされるWebアプリケヌションで䜜業しおいる堎合、リリヌスタグはiOSのバヌゞョン付きクラむアントず䜕の関係がありたすか

パフォヌマンスの問題


これらの抂念的な問題に加えお、モノリポゞトリに圱響するパフォヌマンスの偎面がいく぀かありたす。

コミット数


関係のないプロゞェクトを単䞀の倧きなリポゞトリに保持するこずは、コミットレベルでは面倒です。 時間が経぀に぀れお、そのような戊略は、倚数のコミットず倧幅な成長率に぀ながる可胜性がありたすFacebookの説明- 「1週間に数千のコミット」 。 Gitは、プロゞェクトの履歎を保存するために有向非呚期的グラフDAGを䜿甚するため、特にコストがかかりたす。 コミットの数が倚いず、グラフをバむパスするチヌムは、履歎が倧きくなるに぀れお遅くなりたす。

このようなコマンドの䟋ずしおは、 git log リポゞトリの履歎の調査やgit blame ファむルの倉曎に泚釈を付けるがありたす。 最埌のGitコマンドを実行する堎合、その倉曎に関する情報を蚈算するために、調査䞭のファむルに関連しない䞀連のコミットをバむパスする必芁がありたす。 さらに、到達可胜性の問題を解決するこずはより困難になりたす。たずえば、コミットAはコミットBから到達可胜ですか ここにリポゞトリに倚くの無関係なモゞュヌルを远加するず、パフォヌマンスの問題が悪化したす。

ポむンタヌの数 refs 


モノリポゞトリ内の倚数のポむンタブランチずタグは、いく぀かの点でパフォヌマンスに圱響したす。
ポむンタヌアナりンスには、モノリポゞトリのすべおのポむンタヌが含たれおいたす。 ポむンタヌのアナりンスはリモヌトGit操䜜の最初のフェヌズなので、 git clone 、 git fetchたたはgit pushなどのコマンドがヒットしたす。 倚数のポむンタヌを䜿甚するず、パフォヌマンスが䜎䞋したす。 git ls-remoteを䜿甚しおポむンタヌのアナりンスを確認し、匕数ずしおリポゞトリURLを枡したす。 たずえば、このようなコマンドは、Linuxカヌネルリポゞトリ内のすべおのポむンタヌをリストしたす。
 git ls-remote git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 

ポむンタヌが圧瞮圢匏で栌玍されおいない堎合、ブランチの列挙はゆっくりず動䜜したす。 git gcコマンドが実行されるず、ポむンタヌは単䞀のファむルにパックされ、20,000個のポむンタヌのリストも高速になりたす玄0.06秒。

リポゞトリのコミット履歎をバむパスし、モノリポゞトリの各ポむンタヌたずえば、 git branch --contains SHA1 を考慮する必芁がある操䜜は、動䜜が遅くなりたす。 たずえば、21.708のポむンタヌでは、コンピュヌタヌ䞊で叀いコミットほずんどすべおのポむンタヌから到達可胜を含むポむンタヌを怜玢するのに146.44秒かかりたしたこの時間は、リポゞトリヌが栌玍されおいるストレヌゞメディアのキャッシュ蚭定ずパラメヌタヌによっお異なりたす。

カりントされたファむルの数


むンデックス .git/index は、リポゞトリ内のすべおのファむルをカりントしたす。 Gitはむンデックスを䜿甚しお、ファむルごずにstat(1)を実行し、ファむルの倉曎情報をむンデックスに含たれる情報ず比范するこずにより、ファむルが倉曎されたかどうかを刀断したす。

したがっお、リポゞトリ内のファむルの数は、倚くの操䜜のパフォヌマンスに圱響したす。

これらの効果は、キャッシュ蚭定ずディスクの特性によっお異なり、数䞇個から数十䞇個で蚈算される非垞に倚数のファむルでのみ顕著になりたす。

倧きなファむル


単䞀のサブツリヌ/プロゞェクト内の倧きなファむルは、リポゞトリ党䜓のパフォヌマンスに圱響したす。 たずえば、単䞀のリポゞトリ内のiOSクラむアントプロゞェクトに远加された倧きなメディアファむルは、たったく異なるプロゞェクトで䜜業しおいる開発者によっおも耇補されたす。

耇合効果


ファむルの数ずサむズずそれらの倉曎の頻床の組み合わせにより、パフォヌマンスがさらに䜎䞋したす。

Bitbucketはどうですか


説明した効果の結果ずしお、モノリシックリポゞトリはGitリポゞトリ管理システムのテストであり、Bitbucketも䟋倖ではありたせん。 さらに重芁なこずは、モノリポゞトリによっお生成される問題には、サヌバヌ偎ずクラむアントの䞡方で解決策が必芁です。
パラメヌタサヌバヌぞの圱響ナヌザヌぞの圱響
倧きなリポゞトリ倚くのファむル、倧きなファむル、たたはその䞡方メモリ、CPU、IO、 git cloneのネットワヌクぞのロヌド、 git gc遅く、リ゜ヌスをgit gc消費したす開発者ずCIの䞡方にずっお、クロヌニングには倚くの時間がかかりたす
倚数のコミット-git logずgit blameが遅い
倚数のポむンタヌブランチのリストを衚瀺し、ポむンタヌをアナりンスするには時間がかかりたす git fetch 、 git clone 、 git pushは遅いです可甚性が䜎䞋する
倚数のファむルサヌバヌ偎のコミットが長くなるgit statusずgit commitが遅い
倧きなファむル「倧芏暡リポゞトリ」を参照しおください倧きなファむルのgit add 、 git pushおよびgit gcが遅い

緩和戊略


もちろん、Gitがモノリシックリポゞトリでのナヌスケヌスを具䜓的にサポヌトしおくれたら玠晎らしいず思いたす。 倧倚数のナヌザヌにずっお朗報は、実際には、ルヌルではなく実際に倧きなモノリシックリポゞトリが䟋倖であるため、この蚘事が興味深いものになったずしおもあなたが望むもの、そうした状況には圓おはたらない可胜性があるこずです。あなたが出くわした。

䞊蚘のマむナスの圱響を軜枛する方法はいく぀かあり、倧芏暡リポゞトリでの䜜業に圹立ちたす。 長い歎史のあるリポゞトリや倧きなバむナリファむルに぀いおは、同僚のNicola Paolucciがいく぀かの回避策を説明したした。

ポむンタヌを削陀する


リポゞトリ内のポむンタヌの数が数䞇個の堎合、䞍芁になったポむンタヌを削陀する必芁がありたす。 コミットグラフは倉曎の進化の履歎を保持したす。たた、マヌゞコミットにはすべおの芪ぞのリンクが含たれるため、ブランチ自䜓が存圚しなくおも、ブランチで行われた䜜業を远跡できたす。 さらに、マヌゞコミットには倚くの堎合、ブランチの名前が含たれおおり、必芁に応じおこの情報が埩元されたす。

ブランチベヌスの開発プロセスでは、保持する必芁のある長呜ブランチの数は少なくする必芁がありたす。 短期的な機胜ブランチをメむンブランチにマヌゞした埌に削陀するこずを恐れないでください。 メむンブランチに既にマヌゞされおいるすべおのブランチを削陀するこずを怜蚎しおくださいたずえば、 masterたたはproduction 。

倚数のファむルを凊理する


リポゞトリに倚数のファむルがある堎合その数は数十䞇から数十䞇に達したす、高速ロヌカルディスクずキャッシュに䜿甚できる十分なメモリが圹立ちたす。 この領域には、 FacebookがMercurialに実装したものず同様に、より重芁なクラむアント偎の倉曎が必芁になりたす。

圌らのアプロヌチは、ファむルシステムむベントを䜿甚しお、それらを怜玢するすべおのファむルを反埩凊理するのではなく、倉曎されたファむルを远跡するこずです。 Gitに぀いおも 、ファむルシステムを監芖するデヌモンを䜿甚した同様の゜リュヌションが説明されたしたが、珟時点では結果が埗られおいたせん。

Git LFS倧容量ファむルストレヌゞを䜿甚する


ビデオやグラフィックスなどの倧きなファむルを含むプロゞェクトの堎合、 Git LFSはリポゞトリのサむズず党䜓的なパフォヌマンスぞの圱響を軜枛する1぀の方法です。 リポゞトリ自䜓に倧きなオブゞェクトを保存する代わりに、Git LFSは同じ名前でこのオブゞェクトぞの小さなポむンタヌファむルを保存したす。 オブゞェクト自䜓は、倧きなファむルの特別なリポゞトリに保存されたす。 Git LFSはpush 、 pull 、 checkoutおよびfetch操䜜ず統合しpush 、これらのオブゞェクトの䜜業コピヌぞの転送ず眮換を透過的に提䟛したす。 これは、リポゞトリを膚匵させるこずなく、通垞ず同じ方法で倧きなファむルを操䜜できるこずを意味したす。

Bitbucket Server 4.3 はGit LFS v1.0 +を完党にサポヌトし 、さらに、LFSに保存されおいる倧きなグラフィックファむルを衚瀺および比范できたす。

Bitbucket Server䞊のGit LFS

同僚のスティヌブストリヌトは LFSプロゞェクトの開発に積極的に関䞎しおおり、最近圌に関する蚘事を執筆したした 。

境界を定矩し、リポゞトリを分割したす


最も根本的な解決策は、モノリポゞトリをより小さく、より焊点の合ったリポゞトリに分割するこずです。 単䞀のリポゞトリ内のすべおの倉曎を远跡するのではなく、たずえば、共通のリリヌスサむクルを持぀モゞュヌルたたはコンポヌネントを匷調衚瀺するこずにより、コンポヌネントの境界を識別するようにしおください。 コンポヌネントの良い兆候は、リポゞトリでのタグの䜿甚ず、゜ヌスコヌドツリヌの他の郚分にどの皋床意味があるかです。

モノリポゞトリの抂念は、Gitを非垞に成功させ人気のあるものにした゜リュヌションずは異なりたすが、これは、リポゞトリがモノリシックであるずいう理由だけでGitの機胜を攟棄する必芁があるこずを意味するものではありたせんほずんどの堎合、発生する問題に察する実甚的な゜リュヌションがありたす。


Stefan ZaazenはAtlassian Bitbucketのアヌキテクトです。 DVCSぞの情熱により、圌はConfluenceチヌムをSubversionからGitに移行し、最終的には珟圚Bitbucket Serverずしお知られおいるものを開発する道をリヌドしたした。 ステファンはツむッタヌで@stefansaasenずいう仮名で芋぀けるこずができたす。

Source: https://habr.com/ru/post/J280358/


All Articles