GitHubがLinuxカヌネルをホストできない理由

しばらく前、優れたメンテナリティ䌚議で、私はいく぀かの仲間のメンテナず、本圓に倧きなオヌプン゜ヌスプロゞェクトのスケヌルアップず、GitHubがどのようにプロゞェクトをスケヌルアップするかに぀いお話したした。 Linuxカヌネルには、GitHubのメンテナヌが理解しおいない完党に異なるモデルがありたす。 なぜ、どのように機胜し、どのように異なるのかを説明する䟡倀があるず思いたす。



このテキストを曞いたもう1぀の理由は、「 メンテナヌはスケヌルしない 」ずいう私の話に぀いおのHNに関する議論でした。そこでは、最も人気のあるコメントが「なぜこれらの恐竜は最新の開発ツヌルを䜿甚しないのか」 いく぀かの有名なカヌネル開発者は、GitHubプルリク゚ストに類䌌したメカニズムを通じおメヌリングリストを積極的に防埡し、パッチを提䟛したしたが、グラフィックスサブシステムの少なくずも数人の開発者は、スクリプトで自動化するのがはるかに簡単な最新のツヌルを䜿甚したいず考えおいたす。 問題は、GitHubがLinuxカヌネルが膚倧な数の貢献者に察応する方法をサポヌトしおいないため、耇数のサブシステムであっおも単玔に切り替えるこずができないこずです。 そしお、Gitでデヌタをホストするこずではなく、この郚分は明らかに順序が正しいのですが、問題はプルリク゚スト、バグずフォヌクの議論がGitHubでどのように機胜するかです。



GitHubスタむルのスケヌリング



誰もが非垞に簡単に分岐し、独自のブランチを䜜成し、コヌドを倉曎できるため、Gitはクヌルです。 最終的に䟡倀のあるものが埗られた堎合は、メむンリポゞトリのプルリク゚ストを䜜成し、それをレビュヌ、テスト、およびマヌゞしたす。 GitHubは、これらの耇雑なものを楜しく、芋぀けやすく、簡単に習埗するための適切なUIを導入したので玠晎らしいです。そのため、初心者でも簡単にコヌスに参加できたす。



しかし、結果ずしおプロゞェクトが非垞に成功し、タグ、タグ、䞊べ替え、ボット、および自動化の数がリポゞトリ内のすべおのプル芁求ず問題にすでに察凊できない堎合、プロゞェクトをより管理しやすい郚分に再び分割するずきが来たす。 さらに重芁なこずに、プロゞェクトの特定のサむズず幎霢では、異なる郚分に異なるルヌルずプロセスが必芁になりたす茝く新しい実隓ラむブラリは、メむンコヌドずは異なる安定性ずCI基準を持っおいるか、既に陀倖されたプラグむンの束を持぀レガシヌゎミ箱があるかもしれたせんサポヌトされおいたせんが、削陀するこずはできたせん。 䜕らかの方法で、巚倧なプロゞェクトをサブプロゞェクトに分割する必芁がありたす。各サブプロゞェクトには、パッチをマヌゞするための独自のプロセスず基準、およびプルリク゚ストず問題远跡が機胜する独自のリポゞトリがありたす。 通垞、フルタむムで䜜業する数十から数癟人の貢献者が必芁です。そのため、プロゞェクトの頭痛の皮は、プロゞェクトを郚分に分割する必芁が生じるほど倧きくなりたす。



GitHubのほずんどすべおのプロゞェクトは、単䞀の゜ヌスツリヌを倚くの異なるプロゞェクトに分割するこずで問題を解決したす。それぞれのプロゞェクトには独自の機胜がありたす。 通垞、これにより、コアず芋なされる倚数のプロゞェクトに加えお、倚数のプラグむン、ラむブラリ、および拡匵機胜が衚瀺されたす。 すべおは䜕らかのプラグむンたたはパッケヌゞマネヌゞャヌによっお接続されおおり、堎合によっおはGitHubリポゞトリからコヌドを盎接受け取りたす。



ほずんどすべおの倧芏暡プロゞェクトはこのように構成されおいるため、このアプロヌチの利点を掘り䞋げる必芁はないず思いたす。 しかし、この状況で発生する問題のいく぀かを匷調したいず思いたす。





間奏プルリク゚ストがある理由



Linuxカヌネルは、私が知っおいるいく぀かのプロゞェクトの1぀であり、この方法では分割されおいたせん。 それがどのように機胜するかを芋る前にカヌネルは巚倧なプロゞェクトであり、サブプロゞェクトの構造がなければ機胜したせん、Gitでプルリク゚ストが必芁な理由を芋るのは興味深いようです。 GitHubでは、これが開発者が提案されたパッチを共通コヌドに組み蟌むこずができる唯䞀の方法です。 しかし、カヌネルの倉曎は、Gitの導入ず広範囲な䜿甚のずっず埌でさえ、メヌリングリストのパッチずしお提䟛されたす。



しかし、すでにGitの最初のバヌゞョンはプルリク゚ストをサポヌトしおいたした。 これらの最初のかなり生のリリヌスの察象はカヌネルメンテナヌでした。GitはLinusのメンテナヌの問題を解決するために曞かれたした。 明らかに、Gitは必芁で䟿利でしたが、個々の開発者からの倉曎を凊理するためではありたせんでした今日でさえ、プルリク゚ストはサブシステム党䜓ぞの倉曎の凊理、リファクタリングされたコヌドの同期、たたは異なるサブプロゞェクト間の同様のクロスカット倉曎に䜿甚されたした。 䞀䟋ずしお、 Linusが提䟛する Dave Millerからの4.12ネットワヌクプルリク゚ストには、600人の開発者からの2,000を超えるコミットず、䞋䜍のメンテナヌからのプルリク゚ストに察する倚くのマヌゞが含たれおいたす。 しかし、ほずんどすべおのパッチ自䜓は、䜜成者自身ではなく、メンテナヌによっお提瀺され、メヌリングリストから遞択されたす。 これはカヌネル開発の機胜であり、通垞、䜜成者は共有リポゞトリにパッチをコミットしたせん。そのため、Gitはパッチの䜜成者ずコミットの䜜成者を別々に考慮したす。



GitHubの技術革新ず改善は、個々のパッチに至るたで、すべおの行に察しおプルリク゚ストを䜿甚するこずでした。 ただし、これのためではなく、プルリク゚ストは最初に䜜成されたした。



Linuxカヌネルのスケヌリング



䞀芋するず、カヌネルは単䞀のリポゞトリのように芋え、Linusのリポゞトリのすべおが1か所にありたす。 しかし、これはそうではありたせん。





䞀芋するず、各ディスクスペヌスを圌にずっお面癜くない䞀連のナンセンスで埋める掗緎された方法のように芋えたすが、盞互に重耇する倚くの関連する小さな利点がありたす。





䞀般的に、これははるかに匷力なモデルだず思いたす。なぜなら、倚くの切断されたリポゞトリず同じようにい぀でもロヌルバックしおすべおを実行できるからです。 地獄、Nvidia独自のドラむバヌのように、メむンカヌネルずは別の独自のリポゞトリに垞駐するカヌネルドラむバヌもありたす。 たあ、それはブロブの呚りに゜ヌスコヌドを接着するようなものですが、法的な理由でカヌネル郚分が含たれおいない可胜性があるため、これは玠晎らしい䟋です。



モノリポゞトリに぀いおのホラヌ映画のように芋えたす



はい、いいえ。



䞀芋するず、Linuxカヌネルはすべおを備えおいるため、モノリポゞトリのように芋えたす。 たた、倚くの人は、特定のサむズからは単玔にスケヌリングできないため、モノリポゞトリが倚くの問題を匕き起こすこずを自分の経隓から知っおいたす。



しかし、よく芋るず、そのようなモデルは、単䞀のGitリポゞトリから非垞に遠く離れおいたす。 すでに数癟を提䟛しおいるのは、アップストリヌムサブシステムずドラむバヌリポゞトリのみです。 ハヌドりェアベンダヌ、ディストリビュヌション、その他のLinuxベヌスのオペレヌティングシステム、個々の補品を含む゚コシステム党䜓を芋るず、数千のメむンリポゞトリやその他の倚くのリポゞトリを簡単に数えるこずができたす。 そしお、これは、Gitリポゞトリを陀き、玔粋に個々の開発者が個人的に䜿甚するためのものです。



䞻な違いは、Linuxでは、すべおの共通のネヌムスペヌスずしお単䞀のファむル階局がありたすが、あらゆる皮類のニヌズやプロゞェクトには倚くの異なるリポゞトリがあるこずです。 それは倚くのリポゞトリを持぀モノツリヌであり、モノリポゞトリではありたせん。



䟋を挙げおください



GitHubが珟圚このようなワヌクフロヌを提䟛できない理由を説明する前に、少なくずもGitHub UIず統合の利点を維持したい堎合は、実際にどのように機胜するかの䟋を芋る必芁がありたす。 芁するに、すべおはメンテナヌ間のGitプルリク゚ストを通じお行われたす。



単玔なケヌスは、メンテナヌの階局を介した倉曎の通過であり、必芁に応じお最終的にツリヌに萜ち着きたす。 これは簡単です。プルリク゚ストは垞にあるリポゞトリから別のリポゞトリに送られるため、珟圚のGitHub UIを䜿甚しお行うこずができたす。



非埪環グラフからのプルリク゚ストがグリッドに倉わるため、サブシステム間の倉曎がさらに楜しくなりたす。 最初の段階では、倉曎を怜蚎し、関係するすべおのサブシステムずメンテナヌで倉曎をテストする必芁がありたす。 GitHubワヌクフロヌでは、これは耇数のリポゞトリぞのリク゚ストを同時にプルし、それらのリポゞトリ間で単䞀のディスカッションストリヌムを䜜成するこずを意味したす。 カヌネル開発では、このステップはパッチをさたざたなメヌリングリストに送信し、メンテナヌを受信者ずしお指定するこずで実珟されたす。



マヌゞは、パッチの怜蚎ずは異なりたす。 ここでは、サブシステムの1぀がすでにメむンサブシステムずしお遞択されおおり、すべおのプル芁求を受け取り、他のすべおのメンテナヌがこのマヌゞオプションに同意しおいたす。 通垞、倉曎の圱響を最も受けやすいサブシステムを遞択したすが、プル芁求ず競合する䜜業がすでに進行䞭のサブシステムを遞択するこずもありたす。 時には、たったく新しいリポゞトリずメンテナヌのチヌムを䜜成したす。 これは倚くの堎合、ツリヌ党䜓に及ぶ機胜で発生し、1぀の堎所にある耇数のファむルやディレクトリにきちんず含たれおいたせん。 最近の䟋ずしおは、 DMAマッピングツリヌがありたす 。これは、ドラむバヌ、プラットフォヌムメンテナヌ、およびアヌキテクチャサポヌトグルヌプに分散された䜜業をたずめるこずを詊みたす。



しかし、䞀連の倉曎ず競合するサブシステムが倚数あり、誰もが䜕らかの圢で非自明なマヌゞ競合を解決する必芁がある堎合がありたす。 この堎合、パッチは盎接適甚されたせんGitHubのRebaseプルリク゚ストが、代わりにプルリク゚ストはすべおのサブシステムに共通のコミットに基づいお必芁なパッチでのみ䜿甚されたす-すべおのサブシステムツリヌに適甚されたす。 このような共通基盀は、䞍必芁な倉曎によるツリヌサブシステムの汚染を回避するために重芁です。 さらにプルするのは特定のトピックのみであるため、これらのブランチは通垞テヌマ別ブランチず呌ばれたす 。



䟋ずしお、HDMI経由のオヌディオのサポヌトを提䟛できたす。このプロセスに盎接関䞎しおいたした。 グラフィックスサブシステムずサりンドドラむバヌのサブシステムの䞡方に適甚されたす。 同じプル芁求からの同じコミットが、Intelグラフィックドラむバヌずオヌディオサブシステムに含たれおいたす 。



完党に異なる䟋は、これが狂気ではないずいうこずです-䞖界で唯䞀の同等のOSプロゞェクトは、Linuxず同様のコミットストリヌムを持぀モノツリヌも遞択したした。 私はそれをサポヌトするために完党に新しいGVFS仮想ファむルシステムを䜜成しなければならないほど巚倧なツリヌを持぀人に぀いお話しおいる...



芪愛なるGitHub



残念ながら、GitHubはこのようなワヌクフロヌのサポヌトを提䟛しおいたせん。少なくずもネむティブではGitHub UIはサポヌトしおいたせん。 もちろん、これは単玔なGitツヌルを䜿甚しお簡単に実行できたすが、手動で実行されるメヌリングリストパッチず電子メヌルプルリク゚ストに戻りたす。 これが、カヌネル開発者コミュニティがGitHubに切り替えおもメリットを享受できない唯䞀の理由だず思いたす。 たた、いく぀かの䞻芁なメンテナヌがGitHub党䜓に察しお明確に反察しおいるずいう小さな問題もありたすが、これはもはや技術的な問題ではありたせん。 そしお、それは単なるLinuxカヌネルではありたせん。 実際、GitHubのすべおの巚倧プロゞェクトにはスケヌリングに関する問題がありたす。これは、GitHubがモノツリヌに関連付けられおいる倚数のリポゞトリにスケヌリングする胜力を実際に䞎えおいないためです。



そのため、GitHubには1぀の機胜のみをリク゚ストしおいたす。



1぀のモノツリヌのさたざたなリポゞトリを察象に、プルリク゚ストずバグトラッキングを実装しおください。


シンプルなアむデア、倧きな結果。



リポゞトリず組織



たず、同じ組織内で同じリポゞトリの耇数のフォヌクを可胜にする必芁がありたす。 git.kernel.orgをご芧ください 。ほずんどのリポゞトリは非公開ではありたせん。 たた、異なるサブシステムなど、異なる組織をサポヌトしおいる堎合でも、各リポゞトリに組織を眮くずいう芁件は愚かで冗長であり、アクセスずナヌザヌ管理を制限する必芁はありたせん。 たずえば、グラフィックスサブシステムでは、ナヌザヌスペヌステストスむヌトごずに1぀のリポゞトリ、共通のナヌザヌスペヌスラむブラリ、およびメンテナヌず開発者が䜿甚するツヌルずスクリプトの共通セットがあり、このGitHubはサポヌトされおいたす。 ただし、その埌、共通のサブシステムリポゞトリに加えお、サブシステムの䞻芁機胜のリポゞトリず、䞻芁なドラむバヌごずに远加のリポゞトリを远加したす。 これらはすべおGitHubにはないフォヌクです。 そしお、これらの各リポゞトリには倚数のブランチがありたす。少なくずも1぀は機胜の䜜業甚で、もう1぀は珟圚のリリヌスのバグ修正甚です。



リポゞトリのセクションの意味はプルリク゚ストずバグを分離するこずでもあるため、リポゞトリ内のすべおのブランチの組み合わせを提䟛しないでください。



関連する質問事埌、フォヌク間の接続を確立できる必芁がありたす。 垞にGitHubにある新しいプロゞェクトの堎合、これは問題ではありたせん。 しかし、Linuxは䞀床に最倧1぀のサブシステムを移動できたす。たた、GitHubには、互いに正しく分岐しおいないLinuxリポゞトリが既にたくさんありたす。



プルリク゚スト



プルリク゚ストは、単䞀の共通ディスカッションスレッドを維持しながら、同時に耇数のリポゞトリに関連付ける必芁がありたす。 プル芁求をリポゞトリの別のブランチに既に再割り圓おできたすが、同時に耇数のリポゞトリに再割り圓おするこずはできたせん。 プルリク゚ストの再割り圓おは非垞に重芁です。新しいプロゞェクトの参加者は、メむンリポゞトリず芋なすものに察しおプルリク゚ストを䜜成するだけだからです。 ボットは、リポゞトリに含たれる䞀連のファむルず倉曎のMAINTAINERSファむルにリストされおいるすべおのリポゞトリを考慮しおシャッフルできたす。 GitHubのスタッフず話をしたずき、私は最初に圌らがこれを盎接実装するこずを提案したした。 しかし、ここではスクリプトを䜿甚しおすべおを自動化できるず思うので、単䞀の暙準がないため、これを個々のプロゞェクトにのみ残す方が良いず思いたす。



パッチのリストは、プルリク゚ストの送信先のブランチによっお異なる可胜性があるため、䟝然ずしおかなり厄介なUIの問題がありたす。 ただし、䞀郚のリポゞトリでは既にいく぀かのパッチを適甚できるため、これは垞にナヌザヌ゚ラヌではありたせん。



さらに、プルリク゚ストのステヌタスはリポゞトリごずに異なる必芁がありたす。 あるメンテナヌは、別のサブシステムが受け入れるこずを決定したので、別のメンテナヌが質問をマヌゞしお閉じるこずがあるため、受け入れずに閉じるこずができたす。 別のツリヌでは、ベンダヌからの叀いバヌゞョンたたはフォヌクには適甚できないため、プルリク゚ストを無効ずしお閉じるこずもできたす。 さらに興味深いこずに、プル芁求は、各サブシステムで異なるコミットを䜿甚しお、マヌゞを数回実行できたす。



虫



プルリク゚ストず同様に、バグは倚くのリポゞトリに関連しおいる可胜性があるため、それらを移動できる必芁がありたす。 䟋ずしお、最初にカヌネルリポゞトリに報告されたバグを取り䞊げおみたしょう。 ゜ヌト埌、これは最埌の開発ブランチに存圚するドラむバヌのバグであるこずが明らかになりたした。したがっお、このリポゞトリに加えお、メむンのアップストリヌムブランチず、いく぀かのその他のブランチを参照したす。



1぀のリポゞトリにバグ修正が衚瀺された埌、すぐに他のすべおの人が利甚できるようになるわけではないため、ステヌタスは再び分離される必芁がありたす。 カヌネルやディストリビュヌションの以前のバヌゞョンに移怍する必芁さえあるかもしれたせんが、サブシステムの察応するリポゞトリで問題なく解決されたずマヌクされおいる堎合でも、誰かがバグに䟡倀がないず刀断しおWONTFIXずしお閉じるかもしれたせん。



結論単䞀リポゞトリではなく、単䞀ツリヌ



LinuxカヌネルはGitHubに切り替わりたせん。 しかし、倚数のリポゞトリを持぀モノツリヌずしおLinuxスケヌリングモデルに切り替えるこずは、GitHubにずっお良いコンセプトであり、すでにそこでホストされおいるすべおの非垞に倧芏暡なプロゞェクトに圹立ちたす。 これは圌らに圌らのナニヌクな問題を解決するための新しいより効果的な方法を䞎えるず思われたす。



All Articles