これまで基本自分はLinuxかMacでプログラムを作り、gitでコード管理、githubへupしていました。ただ一応、windowsでもeclipseではgithubにupしてました。
しかし、このところどうにもwindowsでプログラムを作らないとやっていけなさそうな状況になってきて、更にM$がVScodeをOpenSourceにしてきて、ずいぶん力を入れてきています。まだまだ、eclipseにはかないませんが、かなり頑張ってきています。これは一つ、今のうちに使い方を覚えていこうと試してみました。
とりあえず、せっかくVScodeを使うので言語は好きなpythonで行ってみます。(これはまた設定でかなり悩みましたが、それは別の時に)VScode自体は、ローカルではgitの管理機能を持っていますが、eclipseと違い、残念ながらまだリモートへのpush/pullの手段を持っていません。
そのために、VScodeの「統合ターミナル」で直にgitコマンドを実行しないといけません。しかし、更に問題なのがwindowsは標準ではsshのアクセスコントロール機能を持っていません。つまり、githubにアクセスするRSAキーを素では扱えないんです。
ネットでぐぐると、その他のGUIツール(例えば亀とか)を使えと書いてありますが、それもいやなので、しばらく考えてみました。
思いついたのが、gitのremote originを登録するとき、git@ではなく、https://github.com/ならどうだろうか?ということです。試してみたら、pushしたところで、githubのアカウントとパスワードを問い合わせるDialogが出てきて、入力したらうまくいきました。
一応、1回pushできればアクセス・コントロールは通るので、次からはVScodeのUIでいけるようです。(まあダメでも、アカウントとパスワードの入力くらいなら構いません)
ただ、ローカルのgitの初期化後の最初のcommitもかなり苦労しました(;^_^A もう何度、統合ターミナルで直にgitコマンド打ち込んでやろうと思ったことか。(元々、gitは直にコマンド打ち込む方が好きなんです)しかし、なんかそれでは負けなような気がして、VScodeのエラーログや画面をにらめっこして、やっとうまくいきました。(実は、本日いきなりVScodeの更新が入り、なんか少し設定ファイルやら変わったよう。それもあってかネットの情報そのままでは素直に動いてくれませんでした)
2017年8月23日水曜日
2015年12月26日土曜日
gitによる開発に関して:特定部分を別branchで管理し、master等にコピーしたい
最近、悩んでいるのがgitの操作方法についてです。しかもやりたいことが少し特殊です。
・プログラムの開発をしているが、異なるbranchで開発しているもののうち、自分の担当している部分だけmasterに持ってきて(コピー)、全体の試験がしたい
通常ならば、branch間でmergeすればいいんですが、そうすると自分が使っているdevelop branchにある別のフォルダの内容がmasterと完全に別内容にしているため、それができない!
本来なら、リポジトリのディレクトリ設計の時に考慮しておくべきことなんですが、それに失敗した例です。ただ開発が最終局面にきていて、いまさらリポジトリの再設定をしてしまうと、これまでの各ファイルの改定履歴がリセットされてしまいます。(git等のバージョン管理システムではよくあることですが、ファイルのディレクトリの位置を変えただけでも、当該ファイルの履歴が消えてしまいます。せいぜい、当該ファイルが移動されたよ、というログが残る程度です。subversionは特別に履歴を引き継ぐオプションがあるようですが、特別扱いのようです。詳細は後の雑談で。)開発が結合試験に入っているため、ログが消えるのはかなり痛いです。
開発が終わってしまえば、ログが消えてもまだ我慢できますが、このフェーズではきついです。mergeできなくてもコピーだけでもできればいい・・・、最後はbranchを切り替えて、一旦別の場所にコピーしておいて、再度master branchに切り替え、(手動で)コピーしようかと考えました。色々とぐぐってみると、かなりトリッキーな技があるようですが、最終的に以下のコマンドで可能なことがわかりました。
$ git branch master
$ git checkout develop /home/hoge/git/repo/A/B
(branch名) (path名:フルパスで!)
これでdevelop branchのBディレクトリ以下のファイルがmaster branchのBディレクトリ以下にコピーされてきます。(master, developともrepo/以下のディレクトリ構造は基本的に同じはずですから、コピー元を規定するだけで問題ないはずです。万一、構造が変わっていたりすると・・・、ちょっと考えないと。)もちろん、modifyのstatusになりますので、commitとしとくなりしとかないといけません。(当然、ログには「developからコピーしたよ」等入れておきましょう)
注:上記checkoutではpath名をフルパスで規定しています。ぐぐったサンプルでは如何にもリポジトリのtopからのpath名と推測できるような書き方がしてあるものばかりでしたが、どうもフルパスが必要なようです。
具体的に例を示します。
1.gitリポジトリの作成
$ mkdir git/repo
$ cd git/repo
$ git init
2.リポジトリの中身を作る
今回は以下の様な階層を作ってみました。(詳細なコマンドは省略します)
A/ A.txt
B/ B.txt
D/ D.txt
C/ C.txt
Aディレクトリのあるところに、".git"があります。各ディレクトリにあるテキストファイルには以下の様なテキストが入っています。(注:赤字の部分を別branchからコピーしてきます。ちなみに、B/とC/は同じA/以下の階層にいます。)
A.txtサンプルのテキスト
master branchのファイル
最初にファイル名を入れ、後はbranch名を入れてあります。(もちろん、この後commitしておきましょう)
3.develop branchの作成
$ git checkout -b develop
これで全く同じ内容でdevelop branchが作成され、develop branchに移動しました。
4.develop branch内のファイルの変更
次に、後にmaster brachの特定の部分(Bディレクトリ以下)にこのdevelop branchの内容をコピーするので、それがわかるようにファイルの中身を変更します。具体的には、以下の様にします。(これを、A, B, C, Dの4個のtxtファイルに行います)
A.txtサンプルのテキスト
develop branchのファイル
・プログラムの開発をしているが、異なるbranchで開発しているもののうち、自分の担当している部分だけmasterに持ってきて(コピー)、全体の試験がしたい
通常ならば、branch間でmergeすればいいんですが、そうすると自分が使っているdevelop branchにある別のフォルダの内容がmasterと完全に別内容にしているため、それができない!
本来なら、リポジトリのディレクトリ設計の時に考慮しておくべきことなんですが、それに失敗した例です。ただ開発が最終局面にきていて、いまさらリポジトリの再設定をしてしまうと、これまでの各ファイルの改定履歴がリセットされてしまいます。(git等のバージョン管理システムではよくあることですが、ファイルのディレクトリの位置を変えただけでも、当該ファイルの履歴が消えてしまいます。せいぜい、当該ファイルが移動されたよ、というログが残る程度です。subversionは特別に履歴を引き継ぐオプションがあるようですが、特別扱いのようです。詳細は後の雑談で。)開発が結合試験に入っているため、ログが消えるのはかなり痛いです。
開発が終わってしまえば、ログが消えてもまだ我慢できますが、このフェーズではきついです。mergeできなくてもコピーだけでもできればいい・・・、最後はbranchを切り替えて、一旦別の場所にコピーしておいて、再度master branchに切り替え、(手動で)コピーしようかと考えました。色々とぐぐってみると、かなりトリッキーな技があるようですが、最終的に以下のコマンドで可能なことがわかりました。
$ git branch master
$ git checkout develop /home/hoge/git/repo/A/B
(branch名) (path名:フルパスで!)
これでdevelop branchのBディレクトリ以下のファイルがmaster branchのBディレクトリ以下にコピーされてきます。(master, developともrepo/以下のディレクトリ構造は基本的に同じはずですから、コピー元を規定するだけで問題ないはずです。万一、構造が変わっていたりすると・・・、ちょっと考えないと。)もちろん、modifyのstatusになりますので、commitとしとくなりしとかないといけません。(当然、ログには「developからコピーしたよ」等入れておきましょう)
注:上記checkoutではpath名をフルパスで規定しています。ぐぐったサンプルでは如何にもリポジトリのtopからのpath名と推測できるような書き方がしてあるものばかりでしたが、どうもフルパスが必要なようです。
具体的に例を示します。
1.gitリポジトリの作成
$ mkdir git/repo
$ cd git/repo
$ git init
2.リポジトリの中身を作る
今回は以下の様な階層を作ってみました。(詳細なコマンドは省略します)
A/ A.txt
B/ B.txt
D/ D.txt
C/ C.txt
Aディレクトリのあるところに、".git"があります。各ディレクトリにあるテキストファイルには以下の様なテキストが入っています。(注:赤字の部分を別branchからコピーしてきます。ちなみに、B/とC/は同じA/以下の階層にいます。)
A.txtサンプルのテキスト
master branchのファイル
最初にファイル名を入れ、後はbranch名を入れてあります。(もちろん、この後commitしておきましょう)
3.develop branchの作成
$ git checkout -b develop
これで全く同じ内容でdevelop branchが作成され、develop branchに移動しました。
4.develop branch内のファイルの変更
次に、後にmaster brachの特定の部分(Bディレクトリ以下)にこのdevelop branchの内容をコピーするので、それがわかるようにファイルの中身を変更します。具体的には、以下の様にします。(これを、A, B, C, Dの4個のtxtファイルに行います)
A.txtサンプルのテキスト
develop branchのファイル
5.master branchへの移動、develop branchの一部をコピー
$ git checkout master
$ git checkout develop /home/hoge/git/repo/A/B
2回めのcheckoutはbranchを移動しません。単にdevelop branchのBディレクトリ以下をmaster branchにコピーしてくるだけです。これにより、B.txtと配下にいるD.txtがコピーされます。git statusをしてみると、この2つのファイルがmodifiedだといってきて、各ファイルの内容は以下の様になっています。
B.txtサンプルのテキスト
develop branchのファイル
develop branchのファイル
これで自分のメインの開発はdevelop branchで行い、結合試験の必要に応じてmaster branchにコピーすることができます。
雑談:
今回、gitのことを色々調べていて思ったのが、こういうリポジトリ管理ではリポジトリ間でも「部分的な」コピーはどうやっても行えないということです。よく考えてみると、一つのリポジトリは一つの目的を持って作っているのであり、その一部だけを(履歴つきで)持ってくるのはかなり危ないことだと気づきました。そもそもその「履歴」(ログ)は別のリポジトリ(環境)で開発中のことが記録されているので、それを別のリポジトリで見ても何の意味もないか、逆に勘違いの元になる可能性があります。
同じように、一つのリポジトリ内でも、ファイルの移動を行うだけで「履歴」が消えてしまいますが、これはファイルの位置が変わるということは、当該ファイルの(開発)目的が変わる場合がほとんどで
、昔の履歴は害になることが多いはずです。
本来は、そんなことのないようにリポジトリを設計する段階できちんと決めておくべき(将来の可能性・拡張性を考えて)なのですが、世の中万能の人間ばかりではないので、filter-branch等駆使して、強引にログを書き換えてしまう参考例がいくつかありました。
ただ、最初から別リポジトリで開発を進め、途中から一つのリポジトリ管理下に置くようにすることは認められているようです。
後、調べている最中に"git-new-workdir"というツールの紹介がありました。このコマンドを使ってbranch間のコピー(共有?)を設定すると、どちらのbranchで操作を行っても、相手のbranchに反映される上に、履歴もつくのだとか。一瞬これこそ求めていたものだと思いましたが、よく考えたらこんなの使いはじめると「多用」しそうで危ないツールだと思いました。
2015年6月13日土曜日
既存のgit管理されたCプログラムをeclipseで開発
久しぶりにちょっとした備忘録です。
1.概要
2.eclipseで操作する前の状態
3.eclipseで操作する状態
4.やった方が感じがいいこと
こんな感じで進めていきたいと思います。
1.概要
他のPC、或いは既にプロジェクトが少し進んでいてそれがgit管理されています。そこに参加した、或いは最初はソースコードを書いていただけで、実際のコンパイルをこれから始めるという状況です。
Linuxを想定しますが、eclipse-CDTだとC/C++プロジェクトを作成でき、しかも今はGit管理パッケージが最初から入っています。(数年前はGit管理パッケージが最初は入っていなくて、いちいちEGitを後から入れたりして大変でした)
話を簡単にするために以下の状況を想定します。
・ソースはgithub等のリポジトリにあるわけではなく、何故かローカルでPCに入れてあります。(分散リポジトリなんで、簡単に実現できます)
・~/ProgWork/work以下にgit管理されたソースが入っています。
・そこにはmain.cだけが入っています。
・当然、~/ProgWork/workには .git ディレクトリがあります。
つまり、このgit管理されたものをeclipseで開発を(gitを使いながら)継続したいというわけです。
2.eclipseで操作する前の状態
とりあえずデフォルトの状態として、eclipseの作業ディレクトリは、$HOME/workspaceとしておきます。最初はもちろん何もプロジェクトがなく、空っぽとします。(注:でも最新のeclipseだと、workspace/RemoteSystemTemFilesなんてディレクトリができていました。何でしょこれ?)
3.eclipseで操作する状態
やることは以下の通りです。
(1)eclipseでFileメニューから"Import"を選択する。
(2)選択Dialogが表示されます。その中に、"Git"があります。"Projects from Git"を選択してNextします。
(3)次のDialogで"Existing local repository"というのがでてきますので、これを選択します。(注:ちなみに通常は外部のgithub等からプロジェクトをとってきますから、もう一つの"Clone URI"を選択します。こっちのやり方は以前にも書きましたのでここでは省略します。)
(4)ここで、~/ProgWork/work/.gitを選択します。
(5)後はproject wizardに進みますので、そのまま作業を進めればeclipseで開発が続けれます。
(6)ただこれではプロジェクトを作っただけで、まだ肝心のソースファイルがプロジェクトに入っていません。Fileメニューで作ったプロジェクトにソースファイルを追加してやります。
(7)ただこれだけではまだ、このプロジェクトはGit管理できません。eclipseのTeamメニューでもいつものGit関係のコマンドがでてきません。Teamメニューから"Share project"をしてやる必要があります。
ところでこの状態でディレクトリの状態はどうなっているんでしょう?ここからは実は2通りあります。今回ブログを書くにあたって実験してたら、2通りの状態になってしまいました。どちらが正しい状態かはわかりませんが、どちらも動くようなのでたまたまなのでしょう。
"sample"というc/c++のプロジェクトを作りましたが、~/ProgWork/work/sampleというディレクトリが作成されました。ビルドしたバイナリはここにできます。
問題は、eclipseが管理する、".project"なんですが、これが~/ProgWork/work/sampleにできる場合と、eclipseのデフォルトの、~/workspace/sampleにできる場合の2通りにわかれました。
どちらの場合でも、結局元のソースは~/ProgWork/work/以下にあり、eclipseからは普通に操作できますし、gitでcommitもできます。
(実は、自分はここでworkspace/sample以下にコピーが作成されてしまい、eclipse独自のgit管理に入ってしまうかと予想していましたが、そんなことはありませんでした^^;)
4.やった方が感じがいいこと
1.概要
2.eclipseで操作する前の状態
3.eclipseで操作する状態
4.やった方が感じがいいこと
こんな感じで進めていきたいと思います。
1.概要
他のPC、或いは既にプロジェクトが少し進んでいてそれがgit管理されています。そこに参加した、或いは最初はソースコードを書いていただけで、実際のコンパイルをこれから始めるという状況です。
Linuxを想定しますが、eclipse-CDTだとC/C++プロジェクトを作成でき、しかも今はGit管理パッケージが最初から入っています。(数年前はGit管理パッケージが最初は入っていなくて、いちいちEGitを後から入れたりして大変でした)
話を簡単にするために以下の状況を想定します。
・ソースはgithub等のリポジトリにあるわけではなく、何故かローカルでPCに入れてあります。(分散リポジトリなんで、簡単に実現できます)
・~/ProgWork/work以下にgit管理されたソースが入っています。
・そこにはmain.cだけが入っています。
・当然、~/ProgWork/workには .git ディレクトリがあります。
つまり、このgit管理されたものをeclipseで開発を(gitを使いながら)継続したいというわけです。
2.eclipseで操作する前の状態
とりあえずデフォルトの状態として、eclipseの作業ディレクトリは、$HOME/workspaceとしておきます。最初はもちろん何もプロジェクトがなく、空っぽとします。(注:でも最新のeclipseだと、workspace/RemoteSystemTemFilesなんてディレクトリができていました。何でしょこれ?)
3.eclipseで操作する状態
やることは以下の通りです。
(1)eclipseでFileメニューから"Import"を選択する。
(2)選択Dialogが表示されます。その中に、"Git"があります。"Projects from Git"を選択してNextします。
(3)次のDialogで"Existing local repository"というのがでてきますので、これを選択します。(注:ちなみに通常は外部のgithub等からプロジェクトをとってきますから、もう一つの"Clone URI"を選択します。こっちのやり方は以前にも書きましたのでここでは省略します。)
(4)ここで、~/ProgWork/work/.gitを選択します。
(5)後はproject wizardに進みますので、そのまま作業を進めればeclipseで開発が続けれます。
(6)ただこれではプロジェクトを作っただけで、まだ肝心のソースファイルがプロジェクトに入っていません。Fileメニューで作ったプロジェクトにソースファイルを追加してやります。
(7)ただこれだけではまだ、このプロジェクトはGit管理できません。eclipseのTeamメニューでもいつものGit関係のコマンドがでてきません。Teamメニューから"Share project"をしてやる必要があります。
ところでこの状態でディレクトリの状態はどうなっているんでしょう?ここからは実は2通りあります。今回ブログを書くにあたって実験してたら、2通りの状態になってしまいました。どちらが正しい状態かはわかりませんが、どちらも動くようなのでたまたまなのでしょう。
"sample"というc/c++のプロジェクトを作りましたが、~/ProgWork/work/sampleというディレクトリが作成されました。ビルドしたバイナリはここにできます。
問題は、eclipseが管理する、".project"なんですが、これが~/ProgWork/work/sampleにできる場合と、eclipseのデフォルトの、~/workspace/sampleにできる場合の2通りにわかれました。
どちらの場合でも、結局元のソースは~/ProgWork/work/以下にあり、eclipseからは普通に操作できますし、gitでcommitもできます。
(実は、自分はここでworkspace/sample以下にコピーが作成されてしまい、eclipse独自のgit管理に入ってしまうかと予想していましたが、そんなことはありませんでした^^;)
4.やった方が感じがいいこと
さて、残る問題はeclipseによって勝手に作成される、~/ProgWork/work/sampleというディレクトリです。これがgit管理下には入っていませんから、よくgitから文句を言われます。
こんなときは、~/ProgWork/work/.gitignoreファイルを作り、そこに"sample/"と文字列を追加しておけば、gitはそれは自分の管轄外と思ってくれて無視してくれます。
ただ、さらにいうと今度は".gitignore"も管理に入れろとgitは文句をいってきます。これを.gitignoreに含めるかは、宗教の問題になってきます。会社などで同じ開発環境で作業しているなら、.gitiginore自体も共有すべきだというのが、通常の考え方なんだそうです。ただまあこれは好みの問題で、自分の様に個人で遊んでいる場合には.gitiginoreに自身も含めてしまっています。
(だって、"git status"で毎回なんか文句言われると気になるから)
こんなときは、~/ProgWork/work/.gitignoreファイルを作り、そこに"sample/"と文字列を追加しておけば、gitはそれは自分の管轄外と思ってくれて無視してくれます。
ただ、さらにいうと今度は".gitignore"も管理に入れろとgitは文句をいってきます。これを.gitignoreに含めるかは、宗教の問題になってきます。会社などで同じ開発環境で作業しているなら、.gitiginore自体も共有すべきだというのが、通常の考え方なんだそうです。ただまあこれは好みの問題で、自分の様に個人で遊んでいる場合には.gitiginoreに自身も含めてしまっています。
(だって、"git status"で毎回なんか文句言われると気になるから)
2015年2月23日月曜日
Xcodeでgithubを利用
ネットでよく見る話題ですが、サクッといくこともあれば、苦労している記事もあります。自分の場合は苦労しました ^^;) どうもsshキーの登録を手動でしないといけないようなんですが、その辺が詳しく書いてあるものがありません。基本的にはコマンドラインで一回手動でやれば自動的にキーは記録してくれますが、ちょっとメモしておきます。(まあ、こんなのは昔のeclipseでもよくありました。少し前から全部GUIでできるようになったと思います。)
1.Xcodeでプロジェクトの作成
とりあえず何かプロジェクトを作成しましょう。あと重要なことですが、最初にローカルでGit管理するかという問い合わせがひっそりとあります。(デフォルトがオフです)これのチェックを入れておくことを忘れずに。(後からGit管理する方法もあるようですが、Xcodeのバージョンがあがるとどうなるか分からないので、面倒くさければ新規に作り直した方が早いと思います)
2.remoteリポジトリの登録
まずgithubに管理用のリポジトリを作成しておきます。(これ重要。いろんなツールを見てきましたが、新規に作成するリポジトリまで作成してくれる統合ツールは見た事ありません。おそらくgithubが新規リポジトリ作成のAPI(URL経由のね)は作ってないんでしょう。そうしないと、いたずらされかねませんしね。)
XcodeのSourceControlからConfigureで、remoteとしてgithubの先ほど作成したリポジトリを登録しておきます。
3.最初のcommitをローカルにする
とりあえず、ローカルのリポジトリにcommitしておきます。
4,remoteにpushする
ここが一番の難関です。Xcodeから行おうとすると、いかにもIDとパスワードを聞いてきて、うまくいきそうに見えますが失敗します。最初はプロジェクト以下の.gitにsshパスワードが入っていませんから。
ツールを使ってもいいんですが、最初だけは手動でgitコマンドでpushします。
$ git push -u origin master
このときgithubのユーザID、パスワードを聞かれますがここでsshキーが.git以下に登録されますから、あとはXcodeでも自由に操作できるようになります。
毎回思うことですが、gitって便利だけどどうしてもコマンドラインからの入力が避けれないな〜。(コマンドラインでbranchの操作とか、差分見ようと思うと地獄なんですが、どうして公式にはGUI作ってくれないのか。そのあたりはLinusさんの主義なんですかね。GUIあたりは周りに任して、自分は本質の部分だけに集中するとか。自分はコマンドライン、そんなに気にならないほうだからいいけど、若いもんは使ってくれないよ。emacsで編集、make、debugまでするのは会社ではもう自分だけじゃなかろうか。今時のは、統合開発ツールあるのが当たり前と思ってるし。自分としてはツールの裏で何動いているのかわからない方が怖いんだが。)
1.Xcodeでプロジェクトの作成
とりあえず何かプロジェクトを作成しましょう。あと重要なことですが、最初にローカルでGit管理するかという問い合わせがひっそりとあります。(デフォルトがオフです)これのチェックを入れておくことを忘れずに。(後からGit管理する方法もあるようですが、Xcodeのバージョンがあがるとどうなるか分からないので、面倒くさければ新規に作り直した方が早いと思います)
2.remoteリポジトリの登録
まずgithubに管理用のリポジトリを作成しておきます。(これ重要。いろんなツールを見てきましたが、新規に作成するリポジトリまで作成してくれる統合ツールは見た事ありません。おそらくgithubが新規リポジトリ作成のAPI(URL経由のね)は作ってないんでしょう。そうしないと、いたずらされかねませんしね。)
XcodeのSourceControlからConfigureで、remoteとしてgithubの先ほど作成したリポジトリを登録しておきます。
3.最初のcommitをローカルにする
とりあえず、ローカルのリポジトリにcommitしておきます。
4,remoteにpushする
ここが一番の難関です。Xcodeから行おうとすると、いかにもIDとパスワードを聞いてきて、うまくいきそうに見えますが失敗します。最初はプロジェクト以下の.gitにsshパスワードが入っていませんから。
ツールを使ってもいいんですが、最初だけは手動でgitコマンドでpushします。
$ git push -u origin master
このときgithubのユーザID、パスワードを聞かれますがここでsshキーが.git以下に登録されますから、あとはXcodeでも自由に操作できるようになります。
毎回思うことですが、gitって便利だけどどうしてもコマンドラインからの入力が避けれないな〜。(コマンドラインでbranchの操作とか、差分見ようと思うと地獄なんですが、どうして公式にはGUI作ってくれないのか。そのあたりはLinusさんの主義なんですかね。GUIあたりは周りに任して、自分は本質の部分だけに集中するとか。自分はコマンドライン、そんなに気にならないほうだからいいけど、若いもんは使ってくれないよ。emacsで編集、make、debugまでするのは会社ではもう自分だけじゃなかろうか。今時のは、統合開発ツールあるのが当たり前と思ってるし。自分としてはツールの裏で何動いているのかわからない方が怖いんだが。)
2013年10月18日金曜日
githubでEclipseプロジェクト(Android)の管理
gitの復習を兼ねてgithubの使い方もわかりました。さて次にコマンドラインではなくGUI、特にeclipseでgit(github)を操作する方法を調べてみます。どんなプロジェクトタイプでも同じでしょうが、特にAndroidプロジェクトのgitでのバージョン管理、複数PCでの開発環境構築について調べてみました。(eclipseにはEGitが入れてあります)
今回も結構手間取りました。ネットをググってみると似たような情報は結構あるんですが、いずれも複数のPCでの開発環境を構築するには足りないというか、部分的な解説しか見つからなかったんです。よくあるのが、
結局、かなり失敗してやり直しましたが(2,3回github上のリポジトリも壊してしまったw)なんとかできたようです。いかに手順を示します。
1.Mac上のeclipseでAndroidプロジェクトを作成し、githubに登録する
2.Windows上のeclipseにgithubからプロジェクトを取得、開発用のAndroidプロジェクトを構築する
大雑把にいって、この2つです。この後、実際に相互にファイルを編集してみて、相手に変更が反映されるのを確認しました。
1.Mac上のeclipseでAndroidプロジェクトを作成し、githubに登録する
まずMac上でAndroidプロジェクトを作成、一応動くことを確認しました。さてこれをgithubに登録するんですが、特にこれは問題なくできました。eclipseのExplorer上のプロジェクトを右クリック→Team→Share Project でダイアログが表示され、そこにリポジトリをどこに置くか聞いてきます。ここで、Mac(或いはwindows)のローカルにリポジトリが作られますが、デフォルトは$HOME/git/以下にどちらも作られました。(この時、プロジェクトは$HOME/workspaceから、$HOME/git/<リポジトリ名>に移動するのに注意。)次に、バージョン管理するファイルを選択、Addしてやります。(Androidのjarとかは当然入れません)そして「最初の」commitをしてやります。(Team→Shareでは、gitリポジトリの入れ物をローカルに作成しただけで、まだ何も入っていない状態です。)そしてPushを選択、githubのリポジトリ(事前にリポジトリの入れ物だけはgithubのHPで作っておきます)を入力して、github上にデータを送ります。ちょっと注意が必要なのが、最初のpushの時何をリポジトリに登録するかです。初めて作ったばかりならmasterのbranchしかないと思っていたら、HEADというのも表示されます。何でこれが表示されるのかわかりませんが、うっかり最初にHEADを選択してリポジトリに登録したら、プロジェクトの登録はできたのですがbranch名がHEADになってしまい、どうやってもmasterにできず結局github上でリポジトリを削除して作り直しました。
別のHPにも情報を後で見つけましたが、
mastre[branch] (refs/heads/master) → refs/heads/master
が正解のようです。あと、議論が分かれるところですがeclipseのプロジェクトでは、".project", ".classpath"というような設定ファイルがあります。デフォルトではこれもリポジトリに登録する設定になっていますが、これはバージョン管理するな/しろ、の意見が半々でした。どちらがいいかはeclipseの環境にどんなplug-inを入れているかにもよるらしく、一律にコレというのはありませんでした。各自の開発環境で判断するしかありません。
(注:.project内にはプロジェクト名=フォルダ名が格納されています。そのため、gitに.projectがないと2項の方法でAndroidプロジェクトを作成するときプロジェクト名として起動時のクラス名が使われます。デフォルトでは新規プロジェクトを作成する時、プロジェクト名がそのまま起動時のクラス名になるので大抵の場合問題がでないんですが、わざとプロジェクト名と起動時のクラス名を変えている場合に問題がでます。)
追記:
gen/R.javaも管理を外しました。branchを変更したり、古いバージョンに戻す時にエラーがでます。プリコンパイル・ファイルなのでRun/Debug時に生成されますから、元のファイル(res/以下)さえ管理対象に入っていれば大丈夫でしう。
とりあえずこれで、このMacだけで開発を進めていく分にはバージョン管理ができるようになりました。
更に追記:
最初にリポジトリにpushしたPCでは、どうもうまくpullができません。色々やってみたのですが、eclipseのGUIでやるとconfigに以下のものが記録されないようです。(hogeは適当に変換してください)
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.master.rebase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=https://github.com/hogehoge/hogehoge.git
Repository Explorerでプロジェクトを右クリックして、Propertiesを選ぶとwindowがでてくるので、そこに追加で指定してやります。
どういうわけかeclipseから最初にリポジトリに登録してやるとこの5項目が登録されてなくてpullがうまくいきません。(つまりpushしかできない)
登録したら一度削除して、githubから取り出してやったほうが、このあたりの設定をしてくれて楽かもしれません。
2.Windows上のeclipseにgithubからプロジェクトを取得、開発用のAndroidプロジェクトを構築する
OKすると、master branchを取得したとダイアログがでてきます。(今回はmasterしかないし、たいていはmasterを取得するでしょうが、場合によっては別のbranchを取得する場合もあるでしょう)
今回も結構手間取りました。ネットをググってみると似たような情報は結構あるんですが、いずれも複数のPCでの開発環境を構築するには足りないというか、部分的な解説しか見つからなかったんです。よくあるのが、
- githubに既に存在しているリポジトリをeclipseで取得(しかもAndroidじゃない)
- githubにeclipseからAndroidプロジェクトを登録する。但し他のPCでそれをどう使ったらいいかがない。
結局、かなり失敗してやり直しましたが(2,3回github上のリポジトリも壊してしまったw)なんとかできたようです。いかに手順を示します。
1.Mac上のeclipseでAndroidプロジェクトを作成し、githubに登録する
2.Windows上のeclipseにgithubからプロジェクトを取得、開発用のAndroidプロジェクトを構築する
大雑把にいって、この2つです。この後、実際に相互にファイルを編集してみて、相手に変更が反映されるのを確認しました。
1.Mac上のeclipseでAndroidプロジェクトを作成し、githubに登録する
まずMac上でAndroidプロジェクトを作成、一応動くことを確認しました。さてこれをgithubに登録するんですが、特にこれは問題なくできました。eclipseのExplorer上のプロジェクトを右クリック→Team→Share Project でダイアログが表示され、そこにリポジトリをどこに置くか聞いてきます。ここで、Mac(或いはwindows)のローカルにリポジトリが作られますが、デフォルトは$HOME/git/以下にどちらも作られました。(この時、プロジェクトは$HOME/workspaceから、$HOME/git/<リポジトリ名>に移動するのに注意。)次に、バージョン管理するファイルを選択、Addしてやります。(Androidのjarとかは当然入れません)そして「最初の」commitをしてやります。(Team→Shareでは、gitリポジトリの入れ物をローカルに作成しただけで、まだ何も入っていない状態です。)そしてPushを選択、githubのリポジトリ(事前にリポジトリの入れ物だけはgithubのHPで作っておきます)を入力して、github上にデータを送ります。ちょっと注意が必要なのが、最初のpushの時何をリポジトリに登録するかです。初めて作ったばかりならmasterのbranchしかないと思っていたら、HEADというのも表示されます。何でこれが表示されるのかわかりませんが、うっかり最初にHEADを選択してリポジトリに登録したら、プロジェクトの登録はできたのですがbranch名がHEADになってしまい、どうやってもmasterにできず結局github上でリポジトリを削除して作り直しました。
別のHPにも情報を後で見つけましたが、
mastre[branch] (refs/heads/master) → refs/heads/master
が正解のようです。あと、議論が分かれるところですがeclipseのプロジェクトでは、".project", ".classpath"というような設定ファイルがあります。デフォルトではこれもリポジトリに登録する設定になっていますが、これはバージョン管理するな/しろ、の意見が半々でした。どちらがいいかはeclipseの環境にどんなplug-inを入れているかにもよるらしく、一律にコレというのはありませんでした。各自の開発環境で判断するしかありません。
(注:.project内にはプロジェクト名=フォルダ名が格納されています。そのため、gitに.projectがないと2項の方法でAndroidプロジェクトを作成するときプロジェクト名として起動時のクラス名が使われます。デフォルトでは新規プロジェクトを作成する時、プロジェクト名がそのまま起動時のクラス名になるので大抵の場合問題がでないんですが、わざとプロジェクト名と起動時のクラス名を変えている場合に問題がでます。)
追記:
gen/R.javaも管理を外しました。branchを変更したり、古いバージョンに戻す時にエラーがでます。プリコンパイル・ファイルなのでRun/Debug時に生成されますから、元のファイル(res/以下)さえ管理対象に入っていれば大丈夫でしう。
とりあえずこれで、このMacだけで開発を進めていく分にはバージョン管理ができるようになりました。
更に追記:
最初にリポジトリにpushしたPCでは、どうもうまくpullができません。色々やってみたのですが、eclipseのGUIでやるとconfigに以下のものが記録されないようです。(hogeは適当に変換してください)
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.master.rebase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=https://github.com/hogehoge/hogehoge.git
Repository Explorerでプロジェクトを右クリックして、Propertiesを選ぶとwindowがでてくるので、そこに追加で指定してやります。
どういうわけかeclipseから最初にリポジトリに登録してやるとこの5項目が登録されてなくてpullがうまくいきません。(つまりpushしかできない)
登録したら一度削除して、githubから取り出してやったほうが、このあたりの設定をしてくれて楽かもしれません。
2.Windows上のeclipseにgithubからプロジェクトを取得、開発用のAndroidプロジェクトを構築する
さて次が一番悩んだところです。リポジトリに登録時、Androidプロジェクトだという情報は入っていません。何も考えずにeclipseでgithubからImportしてしまうと、単なるファイルの塊がeclipseのExplorer上にできるだけです。もちろんその状態でファイルの編集/更新を相手に伝えることはできるんですが、Windows上でAndroid実機での動作確認ができない状態です。(Androidプロジェクトになってないから当たり前です)さんざん悩みましたが、以下の手順でいいようです。(一発でやる方法もありますが、あえて一つずつやっていきます。
(1)eclipseのGit Repositoryにgithubからcloneを作る
eclipseで、Window → Show View からGit Repositoryを表示する。そこで右クリック、あるいはボタンで目的のAndroidプロジェクトのcloneを作成する。
これで$HOME/git/以下にローカルなリポジトリが作成されます。
次に、eclipseのExplorer上で右クリックでImport(或いは、FileメニューでImport)します。Sourceは、Git/Projects from Gitを選択します。EGitが入っていると、Local、Urlの2つが選べます。Urlは先ほどのGit Repositoryにcloneを作成する手順に入っていきます。Localはすでに存在するgitリポジトリを指定します。今回は先に作成したcloneとなります。そして以下の画面が表示されます。
ここで3つの選択がありますが、真ん中の"Use the New Project wizard"を選択します。次に、"Android Project from Existing Code"を選択します。
これで既存のコードでAndroidプロジェクトを作成することをeclipseに伝えることになります。次のダイアログで、どこにそのコードがあるのか指定する画面になりますが、$HOME/git/以下に1.で登録したプロジェクトのフォルダが存在しているはずなのでそれを選択してやります。これでOKです。
注:
先に、".project"ファイルをバージョン管理に入れるかという問題がありましたが、どうもこれが入っていないとこの時点で指定したフォルダがeclipseのプロジェクトと認識されないようです。実はこのあたりどう解決すべきか正解が自分にもわかりません。個々の開発環境に応じて考えてください。
また、この手順でWindows上にプロジェクトを作成すると、ちょっと通常のプロジェクトとはファイルの位置が異なります。
・通常のeclipseプロジェクトのファイルの位置
$HOME/workspace/<プロジェクト名>
・今回のgit管理下のプロジェクトのファイルの位置
$HOME/git/<リポジトリ名>/<プロジェクト名>
eclipseのExplorer画面上は同じように見えるので、ちょっと注意が必要です。(eclipseで操作する上では何も差がありません)
さて結果としてWindows上の画面は以下の様になります。
Package Explorer, Git Repositoriesの両方に同じ名前のフォルダがありますが、実体は同じものです。
2013年10月16日水曜日
githubを使ってみる(具体例)
以前、家庭内の複数の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ディレクトリが作成されます)
$ mkdir git-hiro // 一応、同じディレクトリ名でディレクトリを作成します
今度は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があってもサイトでの表示、および使用に問題はでませんでした。日本語等のマルチバイト文字への対応ができているようです。
色々なメモがき、下書きは既に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コメントになっています。
わざと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
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があってもサイトでの表示、および使用に問題はでませんでした。日本語等のマルチバイト文字への対応ができているようです。
2012年10月14日日曜日
Git入門
これまで仕事ではソースコードの形態管理にSubversionを使ってきました。しかし最近、世の中が分散形態管理システムのGitが評判になってきており、ちょっと試してみようと思いました。しかし、調べてみても一般的なコマンドの説明ばかりで、具体的にGitサーバーをどう設定したらいいのかとかまとめてあるのが見つかりません。この土日でやってみたのをまとめておきます。具体的には以下のような環境です。

自宅で用意したものです。クライアントはもっと種類増やしてもいいんですが、まとめるのが大変なのと、Gitが基本CUIでGUI環境があまりよくない、あと日本語文字コードの扱いに問題があるとのことだったので、UTF-8に統一してあります。
X.Gitのインストール
Ubuntu等のマシンで以下を実行してgitのパッケージをインストールする。
$ yum install git-core (Ubuntuは sudo apt-get install git-core でした)
WindowsではGitoliteがクライアントとしてよさげ。
と思ったら、Eclipseだと標準でGitプラグイン(EGit)が入っており、「インポート」で普通にサーバーを選択できた。
(Gitコマンドはファイル名→右クリックの「チーム」のサブメニューにある)
MacだとXcodeでgitクライアントのCUI版はインストールされるらしいが、GUI付はGitXがいいらしい。
(でもこれは0.7で開発が止まってるように見える。日本語大丈夫だろうか?)
(入ってなかった。ググったらcode.googleにあるよ!)
0. サーバーの設定
基本Ubuntuはクライアント利用が前提であり、最近は特にセキュリティの問題からサーバー関係のプログラム(サービス)は特に自分からインストール・設定してやらないといけません。(Redhatでもかなりまえにtelnetdが外されて(パッケージすらなくなった!)びっくりした)
最初にgit用にアカウントを作ります。リポジトリは基本この下におきます。(管理者権限を付加しておいたほうが後々便利です。設定後はとったほうがいいですが、このあとgitアカウントで設定いろいろしますから)
まずsshをインストールしないといけません。
「ソフトウェアセンター」で入れましょう。(sudo apt-get install sshdだと ないと言われた。名称が少し違うようだ)
ところでデフォルトではsshからrootでログインできてしまいます!(ダメやん、そんなの)
$ sudo vi /etc/ssh/sshd_config
PermitRootLogin no ← noにしておく
$ sudo /etc/init.d/ssh restart
でsshサービスを再起動しましょう。
念のため以下のコマンドでちゃんと起動しているか確認。
$ sudo lsof -nPi:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 3750 root 3r IPv4 16769 0t0 TCP *:22 (LISTEN)
sshd 3750 root 4u IPv6 16771 0t0 TCP *:22 (LISTEN)
さて実際に使うにはssh鍵をサーバー、クライアントの双方に登録してやらないといけません。一番簡単なのはクライアント→サーバにsshでログイン(このとき鍵の生成を聞かれて、登録されます)。再度、サーバーからクライアントにsshでログインしなおす(これで双方のssh鍵が互いに登録されます)
ただ今回はサーバ:Ubuntu、クライアント:Macで試してますが、Mac側が当然のごとくsshだろうがリモート接続は許してくれません。
クライアント(Mac)でssh鍵を生成します。
$ ssh-keygen -t rsa
ここでパスワードを聞かれますが、複数のマシンでパスワードが異なってるとめんどくさいので、いんちきですが「空」でリターンだけ押してやります。2回聞かれますが、それでポスワードが「空」の鍵が生成できます。(せめてすべてのマシンで同じパスワードで設定してやるくらいしたほうがいいんだけど。まあ仕事でやるのとは別なんで)
これでMacのホームで.ssh/id_rsa.pubが生成できますから、これをサーバー側に送ってやり(scpがいいでしょう)、サーバー側のリポジトリを公開するユーザーのホーム/.ssh/authorized_keysにアペンドしてやりましょう。(くれぐれもコピーはしないように!1マシン=1行で登録されてますから、コピーなんてするとほかのマシンの設定が消えてしまいます。なお最初の登録時には.ssh/自体存在しないことがありますが、そのときは自分で作成します)
1.まずgitサーバーのマシンでリポジトリの作成(サーバーのgitアカウントで実行)
gitアカウントのホームに作ります。
$ mkdir project.git
$ cd project.git ←<リポジトリを作成するディレクトリ>
$ git init ←これ不要かもしれません。クライアントが必要なだけの気もする。
.git/というリポジトリが保存されるディレクトリが作成されるだけなので、同じ階層に共有するリソースを作成する。
ここで注意ですが、ここで生成されるのはgitリポジトリであり、ファイル本体はこのリポジトリ内にあり、素で見てもファイル名なんかは見えません。gitサーバーでもリポジトリ内のファイルがどうなってるかみたいなら、別アカウントでこのリポジトリのクローンを作ってやりましょう。
2.クライアント側の環境設定をする
2.クライアント側の環境設定をする
各クライアント(まずはMacです)で以下のコマンドを実行します。homeディレクトリの.gitconfigというファイルに登録されます。(EclipseではGUIで行いますが、登録内容は同じです)
$ git config --global user.name "Hoge Hoge" ←当該リソースを触った人です
$ git config --global user.email hoge@home.com
$ git config --global core.qutepath false (ファイル名の文字化けを防ぐ)// 別のより新しい記事ではこの記載がない
$ git config --global core.editor "'C:/Program Files/sakura/sakura.exe’ -code=4" (デフォルトのエディタを設定 なければviがデフォルトになる)
3.クライアントのマシンでリポジトリのクローンを作成する。
今回は1.でリポジトリ名をproject.gitとしたので、何となく作業用ファイルを置く場所も「project」にしてしまいました。そのあたりは実際に使うときに変えてください。
(20131016:結果的には同じですが間違えてました。git initいりません。)
$ mkdir project // クローンを作成するディレクトリ
$ git clone git@<ホストアドレス>:/home/git/project.git project
これでsshによりgitサーバーからリポジトリのクローンがローカルに作られます。(ただ最初は空っぽですが)サーバーの指定がgitのsshで直接やる一番原始的なコマンドで、本当はhttp, httpsでスマートにやりたいんですが、そのためにはApatch等の設定が大変なので、それはまた今度ということに)
実は今回いろいろ試しながらやってたので、もしかしたらMacやUbuntuではcloneやるまえに、git initする必要があると思います。EclipseだとGUIが勝手にやってしまってるかもしれないんで。cloneする前に、.git/というリポジトリ情報を保存するエリアを作成しておく必要がある気がします。(1.のサーバー側準備でgit initコマンドしてますが、今から調べるとこれ意味なかったような状態になっており、施行錯誤してるときにクライアントで先にgiti initやった記憶があります。)
4.クライアント側で作業をする
さてクローンが無事できたので(最初だと空っぽだけど)、最初のファイルを作ります。
$ vi text.txt
適当にテキストをいれ、これをクライアント側のローカル・リポジトリに追加しましょう。
$ git add text.txt ←最初の1回は当該ファイルを管理対象に追加する指定が必要です
$ git commit ←ローカル・リポジトリへのcommitです。エディタでコメントを求められます。正式にはコミットするファイルをこのあとに引数で与えます。
5.gitサーバのリポジトリにローカルを反映させます。
$ git push origin master
(originってなんだ?ってとこですが、gitサーバーのリポジトリを示しています。一度、cloneコマンドを行った時にアドレスが記録されているのでこれでいいんですが、全部書くと以下のようになります。
$ git push git@<ホストアドレス>:/home/git/project.git master
最後のmasterはブランチ名です。masterは当然デフォルトのやつです。Subversionでいうところのtrunkにあたります。)
2回目以降は単に以下でいけます。それはそれでどこに作用するのかわからないので怖いんですが。
$ git push
6.別のクライアントにローカルリポジトリを作成する
ここからが本番です。別のマシン(今回は別のUbuntuでいきます。Windowsは慣れてからで)にローカルリポジトリを作成します。
まず2.の環境設定をします。わざとユーザー名は変えておきましよう。(Hiroyuki Maeda2)後で誰が変更したのか確認できるようにです。
次に、3.の手順でクローン・リポジトリを作成します。すると今度は3.でcloneを作ったところでリポジトリに追加したtext.txtが作業エリアに登場してきます。
6.別のクライアントにローカルリポジトリを作成する
ここからが本番です。別のマシン(今回は別のUbuntuでいきます。Windowsは慣れてからで)にローカルリポジトリを作成します。
まず2.の環境設定をします。わざとユーザー名は変えておきましよう。(Hiroyuki Maeda2)後で誰が変更したのか確認できるようにです。
次に、3.の手順でクローン・リポジトリを作成します。すると今度は3.でcloneを作ったところでリポジトリに追加したtext.txtが作業エリアに登場してきます。
7.別のクライアントでファイルを編集
text.txtに2行目を追加します。それをコミットしてpushします。
$ vi etxt.txt
$ git add text.txt
$ git commit ←ここでコミットログ求められます
$ git push origin master
7.最初のクライアントでgitサーバーのリポジトリを取得
さて2番目のクライアントがファイルを変更しました。1番目のクライアントでそれを取得します。
$ git pull ←必要ならoriginやmasterの情報を付加します
シェルには何やらファイルが変更されたとのメッセージが。
確認すると、確かに2行目が追加されています。
$ git log
これでコミットログを確認すると確かにログが表示されます。
8.コミットログやファイル本体に日本語使うとどうなる?
さて実際に使いこもうと思うと、最初の難関が日本語です。(正確には文字コード)
UbuntuなんかはUTF-8だし、MacはSJIS(と思ったんですがsnow Lepord以降はUTF-8のようでした)、Widnowsは今はUnicode(ほとんどUTF-8)です。
試してみたら、Ubuntu側で日本語でログやらファイルを編集しても、Macでは無事よめちゃいます??自動で文字コード変換してる? ちょっとこれ以上はWindowsも入れてみないとなんともわかりません。
9.Windowsでローカル・リポジトリを作成
さて今度はWindowsです。eclipseがEGitをインストール済みなので、これを使います。importでGitを取り込めますが、サーバ側がsshの設定しかしてないので、プロトロコルは当然sshでいきます。
取り込んでみると、ファイル自体はやはりUTF-8でした。(ただ鍵ファイルの設定がみあたらない。もしかして鍵なしのssHでいってしまったかも)
コミットログのヒストリを見てみると、ちゃんと誰が修正したかもわかります。(このために、ユーザー名を2つのクライアントで変えておきました)なおローカル・リポジトリはEclipseのworkspace以下に各プロジェクトが保存されていますが、当該プロジェクト名フォルダ直下に「.git」フォルダが作られていますので、そこで管理されています。
ところでEclipseだとuser.nameとかどこで管理しているのか?それはPreference → Team → Git → Configurationのところでkeyとvalueの設定をするところがあります。ここにuse.nameとかuser.emailとか設定します。注意するのがcore.autocrlfで、これいつもEclipse起動時にDialogがでて気になりググってみたら、push/pull時に改行コードを自動的にCRLFにしてしまうかどうかという設定でした。当然、falseにしておきます。(おそらくこれはWindows独特の設定だと思います。Windowsだけは改行が昔からCRLFですが、LinuxやMacはLFだけですから。)
あと注意が必要なのが、commitとpush/pullのやりかたです。基本右クリックで表示されるメニュー内のTeamサブメニューでやるんですが、ファイルを選択したときはcommitしかでません。プロジェクトで右クリックするとpush/pullのサブメニューがでてきます。(当たり前といえば、当たり前ですが)
疑問 git pushでローカルのリポジトリがサーバーに送られるが、その時に衝突が起きた場合どうなるのか?
Windows側でファイルを更新、pushしてからMac側でその更新をpullして確認。その後、Ubuntu側で(最新のpullをする前に)独自の修正をしてpushしようとしたらサーバーからrejectされました。
一番いいのは作業する前に
$ git fetch
$ git diff FETCH_HEAD
を行い、自分のローカルリポジトリをサーバー上のものと調べてること。
$ git fetch
$ git diff FETCH_HEAD
を行い、自分のローカルリポジトリをサーバー上のものと調べてること。
$ git merge FETCH_HEAD
もしpushしてrejectされるようなら、上記を行い手作業でマージして差分を解消してからpushしなおしになります。(先にpullしてサーバーとローカルリポジトリの同期をしてから、pushしなおさないといけないかもしれません。この方法だと最後にマージのログがヒストリに残りました。)一番簡単なのは、自分の作業用ファイルをどっかにおいておいて、pullして作業環境をサーバとあわせ、さきほど別のところにおいておいたファイルを見ながら修正することでしょうね。
実際にUbuntu側で問題を解決しpushしたあと、Windows側でpullしてhistoryを見てみた画像です。なんか以下にもmergeやったよ、という記録まで残ってます。
最後に日本語の文字コードについて。基本、UTF-8が問題でないようです。ファイル名もUTF-8なら問題ありません。ただところどころ使ってる環境によって日本語がファイル名のログ表示が化けるものがありますが、結果は大丈夫です。(このあたりはまだまだだと感じました)WindowsのGit GUIでも日本語ファイル名の扱いに問題がでるようですし、一番問題がなさそうながどのOSでもEclipseのようです。CUIでやるのが基本のようですが、いまどきそれはつらい。(Git作ったLinusはバリバリのコマンド入力の人らしいし、このあたりはだいぶ時代に遅れています。)
最後に日本語の文字コードについて。基本、UTF-8が問題でないようです。ファイル名もUTF-8なら問題ありません。ただところどころ使ってる環境によって日本語がファイル名のログ表示が化けるものがありますが、結果は大丈夫です。(このあたりはまだまだだと感じました)WindowsのGit GUIでも日本語ファイル名の扱いに問題がでるようですし、一番問題がなさそうながどのOSでもEclipseのようです。CUIでやるのが基本のようですが、いまどきそれはつらい。(Git作ったLinusはバリバリのコマンド入力の人らしいし、このあたりはだいぶ時代に遅れています。)
登録:
投稿 (Atom)











