garbagetown

個人の日記です

はじめての git

なぜか redmine やら hudson やらに手を出してしまっていたのですが、そもそも git を覚えたかったのを思い出したので、ちょろっと触ってみました。

参考文献

WEB+DB PRESS Vol.50

WEB+DB PRESS Vol.50

ローカルで git

まずは msysgit をインストールします。
奥ゆかしい日本人らしさを全面に出してイエスイエスとデフォルトを全て受け入れてインストールしたら、スタートメニューから GitBash を起動して、git に名前とメールアドレスを設定します。*1

% git config --global user.name "garbagetown"
% git config --global user.email "garbagetown_AT_gmail.com"

ついでに出力をカラー表示する設定と、自動改行コード変換を止める設定*2を行います。

% git config --global color.ui auto
% git config --global core.autocrlf false

続いて、git の実験台とするために適当な rails アプリケーションを作成し、git リポジトリとして初期化します。

% cd /d/work
% rails test
      create
      create  app/controllers
(snip)
      create  log/development.log
      create  log/test.log 

% cd test
% git init
Initialized empty Git repository in d:/work/test/.git/

適当なエディタで .gitignore ファイルを作成し、バージョン管理対象にしたくないファイルパターンを記述します。

% vi .gitignore
log/*
tmp/*
*.swp
*~

git add "."(カレントディレクトリのドット)コマンドでカレント配下のファイルをリポジトリに追加したら、git status コマンドで様子を確認します。

% git add .
% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   .gitignore
#       new file:   README
#       new file:   Rakefile
(snip)
#       new file:   test/test_helper.rb
#

ステータスに問題が無ければ -m でコミットコメントを指定してコミット。念のためにコミット後に再度ステータスを確認して、ついでにログも見てみます。

% git commit -m "initial commit"
[master (root-commit) 6a8117c] initial commit
 47 files changed, 8535 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 README
 create mode 100644 Rakefile
(snip)
 create mode 100644 test/test_helper.rb

% git status
# On branch master
nothing to commit (working directory clean)

% git log

commit 6a8117cf31363dfc9bb3e02b4c518da7c4754b06
Author: garbagetown <garbagetown_AT_gmail.com>
Date:   Sun May 3 17:54:31 2009 +0900

    initial commit

びっくりするくらい Subversion と同じで面白くも何ともないですね。
これだけではローカルに引き篭もってゴソゴソと何かをいじくっているだけなので、サーバを経由してメンバとプロジェクトを共有することはできません。
メンバとか言っても現在のところ脳内に生息する森のお友達くらいしかいませんが、いつか本当のお友達ができたときのために、サーバマシンに git をインストールしてプロジェクトを共有する準備を整えます。

サーバで git

いつもどおり apt-get install を叩くだけです。モジュール名が "git" ではなく "git-core" である点に注意。

$ sudo apt-get install git-core
パッケージリストを読み込んでいます... 0%
(snip)
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  libdigest-sha1-perl liberror-perl
提案パッケージ:
  git-doc git-arch git-cvs git-svn git-email git-daemon-run git-gui gitk gitweb
以下のパッケージが新たにインストールされます:
  git-core libdigest-sha1-perl liberror-perl
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 67 個。
3211kB のアーカイブを取得する必要があります。
この操作後に追加で 7008kB のディスク容量が消費されます。
続行しますか [Y/n]? y
(snip)
liberror-perl (0.17-1) を設定しています ...
libdigest-sha1-perl (2.11-2build2) を設定しています ...
git-core (1:1.5.6.3-1.1ubuntu2.1) を設定しています ...

インストールが完了したら、適当なパスにリポジトリとなるディレクトリを作成してリポジトリとして初期化します。ワークツリー無しで初期化するために --bare オプションを使います。

$ sudo mkdir /var/git/
$ sudo mkdir /var/git/test.git
$ cd /var/git/test.git/
$ sudo git --bare init
Initialized empty Git repository in /var/git/test.git/

初期化が済んだら、このリポジトリにアクセスするユーザに所有権を与えます。ここでは git という名前のユーザに権限を与えています。

$ sudo chown -R git:git /var/git/
$ ls -la
total 40
drwxr-xr-x 7 git git 4096 2009-05-03 18:28 .
drwxr-xr-x 3 git git 4096 2009-05-03 18:28 ..
-rw-r--r-- 1 git git   23 2009-05-03 18:28 HEAD
drwxr-xr-x 2 git git 4096 2009-05-03 18:28 branches
-rw-r--r-- 1 git git   66 2009-05-03 18:28 config
-rw-r--r-- 1 git git   58 2009-05-03 18:28 description
drwxr-xr-x 2 git git 4096 2009-05-03 18:28 hooks
drwxr-xr-x 2 git git 4096 2009-05-03 18:28 info
drwxr-xr-x 4 git git 4096 2009-05-03 18:28 objects
drwxr-xr-x 4 git git 4096 2009-05-03 18:28 refs

サーバ側の設定はこれだけです。当然ですが git ユーザは事前に作っておいてください。

クライアントとサーバで git

まずはクライアント側のブランチ名を確認します。master という名前のはずです。

% git branch
* master

ブランチ名が確認できたら、ファイルをサーバに push してみます。
サーバにログインするユーザ名は先ほど権限を与えたユーザ git で、push 先のサーバは hosts か何かに設定してあって gitserver という名前で解決できるものとします。

% git push ssh://git@gitserver:/var/git/test.git master
git@gitserver's password:
Counting objects: 65, done.
Compressing objects: 100% (57/57), done.
Writing objects: 100% (65/65), 80.44 KiB, done.
Total 65 (delta 14), reused 0 (delta 0)
To git@gitserver:/var/git/test.git
 * [new branch]      master -> master

基本的にはこれでよいのですが、毎度 git@gitserver:/var/git/test.git などとタイプしていたら指が折れるので、gitserver という別名を設定します。設定内容は .git/config に書き込まれており、git config -l コマンドで確認できます。

% git remote add gitserver git@gitserver:/var/git/test.git

% git config -l
core.symlinks=false
core.autocrlf=false
color.diff=auto
pack.packsizelimit=2g
help.format=html
user.name=garbagetown
user.email=garbagetown_AT_gmail.com
color.ui=auto
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.gitserver.url=git@gitserver:/var/git/test.git
remote.gitserver.fetch=+refs/heads/*:refs/remotes/gitserver/*

% vi .git/config
[core]
  repositoryformatversion = 0
  filemode = false
  bare = false
  logallrefupdates = true
  symlinks = false
  ignorecase = true
[remote "gitserver"]
  url = git@gitserver:/var/git/test.git
  fetch = +refs/heads/*:refs/remotes/gitserver/*

なにも push するものはありませんが、別名設定の動作確認をしてみます。

% git push gitserver master
git@gitserver's password:
Everything up-to-date

基本中の基本は大体分かりましたが、branch を切ったり merge したり、恥ずかしい commit を無かったことにする方法や、森の大きなお友達と conflict した場合の穏便な解決方法など、分からないことが山ほどあるので、また後日やってみます。

*1:以下、紛らわしいのでローカルのプロンプトは '%' で示します

*2:LF が扱えないエディタなど使わないし、自動改行 ON の場合、commit 時の警告がこの上なく鬱陶しいので