ブランチ名前空間を使用して、多くのバージョンの Git リポジトリを効率的にバックアップします。
質問
職場ではバージョン管理に Perforce を使用しています。これには問題があります:1) この集中モデルでは、回帰の準備が整うまで変更をチェックインできません。これは、開発プロセス中にリビジョン管理がないことを意味します。2) 私たちはデポのクライアントビューをバックアップしていないため、チェックインできるまで私たちの作業は安全ではありません。3) 統合ブランチをセットアップしない限り、コードを共有するのに問題があります。これらの問題を解決するために git を使用したい開発者のために、オプションの git ワークフローをセットアップしようとしています。
計画では、git-p4 を使用して perforce サーバーと接続し、プライベート git リポジトリを作成します。これで 1) が解決されます。Git Pro で説明されている統合マネージャー ワークフローを使用する予定です (http://progit.org/book/ch5-1.html) 3) を考慮して、開発者にパブリック リポジトリを公開してもらいます。
最後に、開発者が変更をプッシュして夜間バックアップやオフサイト バックアップに取り込める場所が必要です。現在クライアント ビューをバックアップしない理由は、全員のクライアント ビューのアーカイブ バックアップを毎晩行うのはスペース効率が悪いためです。私たちにはたくさんの開発者がいて、彼らはたくさんのコードを生成します。すべてのクライアントのビューを重複してバックアップすることはできません。私たちはただ保存したいだけです 彼らが行っているユニークな変化 のみ。
私の考えは、裸の git リポジトリを 1 つ用意して、それを呼び出すことでした omni-backup
, 、誰もが自分のすべてのブランチをプッシュできます (また、代替案を遠慮なく提案できます)。これにより、git のスペース効率の高い sha-1 ハッシュが利用され、各ファイルの一意のバージョンのみが確実にバックアップされます。重要なのは、スペース効率を高めるには、すべてのバックアップ リポジトリが同じリポジトリの一部である必要があることです。
問題は、まったく異なるブランチを持つ 2 人がブランチに同じ名前を選択した場合です。例えば。ボブは feature
ブランチとジェーンは feature
ブランチですが、それらは異なる機能用です。ボブがオムニバックアップをプッシュしても、早送りマージではないため、ジェーンはそれを実行できません。
ここで、私が理想的に実現したいのは、Bob が自分の機能ブランチをプッシュすると、ブランチの名前が に変更されることです。 bob-feature
で omni-backup
リモート。そして、彼が機能を引き出すと、 omni-backup
, 、彼は戻ってきます bob-feature
.
これを git で実現するのはそれほど簡単ではないようです。に記載されているプッシュフックを使用できるようです http://www.kernel.org/pub/software/scm/git/docs/git-receive-pack.html post-receive フックを使用して、書き込み直後に参照の名前を書き換えます。 何か 帰りのプロセスを元に戻すこともできますが、それは脆弱に感じます。もっと良いアイデアがある人はいますか?
編集:VONCの場合(コードがコメントを吸うため)、あなたのやり方は有望なVONCに聞こえますが、それがフェッチであるという事実が名前の上場の問題にどのように打ち勝つかはわかりません。ブランチの名前を変更する方法を知っている cron ジョブを提案していますか?
みたいな(本当に汚い):
foreach my $user (@users) {
my @branches = split(/s/,cat `$LDAPSERVER/$USER/$REPO/.git/refs/heads`);
foreach my $branch (@branches) {
system "git fetch $LDAPSERVER/$USER/$REPO/$BRANCH:+$USER$BRANCH"
}
}
解決
なぜ開発者がプッシュする必要があるのか omni-backup
レポ?
バックアップの目的で、別の開発者のリポジトリをリモートとして登録し、 git fetch
毎晩(から) omni-backup
サーバー)すべてのリモート リポジトリにあります。
そうすれば、ブランチ名の共謀は不可能になります。そして、より自動化されたプロセス (開発者は、直接作業しないリポジトリに明示的に何もプッシュする必要はありませんが、バックアップのみを考慮します)
そうしたら、素敵な小さなものを作ります git archive
のうち omni-backup
そしてそれを保管してください。
他のヒント
開発者に特定のガイドラインに従うことができる場合、git push
は正しく実行できます。
このコマンドを実行した場合:
git push omni-backup feature:bob-feature
.
リポジトリのomni-backupがリモートREFである場合、Bobの機能ブランチはOmni-BackupのBOB機能にプッシュします。しかし、開発者にそれを委託することは望ましくない場合は、フローの方向を切り替えて、Omni-Backupは開発者のリポジトリをプルしているため、VONCが提案しているので、より良い解決策
です。