20

開発者とCIエンジンがクローンを作成する中央マスターgitリポジトリを使用するシナリオがあるとします。つまり、中央ハブと多数のノードを備えた、従来の非分散バージョン管理システムのセットアップに非常に近いものです。

ここで、サーバーが盗まれたか、落雷などによって中央リポジトリがすべての集中バックアップとともに失われたとしましょう。残っているのはさまざまなクローンだけです。幸運なことに、そのうちの1つが完全に更新されたため、将来の中央リポジトリとして使用する空のgitリポジトリ置換サーバーを作成し、クローンの作業に取り掛かります。

完全に更新されたクローンは、「git branch -a」を持つすべての「リモート/オリジン」ブランチを認識していますが、ローカルブランチは1つしかありません。(これは私が心配していることです-ブランチ情報を失います)。

古いもの、ブランチ、その他すべてのように動作する新しい中央gitリポジトリを再確立するための手順は何でしょうか?

4

2 に答える 2

20

空のリポジトリを作成し、完全に更新されたクローンから以下を実行します。

git remote add new-origin url://to/new/origin

git push --tags new-origin refs/remotes/origin/*:refs/heads/*

明らかに、新しいオリジンが元の URL と同じ URL にある場合は、オリジンから取得しないように注意する必要があります。

于 2012-08-20T08:48:46.887 に答える
8

まず、gitosisをインストールしないでください。最新のV3 + Gitoliteを使用してください。これは、はるかに完全な認証レイヤーです。 「gitosis vs gitolite?」および「なぜGitosisまたはGitoliteが必要なのですか?」を参照してください。

次に、ブランチ情報を失うことはありません。

これは、同じ問題に対する別のアプローチですが、これは、すべてのブランチを保持する方法を示しています。

クローンのいずれかがすべてのローカルブランチを持っているとは限りませんが、同じ(現在はなくなった)「中央」リポジトリからクローンを作成しているため、これらのブランチはすべて、それらのクローンのリモート名前空間にあります。

これらのリポジトリの1つである新しい中央サーバーに(ベアリポジトリとして)クローンを作成したら、必要なのはそれを少しクリーンアップすることだけで、新しい祝福されたリポジトリとして参照できます。

注:サーバーからローカルリポジトリにアクセスできない場合は、ローカルリポジトリをバンドルし、そのバンドルを表す1つのファイルをサーバーにコピーして戻します。バンドルからクローンを作成できます。バンドルを正しく作成するには、 「 :バンドルタグとヘッド
」を 参照してください。git bundle


短縮版

# Let's re-create a bare "blessed" repo on the server
git clone --mirror /path/to/a/local/repo repo.git
# or git clone --mirror /path/to/repo.bundle repo.git

# restore the local branches
remote=origin ; for brname in `git branch -r | grep $remote | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream $brname  $remote/$brname ; done

# delete the remotes branches
# (your blessed repo doesn't track anything)
remote=origin ; for brname in `git branch -r | grep $remote | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch -r -d origin/$brname ; done

# delete the remote 'origin'
# Not needed for your blessed repo
git remote rm origin

# Let's make sure master is the current branch
# for that bare repo:
git symbolic-ref HEAD refs/heads/master

それでおしまい。行く準備ができました。


ロングバージョン(デモ)

4つのブランチを持つリポジトリを作成しましょう:、、、、それぞれmaster独自のファイルがありますb1b2b3

C:\Users\VonC\prog\git\tests>mkdir c
C:\Users\VonC\prog\git\tests>cd c
C:\Users\VonC\prog\git\tests\c>git init r1
Initialized empty Git repository in C:/Users/VonC/prog/git/tests/c/r1/.git/
C:\Users\VonC\prog\git\tests\c>cd r1
C:\Users\VonC\prog\git\tests\c\r1>echo m > m.txt && git add . && git commit -m "first commit"
[master (root-commit) 1ffe5c1] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 m.txt

C:\Users\VonC\prog\git\tests\c\r1>git checkout -b b1
Switched to a new branch 'b1'
C:\Users\VonC\prog\git\tests\c\r1>echo f1 > f1.txt && git add . && git commit -m "f1 in b1"
[b1 1e64d01] f1 in b1
 1 file changed, 1 insertion(+)
 create mode 100644 f1.txt

C:\Users\VonC\prog\git\tests\c\r1>git checkout -b b2 master
Switched to a new branch 'b2'
C:\Users\VonC\prog\git\tests\c\r1>echo f2 > f2.txt git add . && git commit -m "f2 in b2"
[b2 4462b8f] f2 in b2
 1 file changed, 1 insertion(+)
 create mode 100644 f2.txt

C:\Users\VonC\prog\git\tests\c\r1>git checkout -b b3 master
Switched to a new branch 'b3'
C:\Users\VonC\prog\git\tests\c\r1>echo f3 > f3.txt && git add . && git commit -m "f3 in b3"
[b3 7ada753] f3 in b3
 1 file changed, 1 insertion(+)
 create mode 100644 f3.txt

にクローンを作成r1するとr2、はい、ブランチ情報が失われます。r2r3r3

C:\Users\VonC\prog\git\tests\c>git clone r1 r2
Cloning into 'r2'...
done.

C:\Users\VonC\prog\git\tests\c>git clone r2 r3
Cloning into 'r3'...
done.

C:\Users\VonC\prog\git\tests\c>cd r3

C:\Users\VonC\prog\git\tests\c\r3>git br -a
* b3
  remotes/origin/HEAD -> origin/b3
  remotes/origin/b3

しかし、あなたの場合、そこにあるリポジトリのほとんどは、祝福されたリポジトリからのクローンの直接の結果です。

r2必要なすべてのブランチがあります( 「ローカル追跡ブランチ」がないため、1つのローカル、4つのリモート追跡ブランチ):

C:\Users\VonC\prog\git\tests\c\r2>git br -a
* b3
  remotes/origin/HEAD -> origin/b3
  remotes/origin/b1
  remotes/origin/b2
  remotes/origin/b3
  remotes/origin/master

裸のレポclone --mirror r2に入ることができれば、それでもすべてのブランチを取得します。理由については、 「との違いは何ですか 」を参照してください。 r4
git clone --mirrorgit clone --bare

C:\Users\VonC\prog\git\tests\c>git clone --mirror r2 r4
Cloning into bare repository 'r4'...
done.

C:\Users\VonC\prog\git\tests\c>cd r4

C:\Users\VonC\prog\git\tests\c\r4>git br -a
* b3
  remotes/origin/HEAD
  remotes/origin/b1
  remotes/origin/b2
  remotes/origin/b3
  remotes/origin/master

そのリモートはまだ指しているr2

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:b3)
$ git remote -v
origin  C:/Users/VonC/prog/git/tests/c/r2 (fetch)
origin  C:/Users/VonC/prog/git/tests/c/r2 (push)

しかし、それはもう必要ありません。(またはそのことについては)アクセスできなくなったこと
を確認しましょう:r2r1

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:b3)
$ cd ..
VonC@HOSTNAME ~/prog/git/tests/c
$ mv r1 r1.old
VonC@HOSTNAME ~/prog/git/tests/c
$ mv r2 r2.old
VonC@HOSTNAME ~/prog/git/tests/c
$ cd r4

これで、ローカルブランチをリモート追跡ブランチにポイントすることで復元できます。「すべてのリモートgitブランチをローカルブランチとして
追跡する 」を参照してください。

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:b3)
$ remote=origin ; for brname in `git branch -r | grep $remote | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream $brname  $remote/$brname ; done
Branch b1 set up to track remote ref refs/remotes/origin/b1.
Branch b2 set up to track remote ref refs/remotes/origin/b2.
Branch b3 set up to track remote ref refs/remotes/origin/b3.
Branch master set up to track remote ref refs/remotes/origin/master.

masterそのベアリポジトリのデフォルトブランチを作成しましょう:
Git:ベアリポジトリでアクティブブランチを変更する正しい方法」および「「<code>master」以外のものを指すようにGitリモートを変更するにはどうすればよいですか?」</aを参照してください。 HEAD>"。

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:b3)
$ git symbolic-ref HEAD refs/heads/master
VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:master)

''を参照するものoriginはもう必要ありません。
リモートトラッキングブランチを削除しましょう:
リストされているブランチを削除するgit branch -a」および「リモートブランチを削除しますか?」を参照してください。

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:master)
$ remote=origin ; for brname in `git branch -r | grep $remote | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch -r -d origin/$brname ; done
Deleted remote branch origin/b1 (was 1e64d01).
Deleted remote branch origin/b2 (was 4462b8f).
Deleted remote branch origin/b3 (was 7ada753).
Deleted remote branch origin/master (was 1ffe5c1).

パニックになって、ローカルブランチが「削除」したものをまだ参照しているかどうかを確認しましょう:(「各ブランチの最新のコミットをgitに表示する
」を参照)

VonC@HOSTNAME ~/prog/git/tests/c/r4 (BARE:master)
$ git br -v
  b1     1e64d01 f1 in b1
  b2     4462b8f f2 in b2
  b3     7ada753 f3 in b3
* master 1ffe5c1 first commit

ええ、すべて良いです。

于 2012-08-24T21:49:24.450 に答える