Home > Tags > git

git

Better Subversionとしてのgit-svn

普段のプログラミングにgitを使用しているのだけど、実際の現場ではまだまだsvnが主流だったりする。svnを直接使ってもいいのだけど、やはりローカル上でコミットしたいとか、複数のコミットを1つにまとめたいとか、トピックブランチを切りたいとかあるのでそれはsvn単体だと厳しい。そんなわけでBetter SVNとしてのgit svnの紹介、と言うよりメモ。

リポジトリのクローン

git svn clone repository_url


これでsvnリポジトリをgitリポジトリとして取得できる。大きめのリポジトリだと結構時間がかかるのでのんびりと。svnリポジトリの構成がtrunk/branches/tagsという一般的な構成であればオプション-を付けるのがおすすめ。trunkをmaster、branches/tagsをremote branchとして扱うようになる。個別に指定する方法もあるのでhelp参照。

git svn clone -s repository_url

リポジトリの更新

git svn rebase


svn upに相当する。remote brancheのtrunkをgit coしてそれをmergeする方法もあるけど、基本はこれで問題ない。

リポジトリへのコミット

git svn dcommit


これはsvn ciに相当するって言うと、少し違う気もするのだけどsvnリポジトリにコミットするっていう意味だと同じ。git pushの方がイメージに近い。ローカルにたまっているコミットをsvnリポジトリにpushする感じ。ローカルにコミットされていない変更があるとdcommitできないので、その時はgit stashする。

git stash
git svn dcommit
git pop

ブランチの作成

git svn branch name


trunk-masterでやり取りするだけだったら、上記さえ覚えておけば後は普通のgitリポジトリと同じ。gitのブランチを作るのは通常のgitリポジトリと同じだけど、svnのブランチを作るにはこのコマンドを叩く。この時点でsvnリポジトリにコミットされるので注意(–dry-runオプションはある)。-mオプションでコミットメッセージを書ける。指定しない場合は「Create branch name」となる。

svnリポジトリの別のブランチや、ローカルのgitリポジトリのブランチから新しくブランチを作る場合には後ろに名前を指定する。

git svn branch name remotes/branch
git svn branch name local_branch

ブランチのチェックアウト

git co -b branch remotes/branch


svn switchに相当。git svnはsvnのbranches/tagsをremote branchとして扱うのでそれをgit coすればいい。これは上記のgit svn branchで作成したものも同じ。

ブランチ間のマージ

git merge --no-ff branch_name
git svn dcommit


マージは通常のgitとほぼ同じ。注意しなくてはいけないのは–no-ffが必要なこと(参考: http://webtech-walker.com/archive/2010/03/26101332.html)。

ブランチの削除

svn rm branches/name #svnリポジトリをcoしてそこで
git branch -r -d name #git-svnのgitリポジトリ上で


現時点(v1.7.0.6)ではsvnリポジトリのブランチを削除するコマンドは用意されていない模様。なので直接svn上でブランチを消して、git側のremote branchも直接消すしかないと思う。

どのブランチにコミットされるのか

git svn info


もしかしたら、今いるgitリポジトリのブランチでgit svn dcommitしたらsvnリポジトリのどのブランチにコミットされるのかがわからなくなることもあるかもしれない。その時はgit svn infoで表示されるURLをみればよい。

ignoreの設定

git svn create-ignore


ignoreは少しややこしいんだけど、svn側とgit側の2つ存在する。このコマンドはsvn側のignore設定を.gitignoreとして出力する。ちなみにsvn側のみignore設定してある場合、当然git側ではignoreされずgit svn dcommit出来てしまう。その場合、svn側のignoreも無視して通常通りコミットされてしまうので注意。

まとめ

git-svnでの開発はsvnの面倒なところをカバーしてくれたりするので非常にオススメ。もちろん全てがgit-svnで出来るわけでもないので、その辺は諦めて直接svnを使う必要もある。ある意味、最悪わからなくなったらいつでもsvnに戻ればいいのでとりあえず試してみるといいと思う。

ちなみにgitに詳しくない人は濱野さんの入門Gitがおすすめです。

ukstudio.jpをgitで管理するようにしてみた

最近流行りのgitを使ってみようかなーってことでとりあえずukstudio.jpを全部gitで管理するようにした。

最終的に以下のような構成になった。

MacBookにgitをインストールする

MacBookにgitをインストールするのは簡単だった。MacPortsですんなり入った。

参考: MacPortsを使ってgitをインストールしてみた – Post-itみたいな

サーバにgitをインストールする

サーバはslicehostのCentOS5.1を使用。インストールされてるsvnが1.4なのでこちらは一旦remove。

$ yum remove subversion

gitはyumの標準リポジトリでは管理されてないので、外部リポジトリ(DAG)を登録してそこからインストールした。

$ wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-$0.3.6-1.el5.rf.i386.rpm
$ rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
$ yum install git

リポジトリを作る

とりあえずコミットする人の名前とメールアドレスを登録しないといけないらしいので登録。これはサーバの方も同じ。

$ git config --global user.email yuki.0w0[at]gmail.com
$ git config --global user.name YukiAkamatsu

次にローカルのファイル群をcommitする。

$ cd ~/ukstudio.jp
$ git init
$ git add .
$ git commit -m "first commit"

この状態だとまだローカル内での変更のみ。なので、この変更をサーバ側で受け取れるようにする。

# ukstudio.jpにログインした状態
[ukstudio.jp]$ mkdir /var/git/ukstudio.jp
[ukstudio.jp]$ cd /var/git/ukstudio.jp
[ukstudio.jp]$ git init-db

んで、またローカルに戻ってさっきcommitしたのをpushして反映させる。

$ git remote add ukstudio.jp ssh://ukstudio@ukstudio.jp/var/git/ukstudio.jp
$ git push ukstudio.jp ukstudio.jp master

最後に外部から見れるように配置する。

# ukstudio.jp
[ukstudio.jp]$ cd /var/www/vhost/
[ukstudio.jp]$ git clone /var/git/ukstudio.jp

これで/var/www/vhost/ukstudio.jpが作成されて、そこにずらーっとファイルができてるはず。とりあえずこれでukstudio.jpをgitで管理できるようになった。(と思う)

ローカルで変更を加えてみる

本当にうまく管理できているのか、適当なファイルを作って確かめてみたいと思う。

$ cd ~/ukstudio.jp
$ touch hoge.txt
$ git add hoge.txt
$ git commit -m "commit test"
$ git push ukstudio.jp master

#ukstudio.jp
[ukstudio.jp]$ cd ~/var/www/vhost/ukstudio.jp
[ukstudio.jp]$ git pull

これでhoge.txtがあれば、うまく管理できてることになると思う。

そんな感じで、とりあえずしばらくはgitを使ってみようかなーと思う。「git log -p」とやるとコミットログがdiff付きでみれて便利。

参考

Git ユーザマニュアル(1.5.3以降)
Gitチュートリアル(1.5.1以降)
Gitメモ
せっかちな人のためのgit入門
バージョン管理をsubversionからgitに移行してみた

SSHについて補足

サーバへのSSH接続は鍵認証でやっています。秘密鍵を~/.ssh/id_dsa_ukstudio.jpで保存して、~/.ssh/configに以下のように書いています。

Host ukstudio.jp
IdentityFile ~/.ssh/id_dsa_ukstudio.jp
Protocol 2,1

Home > Tags > git

Feeds
Meta
Others

Return to page top