web-dev-qa-db-ja.com

Gitワークフロー:サーバーなし

gitは分散システムであると想定されていますが、Googleで見つけたすべてのチュートリアルとベストプラクティスワークフローは、サーバー(通常はgithub、または独自のセットアップ)を使用することをお勧めします

私はgitを小さな個人プロジェクト(2〜3人)に使用しています。チームメンバーのマシン間で変更を直接同期するためのベストプラクティスワークフローを見つけることができます。あるいは、なぜこれを避けて代わりに「中央」サーバーを設定する必要があるのか​​、いくつかの説得力のある議論は何ですか?

ありがとう、
ベン

49
Ben Page

「サーバー」の意味に依存します。 Gitは中央サーバーがなくても問題なく機能しますが、多くのチームは中央リポジトリを使用すると便利です。

「サーバー」が「サーバーソフトウェアのインストール」を意味する場合、gitは特殊なソフトウェアなしで、sshを介して、またはファイルシステム上で動作します(中央リポジトリかどうか)。

可能なワークフローについてはこのドキュメントを参照

共通リポジトリーを使用したワークフロー

多くのユーザーが使用するワークフローは、すべての開発者が変更を共通のリポジトリに「プッシュ」(送信)し、そのリポジトリからすべての変更を取得することです。このようなもの:

  • 開発者Aは中央にプッシュします
  • 開発者Bが中央にプッシュ
  • 開発者Cがプル(AおよびBから変更を取得)
  • 開発者Aがプル(Bから変更を取得)
  • ...

この場合、中央リポジトリはDevelopersコンピューターの1つ、github、またはその他の場所に配置できます。

電子メールを使用したワークフロー

サーバーなしでgitを使用することもできます。メールを使用するだけです。この場合、フローは次のようになります。

  • 開発者Aは変更をメールでチームに送信します
  • 他の開発者はメールからの変更を適用します

これは半自動化された方法でも実行できます

中央サーバーなしのワークフロー

複数の「リモート」リポジトリを使用するようにgitをセットアップできます。警告は、neverチェックアウトするリポジトリ(つまり、誰かが作業している開発者コピー)にプッシュする必要があるということです。この場合、フローは次のようになります。

  • 開発者Aが変更を加える
  • 開発者Bが変更を行う
  • 開発者CはAから変更をプルします
  • 開発者CはBから変更をプルします
  • 開発者BはAから変更をプルします
  • ...
  • 誰もプッシュしてはいけません

私見このタイプのワークフローは、すぐに混乱と故障につながります。

41
averell

最初に行う必要があるのは、すでにどのようなワークフローがあるかを考え、それを使用するようにgitを構成することです。何かを実行したら、それを微調整できます。別のコンピューターをサーバーとしてセットアップする必要はありません。中央リポジトリを使用することに慣れている場合は、誰もがプッシュするベアリポジトリを作成するだけです。なぜローカルネットワーク上にないのですか?

中央レポ:

mkdir foo.git
cd foo.git
git init --bare

あなたのレポ:

mkdir foo
cd foo
git init
// add files
git add .
git commit -m "Initial commit"
git remote add Origin //path/to/central/repo/foo.git
git Push Origin master

その他のリポジトリ:

git clone //path/to/central/repo/foo.git

これで、誰でもmasterブランチから直接プッシュおよびプルできます。これで開始できます。

20
ralphtheninja

必ずしもどこかに物理サーバーにコピーを置く必要はありませんが、どこかに「祝福された」リポジトリがあると助けになるかもしれません-チームの1人を(おそらくローテーションで)人々の変更を収集して管理する責任を負わせる最終として扱われる準備ができています。通常のリポジトリにブランチを保持するか、ローカルシステムに別のリポジトリを維持してマスターソースを保存できます。

具体的な例として、LinuxとLinus Torvaldsを考えてみてください-誰もがプッシュする中央リポジトリはありませんが、Linusは、「準備ができている」と考えるすべてのコードを含むリポジトリを維持しています(そして、「準備完了」)。そうすれば、コードの内容の標準的な定義と、リリースを定義する場所が得られます。

10
Andrew Aylett

中央サーバーは、技術的なものではなく、ソーシャル構造として設定する必要があります。そうすることで、混乱の可能性なしに、誰もが最新の公式バージョンを見つける場所を知ることができます。

前述のように、Gitは中央集中型サーバーがなくても非常にうまく機能します。ただし、中央サーバーを使用する正当な理由は、他の開発者がローカルマシンにアクセスしなくてもプルできる機能が完成したら、コードをプッシュする「常にオン」の場所を確保することです。

たとえば、現在私は3人の開発チームで働いています。私たちは皆ラップトップで作業しています。互いのマシンからプルするだけのワークフローを作成できます。しかし、機能に取り組んで、全員がオフィスを出た後にチャンスをコミットし、ラップトップがオンになっていてネットワーク上で利用可能になっていない限り、彼らはこのシステムを見てもらいたいと思っています。もし彼らが私よりも早く現れたら(いつもそうする)、彼らは私のラップトップがオンラインに戻るまで待たなければならない。

BitBucketやGitHubのようなもの、またはオフィスの常時接続サーバーにプッシュする場合、他の開発者は、次にオンラインになったときに行った変更を簡単に取得できます。

それが私にとって中央サーバーを持つ主な理由であり、実際にはGitのせいではなく、ラップトップでの作業の結果です。

8
Cormac Mulhall

Gitはこの種のセットアップではかなりうまく機能しますが、他の誰かのチェックアウトされたブランチに変更をプッシュすることは避けたいでしょう( https://git.wiki.kernel.org/index.php/GitFaq#Why_won。 27t_I_see_changes_in_the_remote_repo_after_.22git_Push.22.3F )。コードをプッシュし、他の人の変更をマージする統合ブランチがあるかもしれません。

中央レポが頻繁に使用される主な理由は、すべてのコードの標準的なベースとして使用できるからです。一方、3つ以上ある場合、マージする必要があるものについて推論するのは少し難しいかもしれません進行中の開発の枝。

初心者向けのGitをご覧ください:決定的な実用ガイド

セクション「共有チームリポジトリの設定方法」

3
Fredrik Pihl