Git はじめました(ファイルの無視、ステージ前後の差分)

ファイルの無視

例えば、コンパイル後の Python モジュール(拡張子が .pyc のファイル)はリポジトリに追加したくないといった場合、.gitignore が使える。.gitignore をプロジェクトのディレクトリの直下に置き、条件を指定しておくことで、ファイルをステージングするときに Git が自動で無視してくれるようになる。

$ python -m py_compile hello.py
$ ls
README	hello.py  hello.pyc
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	hello.pyc <-- hello.pyc が追加されている
nothing added to commit but untracked files present (use "git add" to track)
$ vim .gitignore
*.pyc <-- 正規表現等で無視するファイルの条件を指定
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	.gitignore <-- hello.pyc が無視され、.gitignore だけが認識された
nothing added to commit but untracked files present (use "git add" to track)

ステージ前後の差分

あるファイルを編集したときのレポジトリとの差分は git diff コマンドで確認できたが、ステージ後のファイルとレポジトリとの差分も --staged オプションを使うことで見ることができる。

$ git add hello.py
$ vim hello.py
print 'Hello world!'
print 'This file is staged.'
$ git add hello.py
$ git diff --staged
diff --git a/hello.py b/hello.py
index f7756a3..1cc26ee 100644
--- a/hello.py
+++ b/hello.py
@@ -1 +1,2 @@
 print 'Hello world!'
+print 'This file is staged.'

いったん hello.py をステージした状態でもう一度元のファイルを編集してみる。

$ vim hello.py
print 'Hello world!'
print 'This file is modified but not staged.'
$ git diff
diff --git a/hello.py b/hello.py
index 1cc26ee..3cf3790 100644
--- a/hello.py
+++ b/hello.py
@@ -1,2 +1,2 @@
 print 'Hello world!'
-print 'This file is staged.'
+print 'This file is modified but not staged.'

すると今度は、修正後のファイルとステージされたファイルの差分をみることができる。よって、diff に --staged オプションをつけると、リポジトリのファイルとステージされたファイルの間での差分が表示され、--staged をつけないとステージされたファイルと手元のまだステージされていないファイルの差分をみることができる。

Git はじめました(ファイルの変更、追加、コミット)

変更内容のリポジトリへの記録

前回すでに add や commit やの例を書いてますが、リポジトリを作成した後のファイル変更→変更内容のスナップショットをリポジトリにコミットする方法を書いていく。

まず前提として、リポジトリのコピーの各ファイルには「tracked」と「untracked」の二通りの状態がある。tracked とは直近のスナップショットにファイルが存在している状態で、これらのファイルにはさらに「unmodified」「modified」「staged」の 3 つの状態がある。untracked とは、これらのどれにも当てはまらないファイルの状態(リポジトリ内のスナップショットとは無関係の状態)をいう。

最初にプロジェクトをクローンした時点では、すべてのファイルは tracked かつ unmodified の状態となっている。ファイルを変更すると Git はそれを modified とみなし、そのファイルを staged にして commit するというのが大まかな流れとなる。これについてはちょっと説明を書くのが大変なので、本家のサイトを参照してほしい。

f:id:tatsuyaoiw:20120823105545p:plain
source : http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository

ファイルの状態の確認

ファイルの状態の確認は git status コマンドを使う。クローン直後の場合、以下のような結果になる。

$ cd ~/workspace/src/sampleproject
$ git status
# On branch master
nothing to commit (working directory clean) 

ファイルの追加

ためしに前回作ったディレクトリに README というファイルを追加してみる。その後 git status を実行すると、Untracked files: というところの下に、新しく作った README が追加されるのがわかる。

$ vim README
This is a sample project.
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	README
nothing added to commit but untracked files present (use "git add" to track)

README をステージングする(staged の状態にする)には git add コマンドを使う。

$ git add README
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   README
#

すると Changes to be committed: の下に README が移動しており、このファイルがリポジトリにコミットできる状態となっていることがわかる。

README をコミットする。

$ git commit -m 'second commit'
[master d409479] second commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README

git commit を実行すると、リポジトリに変更が反映される。-m オプションでコミット時のコメントを追加することができ、省略した場合は標準のエディタ(事前に vim を設定した)が立ち上がり、コメントを入力することができる。

なお、-a オプションをつけると git add のステップを飛ばしてコミットできる。

$ git commit -a -m 'skip add process'

既存ファイルの修正

既存のファイルを修正してみる。

$ vim hello.py
print 'Hello world!'

リポジトリに反映されている内容との差分は git diff コマンドで確認できる。

$ git diff
diff --git a/hello.py b/hello.py
index 61d2637..f7756a3 100644
--- a/hello.py
+++ b/hello.py
@@ -1 +1 @@
-print 'Hello'
+print 'Hello world!'

git status を見てみると、内容が変更されている。

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   hello.py
#
no changes added to commit (use "git add" and/or "git commit -a")

変更したファイルも git add してコミットすればリポジトリに反映される。

$ git add hello.py
$ git commit -m 'third commit'
[master 1deaf4c] third commit
 1 files changed, 1 insertions(+), 1 deletions(-)

Git はじめました(リポジトリの作成、クローンの取得)

Git リポジトリの作成

基本設定が終わったら、早速 Git のリポジトリを作成してみる。Git のリポジトリ作成は、以下の 2 つの方法がある。

  • 既存のディレクトリを Git にインポートする方法
  • 既存の Git リポジトリを別のサーバからクローンする方法
既存のディレクトリを Git にインポートする

既存ディレクトリをリポジトリに登録する例。

$ mkdir -p ~/workspace/src/sampleproject
$ cd ~/workspace/src/sampleproject
$ vim hello.py
print 'Hello'
$ git init
Initialized empty Git repository in /home/oiwatatsuya01/workspace/src/sampleproject/.git/

これを実行すると、プロジェクトのディレクトリ内に .git というサブディレクトリが作られ、リポジトリに必要なすべてのファイルがその中に格納される。

$ ls -a
.  ..  .git  hello.py

ファイルのバージョン管理を始めるときは、git add コマンドを実行した後でコミットを行う。

$ git add hello.py
$ git commit -m 'initial project version'
# On branch master
nothing to commit (working directory clean)
既存リポジトリのクローン

既存の Git リポジトリのコピーを取得したい場合は git clone [url] を使う。例えば Ruby の Git ライブラリである Grit クローンする場合は次のようになる。

$ cd ~/workspace/src/
$ git clone http://github.com/schacon/grit.git

これは、まず「grit」というディレクトリを作成して、その中で .git ディレクトリを初期化し、リポジトリのすべてのデータを引き出し、そして最新バージョンの作業コピーをチェックアウトする。もし grit ではなく別の名前のディレクトリにクローンしたいのなら、オプションでディレクトリ名を指定する。

$ git clone http://github.com/schacon/grit.git mygrit

また、クローン時に社内等からでプロキシを通さなければならない場合は、git config --global http.proxy で事前に設定しておく。

$ git config --global http.proxy http://<username>:<password>@<proxyhost>:<port>/

Git はじめました(インストールと基本設定)

Git はじめました。

参考

Git のインストール

UbuntuDebian なら apt-get でインストールできる。

$ apt-get install git-core

Mac で MacPorts (The MacPorts Project -- Home) からインストールする場合は以下のようになる。

$ sudo port install git-core +svn +doc +bash_completion +gitweg

Git の基本設定

Git を使うには、まずユーザ名とメールアドレスを最初に設定しなければならない。

$ git config --global user.name "Tatsuya Oiwa"
$ git config --global user.email example@gmail.com

あと、Git で使うエディタ(コミットログ書くときとかに使う)も同じく設定可能。

$ git config --global core.editor vim

設定した情報は、ホームディレクトリ直下の .gitconfig ファイルに書き込まれる。確認したいときは git config --list を使う。

$ git config --list
user.name=Tatsuya Oiwa <-- さっき登録した名前
user.email=example@gmail.com <-- さっき登録したメールアドレス
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
...

Git のヘルプ

Git のヘルプを見たいときは、

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

などが使える。

Vagrant で VM 構築を自動化

はじめに

Vagrant仮想マシンを簡単に作成するためのソフトウェア。仮想マシンモニタには Oracle VirtualBoxVMware などに対応している。

インストール

Vagrant - Downloads からダウンロードしてインストールする。OSX で VirtualBox を使う想定なので、Downloads – Oracle VM VirtualBox こちらもインストール。

box の登録

インストールが完了したら box を登録する。box とは Linux イメージの雛形のようなもので、Vagrant のサイトで利用可能な box が一覧で見られる。

Ubuntu 12.04 LTS (Precise Pangolin) の 64bit を precise64 という名前で登録する。

> vagrant box add precise64 http://files.vagrantup.com/precise64.box
** box の削除
box の削除は remove コマンドで。
>||
> vagrant box remove precise64

box の初期化

Ubuntu 12.04 の box を登録したら、適当にディレクトリを作成して、Vagrantfile という名前の設定ファイルを作る。vagrant init コマンドを使えば自動で設定されるので問題ない。

> mkdir -p ~/vagrant/precise64
> cd ~/vagrant/precise64
> vagrant init precise64

VM の起動

さきほどのディレクトリで、

vagrant up

とすれば VM が起動される。

SSH での接続

vagrant ssh

を使って、できあがった VM に SSH で接続できる。

その他のコマンド

停止や起動のコマンドは以下のとおり。

  • VM の停止
vagrant halt
  • VM の削除
vagrant destroy

ムームードメインで独自ドメインを取得した後 Google Apps 経由で Gmail アカウントを作る

新しくメールアドレスをとるなら Gmail でしょう。ただ Gmail アカウントはすでに持っていて、別アカウントとるにしても覚えやすい名前はもう他の誰かに取られてしまっている状況。

そこで、独自ドメインをとって好きな名前でメールアカウントを作り、そのアカウントを Gmail と連携させてみることにしました。

  • 参考

ムームードメイン | hlw.me

正確には Google App で独自ドメインを使えるので、その中の 1 機能として Gmail を利用します。ドメインはどこで取るか迷いましたが、なんとなく paperboy&co を応援したいのでムームードメインを選びました。

ドメインは悩んだ挙げ句 taiyaki.bz というのを取りました。どうしてもこれにしたかったので、年間 2880 円 かかる、ベリーズ(ベリーズ - Wikipedia)の国別トップレベルドメインを使うことにしました。.com とかだったら年間 1000 以下でいけます。

ドメインがとれたら、ムームードメインの管理画面のネームサーバの設定で「ムームードメインのネームサーバ(ムームーDNS)を使用する」を選択。

f:id:tatsuyaoiw:20120809085933p:plain

次に Google Apps でドメインを登録したあと、ムームードメインのほうに戻って DNS の TXT レコードに Google Apps 指定の文字列を登録してアクティベートします。TXT レコードの照会が完了するとこんな画面になります。

f:id:tatsuyaoiw:20120809090352p:plain

さらに MX レコードを Gmail 用に登録して転送設定をすれば OK です。この辺はググれば細かい手順が出てくるので省略します。

f:id:tatsuyaoiw:20120809090031p:plain

これで独自ドメインを使って Gmail が使えるようになりました。