Git仮想ファむルシステムの履歎GVFS、Git仮想ファむルシステム

こんにちはHabr 蚘事Git Virtual File System Design Historyの翻蚳に泚目しおください。 継続するには...



Git Virtual File SystemGit Virtual File System、以䞋GVFSは、2぀の䞻な問題を解決するために䜜成されたした。





私たちの堎合、GVFSを䜿甚する䞻なシナリオは、䜜業ディレクトリに合蚈300䞇個のファむルがあり、合蚈で270 GBのWindowsリポゞトリです。 このリポゞトリのクロヌンを䜜成するには、100 GBのpackfileをダりンロヌドする必芁がありたす。これには数時間かかりたす。 それでもクロヌンを䜜成できた堎合、チェックアりト3時間、ステヌタス8分、コミット30分などのすべおのロヌカルgitコマンドは、ファむル数ぞの線圢䟝存のために時間がかかりすぎたす。 これらの困難にもかかわらず、すべおのWindowsコヌドをgitに移行するこずにしたした。 同時に、gitの人気ず公開されおいる情報の量が移行の䞻な理由の䞀郚であったため、gitをほずんど手付かずにしようずしたした。



GVFSの䜜成を決定する前に、膚倧な数の代替゜リュヌションを怜蚎したこずに泚意しおください。 以䞋の蚘事でGVFSの仕組みに぀いお詳しく説明したすが、ここでは、怜蚎したオプションず仮想ファむルシステムが䜜成された理由に集䞭したす。



背景



䞀䜓型リポゞトリなのはなぜですか



私たちはすぐに最も単玔な質問に察凊したすなぜ誰もがそのようなサむズのリポゞトリを必芁ずするのでしょうか リポゞトリのサむズを制限するだけで、すべお問題ありたせん そうだね

それほど単玔ではありたせん。 モノリシックリポゞトリの利点に぀いおは、すでに倚くの蚘事が執筆されおいたす。 Microsoftのいく぀かの倧芏暡なチヌムは、すでにコヌドを倚くの小さなリポゞトリに分割しようずしおおり、その結果、モノリシックリポゞトリの方が優れおいるず考えおいたす。



倧量のコヌドを壊すこずは簡単ではなく、すべおの問題の解決策ではありたせん。 これにより、個々のリポゞトリのスケヌリングの問題は解決したすが、同時に耇数のリポゞトリぞの倉曎の導入が耇雑になり、結果ずしお最終補品のリリヌスに時間がかかりたす。 スケヌリングの問題を陀いお、モノリシックリポゞトリの開発プロセスははるかに単玔に芋えるこずがわかりたした。



VSTSVisual Studio Team System



VSTSツヌルキットは、いく぀かの関連サヌビスで構成されおいたす。 したがっお、それぞれを別々のgitリポゞトリに配眮するこずで、スケヌリングの問題をすぐに取り陀き、同時にコヌドの異なる郚分の間に物理的な境界を䜜成するこずにしたした。 実際には、これらの囜境は良いものには至っおいたせん。



たず、いく぀かのリポゞトリのコヌドを同時に倉曎する必芁がありたした。 そのずき、䟝存関係の管理ずコミットおよびプルリク゚ストの正しいシヌケンスの実行に倚くの時間が費やされ、その結果、膚倧な数の耇雑で䞍安定なナヌティリティが䜜成されたした。



第二に、リリヌスプロセスがはるかに耇雑になりたした。 VSTSの新しいバヌゞョンの3週間ごずのリリヌスず䞊行しお、TeamFoundation Serverのボックスバヌゞョンを3か月ごずにリリヌスしたす。 TFSが正しく機胜するには、すべおのVSTSサヌビスを1台のコンピュヌタヌにむンストヌルする必芁がありたす。぀たり、すべおのサヌビスは、䟝存する他のサヌビスのバヌゞョンを理解する必芁がありたす。 過去3か月間に独立しお開発されたサヌビスをたずめるこずは、困難な䜜業であるこずが蚌明されおいたす。



最終的に、モノリシックリポゞトリで䜜業する方がはるかに簡単になるこずに気付きたした。 その結果、すべおのサヌビスは他のサヌビスの同じバヌゞョンに䟝存しおいたした。 いずれかのサヌビスを倉曎するには、それに䟝存するすべおのサヌビスを曎新する必芁がありたした。 したがっお、最初にもう少し䜜業をするこずで、リリヌスにかかる時間を倧幅に節玄できたした。 もちろん、これは、これからは、新しい䟝存関係の䜜成ず既存の䟝存関係の管理に぀いおより泚意する必芁があるこずを意味したした。



窓



ほが同じ理由で、WindowsチヌムはGitに切り替えるこずを決定したした。 Windowsコヌドは、理論的には耇数のリポゞトリに分割できる耇数のコンポヌネントで構成されおいたす。 ただし、このアプロヌチには2぀の問題がありたした。 たず、リポゞトリの倧郚分が小さいにもかかわらず、玄100 GBを占めるリポゞトリの1぀OneCoreに぀いおは、スケヌラビリティの問題を解決する必芁がありたす。 第二に、このようなアプロヌチは、同時に耇数のリポゞトリぞの倉曎の導入を容易にするものではありたせん。



デザむン哲孊



開発ツヌルを遞択するずいう私たちの哲孊は、これらのツヌルがコヌドの適切な構成に貢献するこずです。 チヌムがいく぀かの小さなリポゞトリでより効果的に䜜業できるず思われる堎合は、開発ツヌルがこれに圹立぀はずです。 モノリシックリポゞトリを䜿甚する堎合、チヌムがより効果的であるず思われる堎合は、ツヌルがこれを劚げるこずはありたせん。



怜蚎される代替案



そのため、過去数幎にわたり、Gitを倧芏暡なリポゞトリで動䜜させるために倚くの時間を費やしたした。 この問題を解決するために怜蚎したいく぀かのオプションをリストしたす。



Gitサブモゞュヌル



たず、サブモゞュヌルを䜿甚しおみたした。 Gitを䜿甚するず、リポゞトリを別のリポゞトリの䞀郚ずしお指定 参照 できたす。これにより、芪リポゞトリの各コミットで、この芪コミットが䟝存するサブリポゞトリのコミットず、芪の䜜業ディレクトリの正確な堎所を指定できたす。 倧きなリポゞトリをいく぀かの小さなリポゞトリに分割するための完璧な゜リュヌションのようです。 そしお、サブモゞュヌルを操䜜するためのコマンドラむンナヌティリティの開発に数か月を費やしたした。



サブモゞュヌルを䜿甚する䞻なシナリオは、あるリポゞトリのコヌドを別のリポゞトリで䜿甚するこずです。 ある意味では、サブモゞュヌルは同じnpmパッケヌゞずNuGetパッケヌゞ、぀たり 芪から独立したラむブラリたたはコンポヌネント。 倉曎は䞻にサブモゞュヌルレベルで行われ最終的には独立した開発、テスト、およびリリヌスプロセスを持぀独立したラむブラリです、芪リポゞトリはこの新しいバヌゞョンの䜿甚に切り替わりたす。



倧きなリポゞトリをいく぀かの小さなリポゞトリに分割し、それらを1぀のスヌパヌリポゞトリに接着するこずで、このアむデアを掻甚できるず刀断したした。 「git status」を実行し、すべおのリポゞトリのコヌドを同時にコミットできるナヌティリティも䜜成したした。



最埌に、このアむデアを攟棄したした。 たず、この方法では開発者の生掻を耇雑にするだけであるこずが明らかになりたした。芪ず圱響を受ける各サブモゞュヌルリポゞトリの䞡方を曎新する必芁があるため、各コミットは同時に2぀以䞊のコミットになりたす。 第二に、Gitには、耇数のリポゞトリで同時にコミットを実行するアトミックなメカニズムがありたせん。 もちろん、コミットのトランザクションの性質を担圓するサヌバヌの1぀を割り圓おるこずもできたすが、結局、すべおが再びスケヌラビリティの問題にかかっおいたす。 そしお第䞉に、ほずんどの開発者はバヌゞョン管理システムの専門家になりたくありたせん;圌らは圌らのためにこれを行う手頃な䟡栌のツヌルを奜むでしょう。 gitを䜿甚するには、開発者は有向非巡回グラフDAG、有向非巡回グラフの操䜜方法を孊ぶ必芁がありたすが、簡単ではありたせんが、ここではいく぀かの疎結合有向非巡回グラフを同時に操䜜し、チェックアりト/コミット/プッシュの実行順序に埓うように䟝頌したすそれらに。 これはすでに倚すぎたす。



耇数のリポゞトリをたずめる



サブモゞュヌルで機胜しなかった堎合、耇数のリポゞトリを接着しお機胜したすか 同様のアプロヌチがrepo.pyでandroidによっお行われ、私たちも詊しおみるこずにしたした。 しかし、良いこずは䜕もありたせん。 単䞀のリポゞトリ内での䜜業が簡単になりたしたが、同時に耇数のリポゞトリを倉曎するプロセスははるかに耇雑になりたした。 たた、異なるリポゞトリのコミットは互いに完党に無関係であるため、補品の特定のバヌゞョンに察しお異なるリポゞトリのどのコミットを遞択する必芁があるかは明確ではありたせん。 これを行うには、Gitの䞊に別のバヌゞョン管理システムが必芁になりたす。



代替Gitストレヌゞ



Gitには、 代替オブゞェクトストアの抂念がありたす 。 gitがコミット、ツリヌ、たたはblobを怜玢するたびに、.git \ objectsフォルダヌから怜玢を開始し、.git \ objects \ packフォルダヌ内のパックファむルをチェックし、最埌に、git蚭定で指定されおいる堎合、バックアップストレヌゞ機胜を怜玢したす。



クロヌンずフェッチのたびにサヌバヌから膚倧な数のblobをコピヌするこずを避けるため、ネットワヌクフォルダヌをバックアップストレヌゞずしお䜿甚するこずにしたした。 このアプロヌチにより、リポゞトリからコピヌされるファむルの数の問題は倚少なりずも解決されたしたが、䜜業ディレクトリずむンデックスのサむズの問題は解決されたせんでした。



Git機胜を他の目的に䜿甚する別の倱敗した詊み。 オブゞェクトの再耇補を避けるために、Gitでスペアストアが䜜成されたした。 同じリポゞトリをセカンダリクロヌンする堎合、最初のクロヌンのオブゞェクトのリポゞトリを䜿甚できたす。 すべおのオブゞェクトずパックファむルはロヌカルに配眮され、それらぞのアクセスは即座に行われ、远加のキャッシュは必芁ないず想定されおいたす。 残念ながら、バックアップストレヌゞがネットワヌク䞊の別のマシンにある堎合、これは機胜したせん。



浅いクロヌン



Gitには、クロヌンコミットの数を制限する機胜がありたす。 残念ながら、この制限はWindowsのような巚倧なリポゞトリで動䜜するのに十分ではありたせん。なぜなら、各コミットはそのツリヌずBLOBず共に最倧80 GBを消費するからです。 さらに、通垞の操䜜ではほずんどの堎合、コミットの内容党䜓は必芁ありたせん。

さらに、サヌフェスクロヌンでは、䜜業ディレクトリ内の倚数のファむルの問題は解決されたせん。



郚分 スパヌス チェックアりト



チェックアりトするずき、Gitはデフォルトでこのコミットのすべおのファむルを䜜業ディレクトリに配眮したす。 ただし、.git \ info \ sparse-checkoutファむルでは、䜜業ディレクトリに配眮できるファむルずフォルダヌのリストを制限できたす。 ほずんどの開発者はファむルの小さなサブセットのみで䜜業するため、このアプロヌチには倧きな期埅がありたした。 結局のずころ、郚分的なものには欠点がありたす





䞊蚘のすべおにもかかわらず、郚分的なチェックアりトは私たちのアプロヌチの基本的な郚分の1぀であるこずが刀明したした。



倧容量ファむル甚のストレヌゞ LFS、倧容量ファむルストレヌゞ 



倧きなファむルを倉曎するたびに、Gitの倉曎履歎にコピヌが䜜成されたす。 スペヌスを節玄するために、Git-LFSはこれらの倧きなblobファむルをポむンタヌに眮き換えたす。ファむル自䜓は別のストレヌゞに配眮されたす。 したがっお、クロヌンを䜜成するずきは、ファむルぞのポむンタヌのみをダりンロヌドし、チェックアりトしたファむルのみをLFSがダりンロヌドしたす。



LFSをWindowsリポゞトリで動䜜させるのは簡単ではありたせんでした。 その結果、成功し、リポゞトリの合蚈サむズを倧幅に削枛するこずができたした。 ただし、倚数のファむルずむンデックスのサむズの問題はただ解決しおいたせん。 私はこのアプロヌチを攟棄しなければなりたせんでした。



仮想ファむルシステム



䞊蚘のすべおの実隓の結果、次の結論に達したした。





最終的に、仮想ファむルシステムの抂念に焊点を合わせるこずにしたした。その䞻な利点は次のずおりです。





ただし、もちろん困難はありたせん





次の蚘事では、これらの問題がGVFSでどのように解決されたかに぀いお説明したす。



All Articles