既存のワーキングコピーからベアリポジトリを作成する - Git による版管理環境を構築する

SPECIAL


既存のワーキングコピーからベアリポジトリを作成する

Git サーバーに置くリポジトリは、ワーキングコピーを持たない "ベアリポジトリ" となります。

既存のワーキングコピーから、そのリポジトリのベアリポジトリを作成したい場合には、次のようなコマンドを、ワーキングコピーが置かれたコンピューター上で実行します。

git clone --bare repo1 repo1.git

このようにすることで、現在のディレクトリに保存されている Git リポジトリ "repo1" のベアリポジトリが "repo1.git" という名前で、同じディレクトリに作成されました。

 

この時、ベアリポジトリを直接 Git サーバーに作成することはできないような感じです。

このベアリポジトリを Git サーバーに登録したい場合には、SSH 等を使用して、サーバー側にファイル転送する必要があるようです。例えば scp を使った場合は、次のような感じになるでしょうか。

scp -P22 -i ~/.ssh/id_rsa -r repo1.git git@GITSERVER:/home/git/

"22" 番ポートへ (-P)、秘密鍵 "~/.ssh/id_rsa" (-i) を使って、"repo1" ディレクトリの内容全て (-r) を "GITSERVER" サーバー上の "/home/git/" ディレクトリへコピーしています。このとき、コピーには "git" アカウント (git@) を使用します。

 

ただしこのとき、"git" アカウントのシェルが "/usr/bin/git-shell" だった場合には、次のエラーメッセージが表示されるようでした。

fatal: unrecoznized command 'scp -t -- /'

これは、ログインに使用するアカウントのシェルが "/usr/bin/git-shell" であるため、scp によるコピーを行うだけの権限がないことが原因のようです。

これを解消するために、リポジトリ作成の際には、サーバー側で次のコマンドを実行して、一時的にシェルを "/bin/bash" などに変更しておくようにします。

chsh git

準備とはいえ、こういうところが少し厄介ですね。

問題がなければシェルを常に "/bin/bash" にしておくのもありかもしれません。

 

また、コピーが終わったら、サーバー上でリポジトリの最終調整を行います。

sudo -u git git init --bare --shared repo1

先ほど転送したリポジトリ "repo1" が保存されているディレクトリに移動して、上のように再度ベアリポジトリを作るような感じにコマンドを実行すると、これで、これまで使用していたリポジトリを、サーバー上のベアリポジトリとして準備することができました。

もし、グループに設定されているアカウントでアクセスした場合にも、リモートリポジトリにブランチを作成したい場合には、これに加えて、次のように、グループに対して書き込み権限を追加することで、実現できるようでした。

chmod -R g+w repo1

この操作をしなくても、リモートリポジトリの既存のブランチに Push することはできるようでした。

 

目次