まず、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
独自のファイルがありますb1
:b2
b3
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
、はい、ブランチ情報が失われます。r2
r3
r3
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 --mirror
git 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)
しかし、それはもう必要ありません。(またはそのことについては)アクセスできなくなったこと
を確認しましょう:r2
r1
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
ええ、すべて良いです。