GPhysのGitレポジトリセットアップの記録

履歴

概要

作業ディレクトリのない bare レポジトリとして作成する. cvsimport ではいきなりは bare レポジトリに import できないようなので,まず一時的なディレクトリに import し, 別途 bare レポジトリを作成して fetch する(bareの場合 fetchはpullと同じ).

まず cvs import

dennou-k にて. 後で消すので一時的なディレクトリに import する.

$ mkdir /GFD_Dennou_Club/ftp/arch/ruby/products/gphys/tmp_gitimport
$ cd /GFD_Dennou_Club/ftp/arch/ruby/products/gphys/tmp_gitimport

次の内容でカレントディレクトリに authors.txt を準備(先頭にスペースいれない)

horinout=T Horinouchi <horinout>
seiya=S Nishizawa <seiya>
takepiro=S Takehiro <takepiro>
otsuka=S Otsuka <otsuka>
mizuta=R Mizuta <mizuta>
koshiro=T Koshiro <koshiro>
daktu32=D Tsukahara <daktu32>

import 実行

$ mkdir gphys
$ cd gphys
$ git cvsimport -v \
   -d /GFD_Dennou_Club/ftp/arch/ruby/cvsroot \
   -A ../authors.txt \
   gphys 

レポジトリ作成と取り込み

dennou-k にて.

ディレクトリ準備

$ cd /GFD_Dennou_Club/ftp/arch/ruby/products/gphys
$ mkdir git_repos
$ cd git_repos
$ mkdir gphys.git
$ cd gphys.git

bareとして初期化.念のため ls でpermisionとグループを確認.

$ git --bare init --shared=0664
$ ls -la

fetchし,内容確認.

$ git --bare fetch ../../tmp_gitimport/gphys master:master
$ git branch -a
* master
$ git log

注:bareだと git branch -a で master しか出ず(originがない; リモートから独立),merge しなくても master に取り込まれる.

レポジトリの設定(config)

dennou-k にて.

$ cd /GFD_Dennou_Club/ftp/arch/ruby/products/gphys/git_repos/gphys.git/

レポジトリの名前設定. カレントディレクトリの description を設定する.

$ echo GPhys > description 

email送信設定.

$ cd hooks
$ cp post-receive.sample post-receive
$ echo '. $(dirname $0)/post-receive-email' >> post-receive
$ cp /usr/share/doc/git/contrib/hooks/post-receive-email ./
$ chmod +x post-receive-email
$ cd ..
$ git config hooks.mailinglist "horinout@.., rmizuta@.., .."  # コンマ区切りでメアドを並べる
$ git config hooks.announcelist "horinout@.., rmizuta@.., .."  # 上と同じに
$ git config hooks.emailprefix "[DennouRuby git] "

確認

$ cat config

post-receive-email をそのまま使うと,本文の最初が詳し(丁寧)すぎて 逆になんの話かわかりにくいので,その中の generate_email_header 関数を 適宜編集して簡潔にした.また,tag 送信時に前回のタグ付与以降の log がつくのが(そこばかりに目がいって)却って分かりにくいので generate_atag_email の関係部分 (git rev-list --pretty=short "$prevtag..$newrev" | git shortlog前後) をコメントアウトした.

(2015-03-24追記) httpで公開するための設定

http での git clone を許すためには,git update-server-info が毎回実行されるようにする必要がある。そのためには上記の hook ディレクトリ上で

cp post-update.sample post-update

すれば良い(post-update.sample の中身は,コメント行以外は

exec git update-server-info

のみである)。

手元にクローンを作って内容更新

作成者の手元のマシン(dennnou-kでなく)にて.

ここでは,cvs から import して始めたどの Git レポジトリでもやりそうな設 定についてだけ書く.

ローカルの適当なディレクトリ (git_reposとする) に clone を作成.

$ cd git_repos
$ git clone -v dennou-k.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/ruby/products/gphys/git_repos/gphys.git

gphys という名のレポジトリができるので cd

$ cd gphys

gitk でlog等を眺めてみる.

$ gitk

# 今回のには最後のコミットに cvs でつけたタグ gphys-1_3_0 がついている.

cvs から import した時点のスナップショットの記録としてタグ付ける.

$ git tag -a cvsimport -m "Snapshot when imported from CVS"

タグを確認 (git log の --decorarate=short オプションにより).

$ git log -3 --decorate=short 

(gitkでも確認できる.)

無視するファイルパターンを登録

$ cat > .gitignore 
*.[oa]
*~
*.so
Makefile
ChangeLog
^D

(先頭にスペースは入れない. ChangeLogは自動生成に切り替えるので無視ファイルに.)

$ git add .gitignore 
$ git commit -m "Registered files (patterns) to ignore in the repository"

ChangeLog を mv

$ git mv ChangeLog .ChangeLog.until201303
$ git commit -m "Renamed the current ChangeLog to back up."

変更を push する.

通常は

$ git push origin master

ただしこれでは tag が送られない.tag を(他のcommitとともに)送るには次を実行

$ git push  --tags origin master

特定のタグ (例:cvsimport) のみを(他のcommitとともに)送るには

$ git push origin master refs/tags/cvsimport

手元のレポジトリの設定 (commitできない .git/ 内の設定)

ChangeLog 自動生成の設定.以下の内容を .git/hooks/post-commit と .git/hooks/post-merge として設定

$ cat > post-commit
#!/bin/sh
git log --branches=master --date=short --name-status --pretty=format:"%ad  %an%n%B" > ChangeLog
^D

(先頭にスペースは入れない)

$ chmod +x post-commit
$ cp post-commit post-merge
$ ls -ltr