Gitを使った分散開発管理12 – プロジェクトの共有

2011.09.19

複数人でGitを使用した作業

いままでのgit作業はずっと同一マシン上で、1人で作業をおこなってきました。
しかしある程度の規模になると、複数人での作業は当たり前になります。
そのような場合には、共有サーバー上にリポジトリを作成し、そこから個々の環境へリポジトリをコピーする方式が一般的です。
今回はリモートでGitを使用する方法について説明します。

リモートリポジトリとやり取りするためのプロトコル

Gitではリモートリポジトリとやりとりするため、下記のプロトコルを使用することができます。

  • local
  • git
  • ssh
  • http/https

localプロトコル

localプロトコルはリモートリポジトリを別のディレクトリに置く形式です。
例えば、全員がアクセスできるNFSやSMBなどの共有ファイルシステムがある場合に使用されることがあります。
下記のようにしてリモートリポジトリから取得することができます。

$ git clone /share/pass/project.git

Localプロトコルを使用すると、既存のアクセス権、ネットワークアクセスを使用できますが、別の場所(たとえば自宅)から
ここへアクセスしたい場合には、NFSやSMB上のディレクトリをマウントしなければいけません。

gitプロトコル

gitプロトコルはこれらの中で最速のプロトコルですが、リポジトリを書き込み可能に設定すると誰でも書き込みができてしまいます。
変更をpushして共有するためにssh、他の開発者が変更を取得できるようにするためにgitプロトコルを有効にする場合が多いようです。

sshプロトコル

sshはこれらの中で最もセキュリティの高いプロトコルです。
「ユーザー名@サーバー名:リポジトリパス」のような形式で指定します。
特に問題がないからとりあえずsshにしておいたほうがいいと思います。

http/httpsプロトコル

http/httpsはあまり効率のいい方法ではありませんが、厳しいファイアウォールの制限がある場合には使用することがあります。

それぞれ特徴がありますが、今回はgitプロトコルを使用してリモートリポジトリとの接続を試してみます。

共有リポジトリを作成

共有サーバー上にGitリポジトリを作成しましょう。
最初にリポジトリ用のディレクトリを作成します。

%mkdir -p share-prj/hello.git

リモートリポジトリは、○○○.gitという名前でなければいけません。

作成したディレクトリ内に移動し、git initコマンドを実行します。

%cd share-prj/hello.git/                                        
%git init --bare --shared=true              
Initialized empty shared Git repository in /path/yourgit/share-prj/hello.git/

--bareオプションは公開リポジトリであるということを示します。また、今回はgitプロトコルを使用するので関係はありませんが、
--sharedオプションを指定して、リポジトリに対するグループの書込み用権限も追加しています。これはsshを使用する場合に参照されます。

最後にファイルを変更と追加を行い、git daemonコマンドを実行して、リモートリポジトリを公開しています。

%echo "Shared project" > description         
%touch git-daemon-export-ok                 
%git daemon --export-all --enable=receive-pack --base-path=/path/yourgit/share-prj

git-daemonは9418番のポートを使用します。
ディレクトリへのアクセスを許可するためにgit-daemon-export-okという名前のファイルを作成しています。
これでリモートリポジトリが公開されました。

 

クライアントからclone

既存リポジトリを取得するには、git cloneコマンドを使用します。
このコマンドは既存リポジトリからローカルにファイルをコピーし、自分用のリポジトリを作成します。

% git clone <リポジトリのURL>
% git clone <リポジトリのURL> <ローカルに作成するディレクトリ>

git cloneはリポジトリの履歴情報も含めてリポジトリを複製します。

では、別のマシンからリモートリポジトリを取得してみましょう。

%git clone git://<さきほどgit daemonを実行したマシンのIP>/hello.git                        
Cloning into hello...
warning: You appear to have cloned an empty repository.

これでリモートリポジトリを取得することができました。

次にファイルを作成し、コミットしてください。

%cd hello/                                                     
%vi hello.txt                                            
%git add hello.txt                                       
%git commit -m "initial commit"                          
[master (root-commit) 8772ff7] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

この時点ではローカルのリポジトリにコミットした状態です。次に、この変更をリモートリポジトリに送信します。

自分のリポジトリの内容をほかのリポジトリに送信するためには、git pushコマンドを使用します。

% git push <送信先リポジトリ> <送信するブランチ>

こうすることで、指定したブランチをリモートリポジトリへ送信することができます。

%git remote                                              
origin
%git push origin master                                  
Counting objects: 3, done.
Writing objects: 100% (3/3), 233 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)

git remoteコマンドは、リモートリポジトリを表示するためのコマンドです。これを実行すると、「origin」というリポジトリが見えます。
これは、git cloneをした際にデフォルトでつけられる名前のリモートリポジトリです。
ここに対して、git pushコマンドを実行しています。

変更を取得する

さらに他の人がhello.gitリポジトリをcloneして変更した場合、その変更を自分のリポジトリに取り込む必要があります。
その際にはgit pullコマンドを使用します。

%git pull                                                 
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
・・・
Fast-forward
 hello.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

これで変更の取得ができました。

まとめ

複数人で開発する際にはリモートリポジトリの使用は必須になると思います。
リポジトリを同期する際に使用するpullやpushのオプションはいろいろあります。
実際に使用する際にはヘルプ/マニュアルを参考にして用途に応じて使い分けてください。