7

私たちの組織が Subversion のような中央サーバーの VCS から git のような分散型 VCS に切り替える場合、すべてのコードがハードウェア障害から安全であることを確認するにはどうすればよいですか?

中央サーバーの VCS では、毎日リポジトリをバックアップするだけで済みます。DVCS を使用していた場合、開発者のすべてのマシンに大量のコード ブランチが存在し、そのハードウェアに障害が発生した場合 (または開発者がラップトップを紛失したり盗まれたりした場合)、バックアップはありません。 .

「開発者にブランチをサーバーにプッシュさせる」ことは良いオプションだとは思わないことに注意してください。これは面倒であり、開発者はそれを行わないことになります。

この問題を回避する一般的な方法はありますか?

明確化:

ネイティブ中央サーバー VCS では、開発者の最新の変更を除いて、すべてが中央サーバー上にある必要があります。したがって、たとえば、開発者がバグ修正を行うために分岐することを決定した場合、その分岐は中央サーバー上にあり、すぐにバックアップできます。

DVCS を使用している場合、開発者はローカル ブランチ (実際には多くのローカル ブランチ) を作成できます。これらのブランチはどれも中央サーバー上になく、開発者が「そうそう、それを中央サーバーにプッシュする必要がある」と考えるまでバックアップに使用できません。

したがって、私が見ている違い (間違っていたら訂正してください!): DVCS を使用している場合、半分実装された機能とバグ修正はおそらく中央サーバーでバックアップできませんが、通常の VCS では使用できません。そのコードを安全に保つにはどうすればよいですか?

4

7 に答える 7

12

実際には、開発者は互いのローカル リポジトリ間でプッシュおよびプルするよりも、中央リポジトリを使用することを好むことがわかると思います。中央リポジトリのクローンを作成したら、追跡ブランチで作業している間、フェッチとプッシュは簡単なコマンドです。同僚全員のローカル リポジトリに半ダースのリモートを追加するのは面倒であり、これらのリポジトリに常にアクセスできるとは限りません (電源がオフになっている、自宅に持ち帰ったラップトップなど)。

ある時点で、全員が同じプロジェクトに取り組んでいる場合、すべての作業を統合する必要があります。これは、すべての変更がまとめられる統合ブランチが必要であることを意味します。これは当然、すべての開発者がアクセスできる場所である必要があります。たとえば、主任開発者のラップトップには属しません。

中央リポジトリをセットアップしたら、cvs/svn スタイルのワークフローを使用してチェックインと更新を行うことができます。cvs update は、ローカルに変更がある場合は git fetch and rebase になり、そうでない場合は単に git pull になります。cvs commit は git commit と git push になります。

このセットアップでは、完全に集中化された VCS システムと同様の立場になります。開発者が変更を送信 (git push) すると、チームの他のメンバーに表示されるようにする必要があります。変更は中央サーバーにあり、バックアップされます。

どちらの場合も規律が必要なのは、開発者が長期にわたって実行中の変更を中央リポジトリの外に保持しないようにすることです。私たちのほとんどは、ある開発者が機能「x」に取り組んでいて、コア コードの根本的な変更が必要な状況で働いたことがあるでしょう。この変更により、他のすべての人が完全に再構築する必要がありますが、機能はまだメインストリームの準備ができていないため、適切な時点までチェックアウトしたままにします.

状況は両方の状況で非常に似ていますが、実際にはいくつかの違いがあります。git を使用すると、ローカル コミットを実行し、ローカル履歴を管理できるため、個々の開発者は cvs のようなものほど中央リポジトリにプッシュする必要性を感じない場合があります。

一方、ローカルコミットの使用は利点として使用できます。すべてのローカル コミットを中央リポジトリの安全な場所にプッシュすることは、それほど難しくありません。ローカル ブランチは、開発者固有のタグ名前空間に格納できます。

たとえば、Joe Bloggs の場合、ローカル リポジトリにエイリアスを作成して、 (eg) に応答して次のような処理を実行できますgit mybackup

git push origin +refs/heads/*:refs/jbloggs/*

これは、すべてのローカル変更が安全にバックアップされていることを確認するために、任意の時点 (1 日の終わりなど) に使用できる単一のコマンドです。

これは、あらゆる種類の災害に役立ちます。Joe のマシンが故障し、彼は別のマシンを使用してコミットを保存し、中断したところから続行することができます。ジョーは病気?Fred は、Joe のブランチをフェッチして、昨日行ったが master に対してテストする機会がなかった「必要な」修正を取得できます。

元の質問に戻ります。dVCS と集中型 VCS を区別する必要はありますか? あなたは、dVCS の場合、半分実装された機能とバグ修正が中央リポジトリに配置されることはないと言いますが、私は違いがある必要はないと主張します。

集中化された VCS を使用しているときに、半分実装された機能が 1 つの開発者の作業ボックスにとどまる多くのケースを見てきました。半分しか書かれていない機能をメイン ストリームにチェックインすることを許可するポリシーを採用するか、中央ブランチを作成する決定を下す必要があります。

dVCS でも同じことが起こりえますが、同じ決定を下す必要があります。重要だが未完了の作業がある場合は、一元的に保存する必要があります。git の利点は、この中央ブランチの作成がほとんど簡単なことです。

于 2008-09-21T09:21:16.097 に答える
4

分散型 VCS を使用するということは、完全に分散型の方法で使用しなければならないことを必然的に意味するというのは誤りだと思います。共通の git リポジトリをセットアップし、リポジトリが公式のものであることを全員に伝えることは完全に有効です。通常の開発ワークフローでは、開発者は共通リポジトリから変更をプルし、独自のリポジトリを更新します。2 人の開発者が特定の機能について積極的に共同作業を行っている場合にのみ、互いから変更を直接取得する必要があります。

1 つのプロジェクトに数人以上の開発者が取り組んでいる場合、他の全員から変更をプルすることを覚えておく必要があるのは非常に面倒です。中央リポジトリがなかったらどうしますか?

職場では、全員の作業ディレクトリを毎日バックアップし、すべてを毎週 DVD に書き込むバックアップ ソリューションがあります。そのため、中央リポジトリがありますが、個々のリポジトリもバックアップされています。

于 2008-09-21T05:32:32.400 に答える
1

この質問は少し奇妙だと思います。CVS などの非分散バージョン管理システムを使用していると仮定すると、中央サーバーにリポジトリがあり、開発者のサーバーで進行中の作業が行われます。リポジトリをどのようにバックアップしますか? 進行中の開発者の作業をどのようにバックアップしますか? これらの質問に対する答えは、まさに質問を処理するために何をしなければならないかということです。

分散バージョン管理を使用して、開発者のサーバー上のリポジトリは進行中です。バックアップしますか?そしたらバックアップ!それはそれと同じくらい簡単です。

私たちは指定したマシンからすべてのディレクトリを取得する自動バックアップ システムを持っているので、git と CVS リポジトリの両方を含む、マシン上のすべてのリポジトリと作業コピーを最後に追加します。

ところで、製品をリリースしている会社で分散バージョン管理を使用している場合、中央リポジトリがあります。それはあなたが解放するものです。特別なサーバー上にない場合があります。一部の開発者のハードドライブにある可能性があります。ただし、リリース元のリポジトリは中央リポジトリです。(まだリリースしていない場合は、まだリリースしていない可能性があります。) どのプロジェクトにも 1 つ以上の中央リポジトリがあると思います。(そして実際には、複数のプロジェクトがある場合、それは 2 つのプロジェクトであり、1 つがフォークです。) これはオープン ソースにも当てはまります。

中央リポジトリがなくても、解決策は同じです。開発者のマシンで作業をバックアップします。とにかくそうしていたはずです。進行中の作業が、CVS の作業コピーやバージョン管理されていない直接のディレクトリではなく、分散リポジトリにあるという事実は重要ではありません。

于 2009-03-30T15:35:06.013 に答える
1

「中央」サーバーを DVCS の権限として使用することは珍しくありません。これは、バックアップを実行する場所も提供します。

于 2008-09-21T05:29:47.807 に答える
0

rsyncを使用して、個々の開発者の.gitディレクトリをサーバー上のディレクトリにバックアップします。これは、git cloneのラッパースクリプト、およびpost-commitなどのフックを使用して設定されます。

これはpost-*フックで行われるため、開発者は手動で行うことを覚えておく必要はありません。また、タイムアウト付きのrsyncを使用しているため、サーバーがダウンしたり、ユーザーがリモートで作業している場合でも、サーバーは引き続き機能します。

于 2008-09-24T04:12:05.160 に答える
0

チームのすべての開発者は、サーバー上に独自のブランチを持つこともできます(チケットごと、または開発者ごとなど)。このようにして、マスターブランチのビルドを中断することはありませんが、バックアップされるサーバーに進行中の作業をプッシュすることができます。

私自身のgit_remote_branchツールは、この種のワークフローに役立つ場合があります(Rubyが必要であることに注意してください)。リモートブランチの操作に役立ちます。

補足として、リポジトリの安全性について言えば、サーバー上で、単純なgitクローンまたは別のマシンへのgitプッシュを実行するコミット後フックを設定できます...コミットするたびに最新のバックアップを取得できます。

于 2008-09-21T11:35:34.167 に答える
0

開発者のホーム ディレクトリに、ローカル ネットワーク経由でリモート デバイスをマウントさせることができます。そうすれば、ネットワークストレージを安全にすることだけを心配する必要があります. または、DropBoxのようなものを使用して、ローカル リポジトリを別の場所にシームレスにコピーすることもできます。

于 2008-09-21T05:32:17.923 に答える