* gitoliteによるgitサーバ構築、および、使用方法 [#s659f93c] 目的は、グループによるアプリ開発ではなく、gitサーバを立てて、複数のPCでバージョン管理をやることです。具体的には、主に、自宅のデスクトップPCでアプリ開発をやっていて、gitでバージョン管理をやっているのですが、勉強会等で外出先でノートPCでソースをいじり、gitでバージョン管理をやって、デスクトップPCのリポジトリに反映させるにはどうすればいいかの考察です。方法として、自宅LANにgitoliteによりgitサーバを立てて、それぞれのPCでローカルにリポジトリを操作した上で、リモートリポジトリにpushして反映させます。もちろん、企業等でグループでアプリを開発していて、ソースコードをgitでバージョン管理していて、共有サーバにgitのリモートリポジトリを作ることも可能です。その場合、下記説明で、sshの鍵のファイル名にユーザ名とPC名を付けるといいでしょう。 gitサーバ(以下、serverA)のOSはLinux Debian Squeezeを想定。gitサーバを利用するクライアントPCをclientB、clinetCとする。clientBは、アプリ開発やgitによるバージョン管理も行いますが、gitサーバのユーザ管理をしたり、リモートリポジトリにプロジェクトを作成する管理用PCにもなります。 &color(red,white){※ ご注意: gitはEclipseのEGitを使って、ローカルでのバージョン管理、githubへのリポジトリのpushをやっていただけなので、素のgitコマンドの扱いには不慣れです。間違った記述もあるかもしれません。}; ** 0. なぜ、gitoliteか [#dc724ad2] お手軽にインストールできるものにGitosisがありましたが、現在開発が止まっており、実際に使おうとすると、サーバにgit pushできないなどの不具合があります。また、最近、Gitoriousが人気のようですが、インストール作業が大変です。debパッケージではないRuby enterprise、Sphinx、Apache ActiveMQとかのインストールが必要です。debパッケージでないものを入れるということは、システムのアップデートで動かなくなる可能性があるということであり、開発しているアプリのソースコードをそこに入れるのは不安です。gitoliteは、DebianのSqueezeで手軽にインストールできるので、このインストール方法、設定、使い方について考察します。 ** 1. gitoliteのインストール [#ga961547] serverAで ># apt-get install gitolite >以下の特別パッケージがインストールされます: > git liberror-perl >提案パッケージ: > git-doc git-arch git-cvs git-svn git-email git-daemon-run git-gui gitk > gitweb >以下のパッケージが新たにインストールされます: > git gitolite liberror-perl >アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。 ** 2. 管理者用鍵作成 [#cc0e1335] clientBで >$ ssh-keygen >Generating public/private rsa key pair. >Enter file in which to save the key (/home/foo/.ssh/id_rsa): /home/foo/.ssh/admin_cleintB >Enter passphrase (empty for no passphrase): パスフレーズ入力 serverAの/tmpに公開鍵admin_clentB.pubをファイル転送して、 ># chmod a+r /tmp/admin_clentB.pub clientBは管理者用PCで、このPCでgitサーバにgit pushするPCおよびユーザの追加や、リモートリポジトリでのプロジェクトの作成を行います。 ** 3. gitoliteの設定 [#we416704] serverAで ># dpkg-reconfigure gitolite >gitolite で利用するシステムユーザ名: gitoliteのまま >リポジトリのパス (path): /var/lib/gitoliteのまま >管理者の鍵: /tmp/admin_clentB.pub ** 4. sshでconfigの設定 [#bb31c392] clientBで >$ vi ~/.ssh/config >host serverA > user gitolite > hostname serverAのIPアドレス > port 22 > identityfile ~/.ssh/admin_clientB hostはgitoliteサーバのホスト名、userはgitolite、hostnameはgitoliteサーバのIPアドレス、identityfileは管理者用秘密鍵のファイル名。 ** 5. 管理者用リポジトリの取得 [#t1b1ca97] clientBで >$ cd ~ >$ git clone gitolite@serverA:gitolite-admin >パスフレーズ入力 ** 6. clientCにあるプログラムのソースコードをgitoliteサーバのリポジトリに置けるようにする [#i45fec55] clientCで鍵生成 >$ ssh-keygen >Generating public/private rsa key pair. >Enter file in which to save the key (/home/foo/.ssh/id_rsa): /home/foo/.ssh/clientC >Enter passphrase (empty for no passphrase): パスフレーズを入力 clientBの~/gitolite-admin/keydirディレクトリにclientCの公開鍵clientC.pubをファイル転送。 テストとして、リポジトリmyprojを作り、clientBとclientCからgitでリモートリポジトリを操作できるようにする。 clientBで >$ vi ~/gitolite-admin/conf/gitolite.conf > repo myproj > RW+ = admin_clientB clientC を追加。 gitoliteサーバのリポジトリに反映させる。 >$ cd ~/gitolite-admin >$ git add. >$ git add . >$ git commit -m "add user of clientC and add new project myproj" >$ git push このとき、clientCの公開鍵もリモートリポジトリに格納される。 ** 7. 使い方 [#ac2d3585] clientBで適当なディレクトリにプロジェクト作成。 >$ cd ~/tmp >$ mkdir myproj >$ cd myproj 初期化 >$ git init 何かファイル作成 >$ touch Test.java コミット >$ git add . >$ git commit -m "add Java file" リモートリポジトリの追加 >$ git remote add origin gitolite@serverA:myproj.git push >$ git push origin master ** 8. clientCでリポジトリをcloneして、ソースをいじれて、リモートリポジトリを操作できるようにする [#fd756ee1] clientCで >$ vi ~/.ssh/config >host clientC > user gitolite > hostname serverAのIPアドレス > port 22 > identityfile ~/.ssh/clientC identityfileのところだけ、clientBの設定を修正。 テストとして、myprojのcloneを取得 >$ git clone gitolite@serverA:myproj.git >$ cd myproj ソースをいじって、add、commit、push >$ git add . >$ git commit -m "some comment" >$ git push ** 9. Eclipseで利用する [#cf64458a] EGitプラグインでローカルにリポジトリの管理はできますが、リモートリポジトリにgit pushするのはエラーが出て、うまくいかないことがあるようです。したがって、ローカルでのバージョン管理は、EGitを利用するか、gitコマンドでやり、リモートリポジトリにpushするときは、gitコマンドで行います。 Eclipseでプロジェクトを作り、ソースコードを編集して、ローカルでバージョン管理をします。リモートリポジトリにpushするときは、管理用PCでリポジトリsumeprojを作り、gitサーバにpushした上で、ソースコードを編集していたPCで、 >$ git remote add origin gitolite@serverA:sumeproj.git >$ git push origin master とかとやります。 また、別のPCのEclipseに取り込むには、一度、適当なディレクトリで、 >$ git clone gitolite@serverA:sumeproj.git とやって、cloneを取得して、Eclipseでは、既存のプロジェクトをインポートする方法で、sumeprojの中のディレクトリを指定してインポートします。そのPCでソースコードをいじり、ローカルでバージョン管理をして、リポートリポジトリにpushするには、Eclipseのworkspaceのプロジェクトのディレクトリでgitコマンドでpushします。 ** 10. ブランチを指定してダウンロードする [#ked815e0] ブランチがいくつか作成されたリポジトリsomeprojのcloneを取得 >$ git clone gitolite@serverA:someproj.git 全てのブランチを表示 >$ git branch -a リモートにremotes/origin/somebranchがあるとして、somebranchをローカルに作成 >$ git checkout -b somebranch remotes/origin/somebranch ** 11. 参考url [#y13f257a] http://www.atmarkit.co.jp/fjava/rensai4/devtool26/devtool26_1.html http://www.atmarkit.co.jp/fjava/rensai4/devtool26/devtool26_2.html http://sho.tdiary.net/20110422.html http://glassylamp.blogspot.com/2010/11/git.html