[解決済み] 企業におけるGitベースのソース管理。推奨されるツールとプラクティス?
質問
私は個人的なプロジェクトでgitを使用しており、素晴らしいものだと思っています。高速で、柔軟で、強力で、リモート開発には最適です。
しかし今、仕事場ではそれが義務付けられ、率直に言って、問題を抱えています。
特に、Perforce や Subversion のような他のソース管理システムと比較すると、そのような環境を対象としています。(そう、Linus がそのようなことを意図していないことは知っています)。
しかし - 政治的な理由から - 私たちは git に固執しています。たとえそれが、私たちがそれでやろうとしていることに対して最悪であったとしても。
以下は、私たちが目にしていることの一部です。
- GUI ツールが成熟していない
- コマンドライン ツールを使用すると、マージを失敗して他の人の変更を消してしまうことが非常に多い
- グローバルな読み取り専用または読み取り/書き込み権限を超える、ユーザーごとのリポジトリ権限を提供しない。
- リポジトリの任意の部分に対する権限を持っている場合、リポジトリのすべての部分に対して同じことを行うことができます。したがって、中央サーバーに他の人がいじくることができない小さなグループ追跡ブランチを作成するようなことはできません。
- 何でもあり」または「慈悲深い独裁者」以外のワークフローは、強制することはおろか、奨励することも困難です。
- 単一の大きなリポジトリ (誰もがすべてに手を出すことができる) を使用するのが良いのか、それともコンポーネントごとのリポジトリ (バージョンを同期させようとすると頭痛の種になる) をたくさん使用するのが良いのか、明確ではありません。
- 複数のリポジトリを使用すると、中央リポジトリから取得することによって他の誰かが持っているすべてのソースを複製する方法や、昨日の午後 4:30 時点のすべてを取得するようなことを行う方法についても明確ではありません。
しかし、大規模な開発組織でgitをうまく使っている人がいると聞いたことがあります。
もしあなたがそのような状況にあるのなら、あるいは一般的に、コマンドラインを好まない人々がいる大規模な組織で git をより簡単に、より生産的に使うためのツールやヒントやトリックを持っているなら、私はあなたが何か提案するのを聞くのが大好きです。
ところで、私は LinkedIn ですでにこの質問のバージョンを尋ねましたが、本当の答えは得られませんでした。
UPDATE: はっきりさせましょう...
私が働いているところでは、git 以外は使えません。 . それは選択肢ではありません。git に縛られています。mercurial, svn, bitkeeper, Visual Source Safe, ClearCase, PVCS, SCCS, RCS, bazaar, Darcs, monotone, Perforce, Fossil, AccuRev, CVS, あるいは 1987 年に私が使った Apple の good ol' Projector も使うことができません。ですから、他の選択肢を議論するのは歓迎しますが。 git について議論しないなら、賞金をもらうことはできないでしょう。
また、私が探しているのは 企業で git を使用する方法についての実用的なヒントを探しています。 . 私はこの質問の一番上に、私たちが抱えている問題の洗濯物リストを載せました。繰り返しになりますが、人々が理論について議論することは歓迎されますが もしあなたが賞金を稼ぎたいなら、解決策を教えてください。
どのように解決するのですか?
一般的な意見に反して、DVCS を使用することは、非常に柔軟なワークフローを可能にするため、企業環境では理想的な選択だと私は思います。最初に DVCS と CVCS の使い分け、ベストプラクティス、そして特に git についてお話します。
企業におけるDVCSとCVCSの比較。
ここでは、一般的な長所/短所について話すことはしませんが、むしろあなたのコンテキストに焦点を当てます。DVCS を使用すると、集中型システムを使用するよりも規律正しいチームが必要になるというのが、一般的な考え方です。これは、集中型システムを使用すると、次のような簡単な方法が得られるからです。 強制する ワークフローを実施する簡単な方法を提供するからです。一方、分散型システムを使用するには より多くのコミュニケーション そして、確立された慣習を守るための規律が必要です。これはオーバーヘッドを誘発するように見えるかもしれませんが、私は、それを良いプロセスにするために必要なコミュニケーションの増加という点で有益だと考えています。あなたのチームは、コード、変更、そして一般的なプロジェクトの状況についてコミュニケーションをとる必要があります。
規律という文脈におけるもうひとつの側面は、分岐や実験を奨励することです。Martin Fowlerの最近のBlikiエントリからの引用です。 バージョン管理ツールについて 彼はこの現象について非常に簡潔な説明を見つけました。
DVCSは実験のための素早い分岐を推奨しています。 実験ができます。Subversionでもブランチ を行うことができますが、ブランチが が全員に見えるという事実があります。 実験的な作業のためにブランチをオープンすることを 実験的な作業のためにブランチを開くことを躊躇させてしまいます。同様に、DVCS は作業のチェックポイントを推奨しています。 不完全な変更をコミットすると コンパイルもテストも通らないような不完全な変更をローカルリポジトリにコミットすることです。 ローカルリポジトリにコミットすることです。ここでも の開発者ブランチでこれを行うこともできます。 Subversion の開発者用ブランチでこれを行うこともできますが、このような ブランチが共有スペースにあるため の開発者ブランチで行うこともできますが、そのようなブランチは共有スペースにあるという事実が、人々がそうする可能性を低くしています。
DVCS は、単純なテキストの差分ではなく、有向無サイクルグラフ (DAG) のグローバルにユニークな識別子によるチェンジセットの追跡を提供するので、柔軟なワークフローを可能にします。これにより、チェンジセットの起源と履歴を透過的に追跡することができ、これは非常に重要なことです。
ワークフロー。
ワークフロー:
Larry Osterman (Windows チームで働く Microsoft の開発者) が 偉大なブログ投稿 で、Windows チームで採用しているワークフローについて述べています。最も注目すべきは、彼らが
- クリーンで高品質なコードのみのトランク (マスター リポジトリ)
- すべての開発はフィーチャーブランチで行われる
- フィーチャーチームはチームレポジトリを持つ
- 彼らは定期的に最新のトランクの変更を自分たちの機能ブランチにマージしています ( フォワードインテグレート )
- 完全な機能は、レビュー、テストカバレッジ、Q&A などのいくつかの品質ゲートに合格しなければなりません (リポジトリは独自に作成します)。
- 機能が完成し、許容できる品質であれば、トランクにマージされます ( リバースインテグレート )
ご覧のように、これらのリポジトリがそれぞれ独立して存在することで、異なるチームが異なるペースで進めることを切り離すことができます。また、柔軟な品質管理システムを実装できることも、DVCSとCVCSの違いです。このレベルでは、パーミッションの問題を解決することもできます。マスターリポジトリにアクセスできるのは、ほんの一握りの人だけであるべきです。各階層ごとに、対応するアクセスポリシーを持つ別のレポを用意します。実際、この方法はチームレベルでは非常に柔軟性があります。チーム内でチームリポジトリを共有するか、チームリーダーのみがチームリポジトリにコミットできるような、より階層的なアプローチを取るかは、各チームに任せるべきでしょう。
(画像はJoel Spolskyの hginit.com .)
しかし、この時点で1つのことが言われています:- DVCSが素晴らしいマージ機能を提供しているにもかかわらず、これは 決して であり、継続的インテグレーションの代わりにはなりません。その場合でも、非常に大きな柔軟性を持っています。トランク レポの CI、チーム レポの CI、Q&A レポの CI などです。
エンタープライズ・コンテキストにおけるGit。
Gitは、あなたがすでに指摘したように、エンタープライズ・コンテキストにとって理想的なソリューションではないかもしれません。あなたの懸念のいくつかを繰り返しますが、最も顕著なのは次のようなものだと思います。
-
-
現在、Windows では github Windows クライアント , トータスギット , atlassian からのソースツリー - 成熟した GUI ツールの欠如、ファーストクラスの vdiff/merge ツールの統合がない
- 内部動作の上に非常に低い抽象化レベルを持つ一貫性のないインターフェイス
- svn ユーザーのための非常に急な学習曲線
- Git は非常に強力であり、そのため 簡単 に変更することができ、何をしているのかわからないと非常に危険です(わかっているつもりでも、時にはそうなってしまいます)。
- 商用サポート オプションはありません。
ここで git 対 hg の対立を始めたくはありません。あなたは DVCS に切り替えることで、すでに正しいステップを踏んでいるのです。Mercurial は上記のいくつかの点を解決しており、そのため企業のコンテキストにはより適していると思います。
- Python が動作するすべてのプラットフォームがサポートされています。
- すべての主要なプラットフォーム (win/linux/OS X) 上の優れた GUI ツール、ファーストクラスのマージ/vdiff ツールの統合
- 非常に一貫したインターフェイス、svn ユーザーへの移行が容易
- git ができることのほとんどを行うことができますが、よりきれいな抽象化を提供します。危険な操作は常に明示されます。高度な機能は、明示的に有効にする必要がある拡張機能によって提供されます。
- 商用サポートあり があります。
要するに、企業で DVCS を使用する場合、摩擦が最も少ないツールを選択することが重要だと思います。移行を成功させるためには、開発者間のさまざまなスキル (VCS に関して) を考慮することが特に重要です。
摩擦を減らすこと。
さて、あなたがこの状況に本当に困っているように見えるので、IMHOに残された選択肢は2つです。 git をより複雑にしないためのツールはありません。 は は複雑なのです。これに立ち向かうか、gitを使いこなすかです。
- チーム全体のためにgitの入門コースを用意しましょう。これには基本的なことのみと、いくつかの演習(重要!)が含まれるべきです。
- master リポジトリを svn に変換し、"young-stars" にさせます。 git-svn . これにより、ほとんどの開発者が使いやすいインターフェイスを手に入れることができ、チーム内の規律の欠如を補うことができます。
正直なところ、ツールの問題というよりも、本当に人の問題だと思います。この状況を改善するためにできることは何でしょうか?
- 現在のプロセスが保守可能なコードベースで終わると考えていることを明確にする必要があります。
- 継続的インテグレーションにいくらかの時間を投資する。上で説明したように、どのような VCS を使用しているかに関係なく、CI に代わるものは決してありません。あなたは、マスター リポジトリにゴミを押し込む人がいると述べました。赤色警報が鳴り、ビルドを破壊した (または品質メトリックや何かを満たしていない) ことを非難している間、彼らに彼らのがらくたを修正させます。
-
関連
-
git pull エラー: .git/FETCH_HEAD を開けない: パーミッションが拒否されました。
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み] Gitで特定のリビジョンから単一のファイルを取得する方法とは?
-
[解決済み] Git で単一のブランチをクローンする方法を教えてください。
-
[解決済み] Git から認証情報を削除する
-
[解決済み] Git による大規模なバイナリファイルの管理
-
[解決済み】Gitで複数のコミットの著者名やコミッター名、Eメールを変更する方法は?
-
[解決済み] チェリーピックのコンフリクトを解決するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[git push] 解決策: ! [リモート拒否] master -> master (受信前のフックは拒否されました)
-
fatal: リモート参照マスタが見つかりませんでした。
-
git pushで "Updates were rejected because your current branch is behind "というエラーが報告される。
-
Git学習まとめ(2)コミットには何も追加されていないが、未追跡のファイルは存在する
-
コミットメッセージが空だったため、コミットを中止する git commit
-
[解決済み] 単一ファイルのマージをやり直す
-
[解決済み] なぜgit AuthorDateはCommitDateと違うのですか?
-
[解決済み] CVS から Git への移行: $Id$ 相当?
-
[解決済み] ローカルレポとリモートレポを接続する
-
[解決済み] Git Repo から既存のファイルを削除する