なぜか redmine やら hudson やらに手を出してしまっていたのですが、そもそも git を覚えたかったのを思い出したので、ちょろっと触ってみました。
参考文献
- 作者: 杉山貴章,羽生章洋,小飼弾,角田直行,橋本正徳,はまちや2,久末隆裕,Junio C Hamano,グニャラくん,やまだあきら,川口耕介,青木靖,鶴岡直也,長野雅広,森田創,伊藤直也,武者晶紀,ミック,高林哲,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2009/04/24
- メディア: 大型本
- 購入: 24人 クリック: 234回
- この商品を含むブログ (95件) を見る
ローカルで 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 した場合の穏便な解決方法など、分からないことが山ほどあるので、また後日やってみます。