以前、家庭内の複数のPCでgit repositoryを使う方法について書きました。しかし、いざやってみると、いちいちサーバーを起動しておかないといけないのが面倒くさい。(^^ゞ
色々なメモがき、下書きは既にgoogle drive(google doc)により複数のPCで作業してきましたが、(これもgoogle driveができるまでは家庭内NAS使ったり、USBで持ち歩いたりしてたんだよね〜、便利な世の中になったもんだ)プログラム自体も複数のPCでやり取りしたくなったのと、バージョン管理(特に過去の記録や、複数のブランチを持ちたい。一々プロジェクト名を作り直したくない。)をしたくなったので、githubを使ってみることにしました。(単に複数のPCでプログラムを持ち歩くだけならgoogle driveでもいいんですが、プログラムを作っていく途中で色々な機能を作りこんでいく途中課程を後で見たい場合、これまで一々プロジェクト名を少し変えて新規作成したりしてました。でも本来、バージョン管理でやった方がスマートですよね。)
さてググってみると、色々な使用例の説明がありましたが、どうも具体性に欠けているものが多く、調べ直しが多かったので個々のコマンドの説明を付加しながら、あらためてメモを残しておきます。(注:githubのサービス自体、まだ完成しているわけではなく、UIなんか変わっているせいもあるので、一応SSのっけときますが、何時変わるかわかりません。そのため、何の操作をしているかの説明を付加しておきます。)
1.githubにアカウントを作成する
まずgithubにアカウントを作成します。github.comのTopにいくと昔はアカウント作成のボタンがあったらしいんですが、2013/10/16時点では特にボタンはなく、画面にいきなり欲しいアカウント名、連絡用e-mailアドレス、パスワードを入力し、'sign up'すればアカウントを作成できて、e-mailがきます。
現状では、一般公開プロジェクトを作成するだけならフリーです。
自分のページは、https://github.com/
(アカウント名)になります。ブラウザでいきなりURLを見ることができます。(但し、その時はread-onlyになります。データを取得するだけならこれでいいんですが、管理等したい場合はそこでログイン('sign in')してやる必要があります。)
2.リポジトリを作成する
上記、URLでリポジトリを作成します。(注:windows, Macには専用のツールがありますが、最新OSでないといけなかったり、更新が早そうだったのと、Linux用がない?という状態だったので、ブラウザだけでやりました。)
ブラウザのUIがググった先のページと違いましたが、repository操作のタブを選んで、
Newすることになります。(ちょっと抽象的ですみませんが、下手にSS貼ってもすぐ変わりそうなので、言葉で説明します)説明用に、「
git-hiro」としておきます。
ちなみに、ここで作成したリポジトリのgitコマンドでアクセスするときのURLは以下になります。
(httpsアクセスの場合)https://github.com/
(アカウント名)/git-hiro.git
(gitプロトコルの場合)git@github.com:
(アカウント名)/git-hiro.git
なお、この状態ではgithubにリポジトリが作成されただけで、当然中身は空っぽです。
3.PC上で最初のデータを作成してgithubに登録する
先ほど専用ツールは使わないと言いましたが、windowsの場合だけはgitコマンドを持っていないので、cygwinを入れるなりしない限り専用ツールが必要になります。(eclipseにplug-inがあるらしいんですが、それはまた別の機会に調べます)元々、gitってGUIがほとんどなかった気がします。なんか、最初に作ったLinusの方針(とにかく早く機能するものが必要だったので、UIなんかなくてコマンド入力でいいから作った?)からか、Linuxで動くGUIツールを見たことがありません。そこで、以下にMacで作業したときのコマンドを載せておきます。(Macでは端末からLinuxと同じようにコマンド入力でやりました。自分も結構、こちらの方が好きです。)
$ mkdir git-hiro // 作業用のディレクトリを作成します
$ cd git-hiro/ // そこに移動します
$ git init // gitの初期化をします(.gitディレクトリが作成されます)
最初のディレクトリは特にgithub上に作成したリポジトリ名と同じでなくてもいいと思うんですが、その方がわかりやすいので同じにしています。
$ git config --global user.name "hogehoge"
$ git config --global user.email "hogehoge@gmail.com"
一応、当該リポジトリを操作するユーザーの名前とe-mailアドレスを設定しておきます。(デフォルトだとマシン名が入ったりして格好悪いので)
$ emacs -nw README.txt // 登録用にREADMEファイルを作成します
$ git add README.txt
$ git commit -m 'first commit'
$ git remote add origin git@github.com:(アカウント名)/git-hiro.git
$ git push origin master
ところで上記の例で何かおかしいと感じた所はありませんか?自分は他の人のページを見てた時、「これでいいの?」と思ったんですが(githubアカウントの)パスワードを入力するところがありません。
このあたりはマシンの設定にもよるんでしょうが、Macの場合はここでPermissionがないと怒られました。gitプロトコルで行う際、sshの鍵の登録をしておく必要があります。
詳細は別のページにまかせますが、ssh-keygenで鍵を作成し、それをgithubの自分のアカウント設定のページでSSH Keyの登録を行ってやります。(後で、git push/pullをする度にアカウント名/パスワードを入力する例も示しておきます。複数のPCで作業する際、全部のPCに鍵登録するのも大変なので。)
4.githubのページでリポジトリの状態を確認する
2,3回README.txtを変更、登録を繰り返してその履歴などが記録されているのを確認できます。(手順5にSS例を表示します)
わざと2回目の履歴を表示しました。ブラウザ上で内容を確認できるし、前の回との差分も見られるようです。(さらにこのcommitに対するコメントが下段に入力できます)最上段がcommitコメントになっています。
5.別のマシンで既存のリポジトリを取得、変更を登録する
次にUbuntu(わざと別のOSで作業します)で、githubからリポジトリを取得し、変更して登録します。
$ mkdir git-hiro // 一応、同じディレクトリ名でディレクトリを作成します
ここでgithubからデータを取得します。今度はわざとhttpsでやってみます。
$ git clone https://github.com/hiro1960/git-hiro.git git-hiro
initが必要ないのに注意してください。(やってもいいですが)また、わざとoriginへURLの登録もせず、直にコマンド入力してみました。データの取得なので特にアカウント名/パスワードは必要ありません。
$ emacs -nw README.txt // 取得したREAMEの内容を変更します
$ git add README.txt
$ git commit -m 'add 3rd line from Ubuntu' // 3回目のcommitのコメントです
$ git push https://github.com/hiro1960/git-hiro.git master
今度はgithub上のリポジトリの変更になりますので、ここでアカウント名/パスワードを聞かれます。(パスワードのssh設定をしていない場合ですが)
2回ほどMacでcommitし、3回目はUbuntuからcommitした状況です。それぞれの履歴の状態もブラウザ上でクリックして確認できます。
6.別のPCで変更分を取得する
さてUbuntu側でリポジトリを変更/更新したので、Mac側でそれを取得しないといけません。このあたりgitはsubversionと違い、ローカルでもリポジトリを持つのでちょっとコマンドが増えます。
$ cd git-hiro
$ git fetch // githubからローカルのリポジトリに変更分をとってくる
(以下の様なメッセージがでる)
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), done.
From https://github.com/<プロジェクト名>/git-hiro
4de59d5..72f762b master -> origin/master
$ git merge origin/mater // 取得した差分をソースに反映(merge)する
fetchだけではローカルのリポジトリに更新データが反映されるだけで、ユーザーが直接さわるファイルには反映されません。わざわざ、origin/master(自分のファイルはmasterブランチだと仮定しています)にmergeすると明確に指示しないといけません。
実はこのあたり色々議論があります。1年前にeclipseでgitの操作するときは何気なしにメニューから
pullを選んでいました。これはコマンドでも'git pull'でもいいんですが(実際、こっちではmergeの必要がありません)、ただ現在ではpullは使わない方がいいという人が多いようです。(但し、Toolを使わずに伝統的なコマンドラインでgitを操作する場合の話です。Toolで操作する場合はTool側で以下の問題は考慮してくれるでしょうから。)
最初にgithubからローカルにリポジトリを作成するさい(手順5)にgit cloneを使いましたが、ここはgit pullでも
同じようなことはできます。でもcloneでやるとリポジトリのURLも覚えてくれるので、その後のpush/pull/fetch等でURLの指定が必要なくなり、間違いが減ります。そうなるとpullを使うと間違いの可能性が高まるので、いっそpullは使用するな、最初にcloneしてその後はfetch/mergeでやれ、という人が多いようです。
個人的には「慣れ」という気もしますが、仕事で複数の人間、複数のプロジェクト(当然、複数のリポジトリ)に関わる場合はちょっと制限が付きますが、この方が安全だと思います。
ただ一つ問題があるとすると、プロジェクトの作業中gitサーバが問題をおこし、臨時でbackupのサーバーをたてる場合です。当然、一時的にURLが変わるのでその時はpullで作業しないと対応できないでしょう。(当然、backup用のデータは保存してあるという条件です。仕事でやるなら作業の成果は逐次保存しておかないとまずいでしょうし。)でも本当はこんなことしたくないし、プロジェクトのメンバに注意しろと伝えるのも怖い。みんなの技量が同じ程度、あるいは十分なのか見極めれるのは問題が起こらなかった時だけですし。
7.github上のリポジトリの削除の方法
ところでこの使用例を書くためにgithub上に最初のリポジトリを作成するとき、うっかりタイプミスしてしまいました。丁度いいので、その削除方法を示します。(例によって、UIが他のページで調べたSSと若干違いました。そのあたりは何をしたいかを考えて応用してください。)
間違えて「
git-hito」と作成してしまいました。これをクリックして、
settingをクリックすると当該リポジトリの管理画面になり、削除のボタンがでてきます。(注:少し前まで
Adminというタブでこの管理画面に飛んだ様です。その辺は応用きかせて、何らかの管理を行う操作を探します。)
一番下に削除ボタンがあります。これを押すと確認用にリポジトリ名を入力するダイアログがでてきます。
面倒くさいですが、キーボードから削除したいリポジトリ名を入力し、"I understand ..."のボタンを押します。すると削除されます。
ちょっと注意が必要なのが、コメントやwiki(githubでは個々のプロジェクトにwikiを提供してくれます)への日本語(マルチバイト文字コード)の扱いに問題があるとの話があります。そのため今回はすべて英文字しか使っていません。
PS
コメントに日本語(UTF-8)と入力してみましたが、普通に使えました。すくなくともコメントは大丈夫のようです。
更に追記、ソースコードにSJISがあってもサイトでの表示、および使用に問題はでませんでした。日本語等のマルチバイト文字への対応ができているようです。