これが私がgitについて好きではないことです:
まず第一に、分散されたアイデアは現実に直面して飛んでいると思います。実際にgitを使用している人は誰でも、Linus Torvaldsを含め、一元化された方法で使用しています。カーネルが分散して管理されている場合、「公式」カーネルソースを実際にダウンロードできなかったことを意味します。つまり、カーネルソースはありません。LinusバージョンとJoeバージョンのどちらが必要かを判断する必要があります。またはビルのバージョン。それは明らかにばかげているでしょう、そしてそれが一元化されたワークフローを使用してLinusが制御する公式の定義がある理由です。
一元化された定義が必要であることに同意すると、サーバーとクライアントの役割が完全に異なることが明らかになるため、クライアントとサーバーソフトウェアを同じにする必要があるという教義は純粋に制限されます。クライアントとサーバーのデータが同じでなければならないという教義は、特に誰も気にしないが誰もがクローンを作成しなければならない15年の歴史を持つコードベースでは、明らかにばかげています。
私たちが実際にやりたいのは、通常のVCSと同じように、古いものをすべて食器棚に入れて、そこにあることを忘れることです。gitが毎日ネットワークを介してそれを前後に運ぶという事実は、それを整理するようにあなたを悩ませるので、非常に危険です。その剪定は多くの退屈な決定を伴い、それはうまくいかない可能性があります。したがって、人々はおそらく履歴のさまざまなポイントから一連のスナップショットリポジトリ全体を保持しますが、そもそもソース管理の目的ではなかったのでしょうか。この問題は、誰かが分散モデルを発明するまで存在しませんでした。
Gitは積極的に人々に歴史を書き直すことを奨励しており、上記がおそらくその理由の1つです。通常のVCSはすべて、管理者以外のすべてのユーザーが履歴を書き換えることを不可能にし、管理者がそれを考慮する理由がないことを確認します。私が間違っている場合は訂正してください。しかし、私が知る限り、gitは通常のユーザーに書き込みアクセスを許可する方法を提供していませんが、履歴の書き換えを禁止しています。つまり、恨みを持っている開発者(またはまだ学習曲線に苦労している開発者)は、コードベース全体を破壊する可能性があります。どうやってそれを締めますか?さて、あなたは歴史全体の定期的なバックアップを作成します、すなわちあなたは歴史を二乗し続けるか、またはあなたは電子メールですべてのdiffを受け取りそしてそれらを手でマージするいくつかの貧しいsodを除いてすべてへの書き込みアクセスを禁止します。
資金が豊富で大規模なプロジェクトの例を見て、gitがどのように機能しているかを見てみましょう:Android。私はかつてAndroidシステム自体で遊ぶことにしました。私は、repoと呼ばれる一連のスクリプトを使用してgitを取得することになっていることを知りました。一部のリポジトリはクライアントで実行され、一部はサーバーで実行されますが、どちらもその存在自体から、gitがどちらの容量でも不完全であるという事実を示しています。何が起こったのかというと、私は約1週間ソースを引き出すことができず、その後完全に諦めました。いくつかの異なるリポジトリから本当に膨大な量のデータを取得する必要がありましたが、サーバーは私のような人々で完全に過負荷になりました。レポはタイムアウトしていて、タイムアウトしたところから再開できませんでした。gitが非常に配布可能である場合、あなたはそれらが dは、その1台のサーバーの負荷を軽減するために、ある種のピアツーピア処理を実行しました。Gitは配布可能ですが、サーバーではありません。Git + repoはサーバーですが、repoは配布可能ではなく、ハックのアドホックコレクションにすぎません。
gitの不十分さの同様の例は、gitolite(および明らかにうまく機能しなかったその祖先)です。Gitoliteは、gitサーバーの展開を容易にすることとしてその仕事を説明しています。繰り返しになりますが、このことの存在自体が、gitがサーバーではなく、クライアントであるということを証明しています。さらに、それがどちらかに成長した場合、それはその創設の原則を裏切ることになるので、決してそうなることはありません。
配布されたものを信じていたとしても、gitはまだ混乱しているでしょう。たとえば、ブランチとは何ですか?リポジトリのクローンを作成するたびに暗黙的にブランチを作成すると言われていますが、それは単一のリポジトリのブランチと同じにすることはできません。つまり、少なくとも2つの異なるものがブランチと呼ばれています。ただし、レポで巻き戻して編集を開始することもできます。それは2番目のタイプのブランチのようなものですか、それともまた違うものですか?多分それはあなたが持っているレポのタイプに依存します-そうそう-どうやらレポはあまり明確な概念でもありません。普通のものとむき出しのものがあります。ベアパーツがソースツリーと同期しなくなる可能性があるため、通常のパーツにプッシュすることはできません。しかし、彼らがそれについて考えていなかった裸の1つのcosにcvsimportすることはできません。したがって、通常のものにcvsimportする必要があります。それを開発者がヒットしたベアのものに複製し、cvsexportをcvsワーキングコピーにエクスポートします。これはまだcvsにチェックインする必要があります。誰が気になりますか?これらすべての合併症はどこから来たのですか?配布されたアイデア自体から。これらの制限をさらに課していたので、最終的にジトライトを捨てました。
Gitは、分岐は軽いはずだと言っていますが、多くの企業はすでに深刻な不正な分岐の問題を抱えているので、分岐は厳格なポリシングを伴う重大な決定であるべきだと思いました。これは、PERFORCEが本当に輝いているところです...
PERFORCEでは、非常に機敏な方法でチェンジセットを調整できるため、ブランチが必要になることはめったにありません。たとえば、通常のワークフローでは、メインラインで最後に確認された正常なバージョンに同期してから、機能を記述します。ファイルを変更しようとすると、そのファイルの差分が「デフォルトのチェンジセット」に追加されます。チェンジセットをチェックインしようとすると、メインラインからのニュースをチェンジセットに自動的にマージ(事実上リベース)してからコミットします。このワークフローは、理解していなくても実施できます。このように、Mainlineは変更の履歴を収集します。これは、後で簡単に選択できます。たとえば、古いもの、たとえば前のものを前のものに戻したいとします。問題のある変更の前の瞬間に同期し、影響を受けるファイルを変更セットの一部としてマークし、直後に同期し、「alwaysmine」とマージします。(そこには非常に興味深いものがありました。同期は同じことを意味するわけではありません。ファイルが編集可能である場合(つまり、アクティブなチェンジセット内)、同期によって破壊されることはありませんが、解決の期限としてマークされます。)これで次のようになります。問題のあるものを元に戻すチェンジリスト。後続のニュースにマージすると、メインラインの上に配置して目的の効果を得ることができるチェンジリストがあります。どの時点でも、履歴を書き換えることはありませんでした。後続のニュースにマージすると、メインラインの上に配置して目的の効果を得ることができるチェンジリストがあります。どの時点でも、履歴を書き換えることはありませんでした。後続のニュースにマージすると、メインラインの上に配置して目的の効果を得ることができるチェンジリストがあります。どの時点でも、履歴を書き換えることはありませんでした。
さて、このプロセスの途中で、誰かがあなたに駆け寄り、すべてを削除してバグを修正するように指示します。デフォルトのチェンジリストに名前(実際には番号)を付けてから「一時停止」し、空になったデフォルトのチェンジリストのバグを修正してコミットし、名前付きチェンジリストを再開します。さまざまなことを試すときに、一度に複数のチェンジリストを一時停止するのが一般的です。簡単でプライベートです。メインラインにマージすることから先延ばしにしたり、鶏肉にしたりする誘惑なしに、ブランチレジームから本当に欲しいものを手に入れることができます。
理論的にはgitで同様のことを行うことは可能だと思いますが、gitは、承認されたワークフローを主張するのではなく、実質的に何でも可能にします。集中型モデルは、無効な一般化である分散型モデルに関連する一連の有効な簡略化です。それは非常に一般化されているので、基本的には、リポジトリのように、その上にソース管理を実装することを期待しています。
もう1つはレプリケーションです。gitでは、何でも可能であるため、自分で理解する必要があります。PERFORCEでは、事実上ステートレスキャッシュを取得します。知る必要がある唯一の構成はマスターがどこにあるかであり、クライアントは自分の裁量でマスターまたはキャッシュのいずれかを指すことができます。それは5分間の仕事であり、間違いはありません。
また、コードレビュー、Bugzilla参照などをアサートするためのトリガーとカスタマイズ可能なフォームがあり、もちろん、実際にそれらが必要な場合のブランチがあります。明確なケースではありませんが、近くにあり、セットアップと保守が非常に簡単です。
全体として、誰もが行うように一元化された方法で作業することがわかっている場合は、それを念頭に置いて設計されたツールを使用する方がよいと思います。ライナスの恐ろしいウィットと羊のようにお互いを追いかける傾向があるため、Gitは過大評価されていますが、その主な存在理由は実際には常識に反しており、それに従うことでgitは自分の手を結び付けます(a)ソフトウェアと(b)データはクライアントとサーバーの両方で同じでなければならないという2つの巨大な教義は、集中化された仕事では常に複雑で不十分なものになります。