2009-11-10

MacBook にも Git を (あるいはリモートリポジトリの準備)

MacBook にも Git をインストール。先日の Mac mini Server のときと同じく ports まかせ。

こうして、ネットワークでつながった 2 台のコンピュータの両方に Git が準備できた。両者の間でリポジトリの clone や、変更の push を試してみよう。

プロトコルを選ぶ

Git は分散 VCS で、かつリポジトリの間に優劣の差がない。実際にそうするかどうかは別として、すべてのリポジトリはリモートリポジトリになることができる。他のコンピュータからのリポジトリの複製要求に応えることができる。適切に設定してやれば。

手元の(ローカル)なコンピュータに Git がインストールされていれば、ネットワーク上(リモート)のコンピュータからリポジトリの内容を複製するための準備は整っている。実際、GitHub などの公開リポジトリから git clone で複製できる。では、複製要求に応える方のコンピュータにはどんな準備が必要なのか。

その問いに応えるためには、まず、Git がリモートリポジトリにアクセスするプロトコルを選ばなくてはならない。プロトコルによって準備が異なるからだ。

「入門git」(p.97-100) によれば、Git が対応しているネットワーク接続のためのプロトコルは、SSH、git、そして HTTP/HTTPS の 3 つ。今回、このうちの SSH と git を使った接続をそれぞれ試してみた。以下に、それぞれの場合にリモート側のコンピュータで必要な設定について試した内容と結果を述べる。
(この記事では SSH の場合のみを扱う。git プロトコルについては別の記事で書く)

Git コマンド群への PATH 設定

さて、2 台のコンピュータ間で SSH 経由のリモートログインができるように設定されているとする (うちの MacBook と Mac mini Server ではすでにそうなっている)。この状態で以下のコマンドを叩いてみる(入門git; p.98, 101)。

[foo:~] % git clone bar.local:projects/greeting

foo.local から bar.local のリモートリポジトリを clone しようというものだ。もし、このとき git-upload-pack: Command not found. というエラーが出て、clone が失敗するようなら、リモート側での PATH の設定に失敗している。というか、うちの Mac mini Server ではこうなった。一方、MacBook をリモート側にするとこのエラーが出ない。clone に成功する。その原因を探るのに、2〜3時間かかってしまった。

リモートのシェルでの PATH の設定にはいろいろな要素がからむ。以下は、うちの Mac mini Server の場合の原因だ。同じ症状だったとしても、これがあてはまらない場合もある。自分にとっての記録と、誰かの参考のために残しておく。

MacPorts を使って Git をインストールした場合、(標準では)コマンド群が置かれるのは /opt/local/bin になる。MacPorts そのものをインストールしたときに、この場所が PATH に足されるよう設定ファイルが変更されるのだが、場合によっては(例: インストール後にログインシェルを変更した)この設定が有効にならないことがある。

MacPorts のインストーラは、その最終段階で .profile または .tcshrc を変更するようだ。うちの Mac たちのシェルは tcsh に変更してあるので、以下の記述は tcsh の場合のみにあてはまる。.tcshrc ではこんな行が追加される。

# MacPorts Installer addition on 2009-10-25_at_13:33:42: adding an appropriate PATH variable for use with MacPorts.
setenv PATH /opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.

これらの行がない場合(肝心なのは setenv の行、他はコメント)、MacPorts のコマンド群はすべて見つからない。ところで、PATH の設定は他にも方法がある。ログインシェルなら .tcshrc の後、.login も読まれるため、そちらで設定することもできる(というか、わたしはそうしていた)。つまり、.tcshrc 以外の方法で PATH を設定していた場合、対話的にターミナルから使う場合には問題なくコマンドが見つかるのに、対話的じゃないとき(つまりリモートシェルのような場合)には、コマンドが見つからず失敗する、という現象が起きる。

原因がわかれば対処できる。単純に、Mac mini Server の .tcshrcで↑に挙げた PATH の設定の行を追加するだけ。たった 1 行の追加だ。実は、ここに至るまで色々と試行錯誤を経たのだけど、この解決策がもっともシンプルなのでこれを採用。

clone する

実は SSH をプロトコルにする場合、以上でリモート側の設定は完了。後はコマンドを叩くだけ。こんな風になる。

[foo:~] % git clone bar.local:projects/greeting
Initialized empty Git repository in /Users/baz/tmp/greeting/.git/
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 16 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (16/16), done.
Resolving deltas: 100% (2/2), done.

まとめ

さて、今回はここまで。Git の話題というよりは、MacPorts と SSH の話になってしまった。

この先、リモートのリポジトリに push したり、pull してきたり、実際に使う場合にはいろいろと覚えなきゃならないことがある。単にコマンドを覚えるだけでなく、どういった運用にするのかも考えなきゃならない。

想定しているシナリオは、普段デスクトップで作業をしていて、出張だとか何かで部屋やオフィスを出なればならないとき、ノートブックにデスクトップから clone して作業環境を持っていく、というもの。出先での作業の記録はノートブックのリポジトリに commit しておき、戻ってからデスクトップに push する。

何もリポジトリを分散させなくても、SD カードや USB メモリといったリムーバブルメディアにリポジトリを構築すれば、上記のようなシナリオには十分に対応できる。この方法なら Subversion のような集中リポジトリタイプの VCS でも可能。好みの問題だ。集中と分散、どっちが好きか。

上にも書いたが、SSH を使わず Git オリジナルのプロトコルを使う方法もある。そちらについては、また別の機会に書くつもり。調べたいことがまだ残っているので。

参照情報

関連記事

0 件のコメント:

コメントを投稿