If you use git submodule

You might want to connect tag. Neither branches nor master.
Because git submodule stands for specific commit hash. Not “master” and “head”. So if you select with master-head on git submodule, but in reality this is “master” at the time in the past.

広告

ローカルにリポジトリ

ローカルにリポジトリがないのはありえないでしょ。トピックブランチ使うでしょ。別に中央にsvn使うなら使うでよくて、svkやgit-svn使いましょうね、という。でそれならmercurialやgitを中央にすればいいんじゃないの、という。ちょっと飛躍した。

1 個のレポジトリの中で一部分だけcheckoutできるのがsvnの自分が思うメリット。特にgitでポコポコリポジトリ作ってるとそうおもう。
ただし、これはプロジェクトの中で一部分だけcheckoutしたり一部分だけcommitしたりして全体としての整合性を取れなくする状況を誘発するから、ちょっとだけのマイナス面はある。
あと”ここが外部に依存して”というのは、”ちょっと拝借”だとカオスになる。checkoutやexport
してみないとなにがはきだされるかわからない。これは別にgit submoduleやgit subtree使うようになっても同じ問題だと思うからあんまりどうでもいい。

gitかmercurialかbazaarかについては宗教戦争すればいいんじゃない。

symfonyをgitのsubmoduleとして使いたくて

symfonyをgitのsubmoduleとして使いたくていろいろ試行錯誤した。

==
2010-07-01 追記
symfonyの中でもsvn:externals しまくりなのかよ つまりこの方法だとダメくない?
tar gzipを展開してtagを打つか くだらねー
差分とかコミットログとか でっていう かんじになった
http://github.com/sanemat/symfony-copy

==

情報共有しておく。

下記に誰かがsymfony/branches/1.4を誰かがミラーしてくれている
http://github.com/vjousse/symfony-1.4

ただこれだとdeployのタイミングで万が一があればこけそうだし、tagで決め打ちたいなあということで 自分の目的に合わせてgithubにリポジトリを作ってみた

別の場所だと出来たのに家だとgit svn clone -s が最後fatalってこける

r29858 = 5b1b65b7dc41bf446d3f9ae0bdc8acb0d3edae5b (refs/remotes/2.0)
Auto packing the repository for optimum performance. You may also
run “git gc” manually. See “git help gc” for more information.
Counting objects: 5924, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5411/5411), done.
Writing objects: 100% (5924/5924), done.
Total 5924 (delta 2704), reused 0 (delta 0)
fatal: refs/remotes/trunk: not a valid SHA1
update-ref refs/heads/master refs/remotes/trunk: command returned error: 128

で、参照するだけでべつにdcommitしたり頻繁にpullしたりするわけでもないので、わりきってtagsだけもってくることにした。

$ git svn clone -r 27000:HEAD http://svn.symfony-project.com -t tags symfony

Checked out HEAD:
http://svn.symfony-project.com/tags/RELEASE_1_3_5 r29705

よくわからないけど最後にタグが振られたRELEASE_1_3_5がmasterになったらしい

$ git branch -r
tags/RELEASE_1_0_22
tags/RELEASE_1_0_22@27237
tags/RELEASE_1_2_11
tags/RELEASE_1_2_11@27993
tags/RELEASE_1_2_12
tags/RELEASE_1_2_12@28281
tags/RELEASE_1_3_2
tags/RELEASE_1_3_2@27971
tags/RELEASE_1_3_3
tags/RELEASE_1_3_3@28270
tags/RELEASE_1_3_4
tags/RELEASE_1_3_4@29009
tags/RELEASE_1_3_5
tags/RELEASE_1_3_5@29703
tags/RELEASE_1_4_2
tags/RELEASE_1_4_2@27965
tags/RELEASE_1_4_3
tags/RELEASE_1_4_3@28265
tags/RELEASE_1_4_4
tags/RELEASE_1_4_4@29002
tags/RELEASE_1_4_5
tags/RELEASE_1_4_5@29698

$ git checkout tags/RELEASE_1_4_5
Note: moving to ‘tags/RELEASE_1_4_5’ which isn’t a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b
HEAD is now at 9478607… [1.4] updated version number and externals

$ git branch
* (no branch)
master

おまえlocal branchじゃないよっていわれるけど気にせずtagをふる

$ git tag RELEASE_1_4_5

1_4_5と1_4_5@29698の違いがよくわからなかったのでこちらにもtagを振る

$ git checkout tags/RELEASE_1_4_5@29698
Previous HEAD position was 9478607… [1.4] updated version number and externals
HEAD is now at 263c67a… [1.4] updated changelog
$ git branch
* (no branch)
master
$ git tag RELEASE_1_4_5@29698

バージョンが1.4.5と1.4.5-DEVの差らしい よくわからない

$ git diff RELEASE_1_4_5..RELEASE_1_4_5@29698
diff –git a/lib/autoload/sfCoreAutoload.class.php b/lib/autoload/sfCoreAutoload index c019680..3892b06 100644
— a/lib/autoload/sfCoreAutoload.class.php
+++ b/lib/autoload/sfCoreAutoload.class.php
@@ -11,7 +11,7 @@
/**
* The current symfony version.
*/
-define(‘SYMFONY_VERSION’, ‘1.4.5’);
+define(‘SYMFONY_VERSION’, ‘1.4.5-DEV’);

/**
* sfCoreAutoload class.

で、まあ1.4.5をcheckoutしておいて
$ git checkout RELEASE_1_4_5
$ git remote add github git@github.com:sanemat/symfony-copy.git $ git push –tags github

masterがおかしいのでcloneしてきてもtagがうまく拾えない
git pullとかgit fetchとかのmanを読んでちょっと試したけどよくわからなかったので

$ git branch -D master
えーい
$ git checkout -b master
$ git push github master:master

とやっつけなかんじで終わらせた
結局、git側
http://github.com/sanemat/symfony-copy
master symfonyのsvn上でRELEASE_1_4_5のタグがついているもの
tags RELEASE_1_4_5 (1.4.5)
RELEASE_1_4_5@29698 (1.4.5-DEV)
となった

gitのsubmoduleでtagを指定してやりたいけど、init->updateだとmaster決め打ちになるのと
capistranoの:git_enable_submodules, 1 もmaster決め打ちになりそうなので、もうちょっと続きを探す

git-svnを使ったときのコミット手順

git-svnを使ったときのコミット手順について自分用にまとめた
コミットログに必要な情報を書きたい。

gitの使い方は割愛
git-svnの使い方は以下のまとめを読んだ
git-svnの使い方を覚えた – idesaku blog

git svnとgitを併用する方法のメモ – Hello, world! – s21g

$ git commit -v
修正完了

自分のいるブランチを確認
$ git branch
master
* test_commit

$ git checkout master

masterにいることを確認
$ git branch
* master
test_commit

$ git svn rebase
(svn update相当)

$ git merge –no-ff –no-commit [ブランチ名]

マージはされるが commit が作成されないので
$ git add .
$ git commit -v
コミットを作成

remoteのsvnにpush
$ git svn dcommit

==
もしくは
$ git merge –no-ff [ブランチ名]
$ git commit –amend

でコミットログ情報だけ書き換えてもよいと思う
あとは
$ git svn dcommit

==

今の自分のscreenの中からだと認証のフォワードが効く場合と効かない場合があって、 効かない場合は素直に ctrl-t d でデタッチして実行してる

git-svnでデフォルトのコミットコメントがギョッとする

git-svnは気を抜くと
$ git svn dcommit
でコミットのコメントが
merge branch ‘foo-branch’
ってなってSVNのコミットメッセージ見てギョッとする

コミットログ入れるエディタは立ち上がらない

–no-commitでmergeして
$ git commit -v
でコミットコメント入れるのがいまのところいちばんしっくりくる

gitのマージは安心感あるからいい
間違っても手元にちゃんとあるからおちついてやり直せばいい 落ち着いてやり直せるの重要

gitとProjectLockerでtwitterbotをリリースするまで

gitとProjectLockerを利用してtwitterbotを管理してリリースしました。bot自体はlinode.comで動かしています。

ProjectLocker説明

ProjectLockerはワンストップのバグトラッキングシステムのホスティングサービスです。いわゆるBTS一式+ソース管理。プロジェクトごとにgitかsubversionのリポジトリを選択して使います。githubではなくこちらを選んだ理由はプライベートのリポジトリが無料で持てるから。tracやwikiはあるらしいけど利用してないので知りません。複数ユーザの管理や権限分けも可能。ただそもそも運営がDQNぽいのであんまり使わない方がいいと思います。

すぐやり方を忘れるので手順。gitはローカルリポジトリとconfig周りを設定済み。project locker, twitterはアカウント取得済み。

プロジェクト名を決める

決めるとやる気が出るので。今回は「時逆(tokisaka)」。

ローカルのディレクトリ構成を決める

$ mkdir $HOME/app/tokisaka
$ cd app/tokisaka
$ mkdir lib
$ mkdir spec
$ touch lib/foo.txt
$ touch spec/bar.txt

ローカルのディレクトリ構成の雛形は以上。gitはデフォルトだと(?)空ディレクトリを無視するのでファイルを作った。

ローカルリポジトリの準備

$ git init
$ git add .
$ git commit -m "initial commit"

ローカルリポジトリの準備ができた。

ProjectLocker側の準備

アカウントをとったあとどこからログインするのかいつも分からないので書いておく。ここからログインする。
ProjectLocker User Portal: Login
https://portal.projectlocker.com/

ログインしたら、左ペインの「Account Links」の中の「Add Project」からプロジェクトを追加する。入力するのはプロジェクト名とプロジェクト概要とgit/svn。
gitを選んでプロジェクトを作成完了。

プロジェクト一覧が出てくる。これは左ペインの「Account Links」の中の「List Project」と同じ。作ったプロジェクトの「Name」をクリックする。ここは直感的に。

「Users in Project」に誰もいなくて、「Account Users not Assigned to this Project」に自分がいるのでメールアドレスの隣の「Add To Project」をクリックする。「Users in Project」に自分が入る。

gitのリポジトリの場所が分からなくなったので後で追記する。左ペインの「User Links」から「User Home」を選択すると、プロジェクトごとのリポジトリURLとアカウントが表示される。tokisakaは「git-foobar@free2.projectlocker.com:tokisaka.git」

公開鍵を登録

「User Links」の中の「Manage Public Keys」に自分の公開鍵を登録する。「id_dsa.pub」の中身。

リモートリポジトリを登録

ローカルに戻る。
$ git remote add origin git-foobar@free2.projectlocker.com:tokisaka.git
$ git push
pushするとエラーが出る

To git-foobar@free2.projectlocker.com:tokisaka.git
! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to ‘git-foobar@free2.projectlocker.com:tokisaka.git’
なので先にpullしてやる

$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
してから
$ git push
するとpushができる。ProjectLocker側でリポジトリを作ったときに「README」ってファイルが自動で生成されるが、それとぶつかるかららしい。
push, pullの時には鍵のパスフレーズを要求されるので入力する。

本番サーバ側(linode.com)からpull

秘密鍵を本番サーバに転送する。ProjectLockerに登録した公開鍵とペアのもの。その鍵を使って認証する。git initとgit pullでファイルを取得。pullするものを選べば反映したいブランチを適応できるんじゃないかな。HEADをガツンと反映するので知らない。

$ git init
$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
パスフレーズを入力するとProjectLockerのリポジトリからpullしてくる。

リリース完了。
http://twitter.com/toki_b

git reset <paths>でつまった

評判のWEB+DB PRESS vol.50 git特集。途中でムキーってなったのでメモ。

バージョンの違いからか、うまく「git reset <paths>」が出来なかった。ヘルプを見ると、途中に「–」を入れればよさそう。解決した。

gitのバージョン
$ git –version
git version 1.5.5.6

うまく出来なかったコマンド
$ git reset Jupiter.log
fatal: Failed to resolve ‘Jupiter.log’ as a valid ref.

ヘルプを見る
$ git reset –help

うまく出来たコマンド
$ git reset — Jupiter.log