約1年くらい前からgitを触り始めました。よくわからない状態から始めて、1人で黙々と機能を触っていただけだったのですが、ブランチ作ってコミット&プッシュ、Subversionとの連携として使うなどまではそれなりにやれるようになりました。
最近Mercurialを使って作業をすることがあったのですが、この1年ほどのgitでの経験に色々と助けられた気がします。特にSubversion使用時の時の考え方から分散リポジトリ系への考え方への頭の切り替えが学習コストの大きいものだったと思います。
さて、Mercurial では自分のリポジトリを簡単に公開することが可能でした。TortoiseHg を使ってですが、ウェブサーバーの機能をGUI上から起動することができ、他のユーザーとのやりとりがすごく楽でした。恐ろしいことに公開したリポジトリ(しかも自分の作業用)は、他のユーザーからのPushも受け取ることができるという点です。これは設定次第でできることで、デフォルトは読み込みだけできるような制限付きで公開されます。
同じことが Git でもできると便利だなと思ったので調べてみたのが今回の内容となります。
Gitでリポジトリ公開
これからの内容はWindows限定とします。また比較的新しいgit,tortoiseGit を使っている前提とします。
- tortoiseGit 1.8.7
- Git 1.8.5.2 (or 1.9.0)
- Windows7 x64
こんな環境で試してみています。
さて「自分の作業用のリポジトリを今だけ公開する」というイメージで、リポジトリの公開設定をしてみます。先ほどのMercurialにおけるリポジトリの公開事例に近いことをやりたい、と考えてもらえればと思います。
このとき、作業リポジトリのフォルダどこかでtortoiseGitのメニューを開き、バックグラウンド稼働というメニューを選択します。すると、git daemonコマンドが実行されて公開状態となります。このとき git プロトコルが使用されて公開されます。
他の環境からは上記で公開されているリポジトリから clone や pull などで内容を取得することができるようになります。バックグラウンド稼働後に開くウィンドウで、 git://xxx.yyy.zzz.www/ というアドレスが表示されているかと思いますが、これがサーバーのアドレスとなります。
なお、英語表記モードのままGUIを使っている場合、このバックグラウンド稼働という項目は “Daemon” として表示されているのでご注意下さい。Background という項目では見当たらないので・・・。
注意事項
Windows上でこの公開を行うときには知っておくべき点があります。
まず Gitプロトコルですが、公式の説明にはこのように記載があります(Gitサーバープロトコル)。
次は Git プロトコルです。これは Git に標準で付属する特別なデーモンです。専用のポート (9418) をリスンし、SSH プロトコルと同様のサービスを提供しますが、認証は行いません。Git プロトコルを提供するリポジトリを準備するには、git-daemon-export-ok というファイルを作らなければなりません (このファイルがなければデーモンはサービスを提供しません)。ただ、このままでは一切セキュリティはありません。Git リポジトリをすべての人に開放し、クローンさせることができます。しかし、一般に、このプロトコルでプッシュさせることはありません。プッシュアクセスを認めることは可能です。しかし認証がないということは、その URL を知ってさえいればインターネット上の誰もがプロジェクトにプッシュできるということになります。これはありえない話だと言っても差し支えないでしょう。
このようにあるので、Pushアクセスを認めることができるかのようです・・・しかし、tortoiseGit のほうの説明にはこのようにあります(3.10. Daemon)。
Sometimes you want to quickly share you local repository to others without pushing to a remote git repository.
Caution
The selected repository is exported for read/write access without further authentication.
このために流し読みしていると read/write アクセスが必要である、という点だけ見てPushもできそうな気配を感じます。しかし最初の文章にあるとおり、リモートのリポジトリにPush無しという制限下で、という部分を忘れてはいけません。
Windowsではこの方法を使う場合、他ユーザーへ読み取りのみの公開で使うという前提があるようです。これに気づかなくて色々と試行錯誤していました・・・。
テスト(その1)
うまくいかない組み合わせをメモしておきます。なかば自分のためです(笑)
Windowsクライアント | Linuxクライアント | |
---|---|---|
Linuxでgit://公開 | NG | NG |
Windowsでgit://公開 | NG | NG |
うまくいく組み合わせがあったように思いましたが、自分の作業リポジトリを公開する際にはどれでもダメなようです。
テスト(その2) 追記
うまくいかない組み合わせをメモしておきます。なかば自分のためです(笑)
うまくいった組み合わせがあったように思ったのでさらなる調査です。
前回と条件が違うのは、自分の作業リポジトリは公開しない、という点です。
作業用は公開しないが、別フォルダに作成した公開用のリポジトリを gitプロトコルで公開という状況です。
この別フォルダに用意した公開用のリポジトリは下記のコマンドで作成しています。
git init --bare --share
Windowsクライアント | Linuxクライアント | |
---|---|---|
Linuxでgit://公開 | NG | OK |
Windowsでgit://公開 | NG | OK |
このような結果となり、Windowsのgitクライアントでは失敗することがわかりました。このことからもgitプロトコル公開でPushさせる、というのは禁止事項にしておいた方が無難な気がします。