ローカルのgitレポジトリをgistにアップするgist.pl
とか作ってみた。
git レポジトリのルートで実行するとそのレポジトリの内容を gist にポストし、レポジトリの remote に投稿した gist を追加します。
いろいろ手抜きなので下に注意事項を書いておきます。
- 正確にはレポジトリの中身ではなくてカレントディレクトリ以下のすべてのファイルを投稿しちゃう (.git以下はのぞく)
- git config で github.user と github.token を登録しておく必要がある
- remote 名 は origin きめうち
- プライベートgistとかしらない
などという感じです。特に1は注意。必要に応じてverupする感じで。
gisty つかってたんですが、僕は何か作るときとりあえず git init するので、gisty だと gist に投稿したらそれ以降違う場所のレポジトリを使うという設計なのでちょっと面倒だったんですね。
git-svnなgitレポジトリをcloneするの法
git svn clone
は svn ログをたどるためでかい svn レポジトリになるととんでもなく時間がかかります。
なのですでに clone 済みの git レポジトリから clone したら簡単じゃんと思って素直に clone してみたのだけど、そのままじゃうまく clone 出来なかったのでメモ。
こんな感じでやればおk
# とりあえずレポジトリ作る
mkdir test
cd test
git init
# clone
git remote add origin http://co-workers-pc/dev/project/.git
git config --add remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
git fetch
git reset --hard trunk
# git svn の remote を再設定
git svn init -s http://yourrepos/svn/project/
git svn rebase
なんだか手間かかるけど git svn clone
するのと比べると圧倒的に速い。
いきなり clone しないで remote add
して config を追加してあげたあと fetch するのがポイントか。
master を trunk として使わないなら git reset
はいらんかな。あと、svn init
で -s
してないときはそもそも trunk ブランチとかないので注意。
multiverse.elで現在のファイルのスナップショットを取る - '(rubikitch wanna be (a . lisper))
プログラミングしているとき、実験的修正をしたくなることがあるだろう。もし実験が失敗したときに元に戻す...なんてことは日常茶飯事だ。
RCS、CVS、Subversion、Gitなどのバージョン管理システムはまさしくそれをやっているのだが、未完成のままではコミットはできない。たとえば、複数の(細かな)実装が思い付いたとき、どっちかひとつをコミットしたいなんて場合とか。
そこにgitを一緒に入れるのはなぜなんだ?
それをやるためにgitみたいなdistributedなバージョン管理システムがあると言っても過言でないくらいだと思うのだが。
master にコミットしちゃったのが微妙だけど branch に保存して残しておきたいとき
master にコミットしちゃったのが微妙だけど branch に保存して残しておきたいとき - 8時40分が超えられない - subtech
これ便利だなー branch 切らずに master に直接いれちゃえいう時が良くありますね(ブランチ切れよ)。んであとから見直したら微妙だはずしたい、というとき。push してなければ
git branch bimyou_branch git reset --hard modositai_tokorono_sha1
だけで master は元に戻るし、branch には残ってるしでばっちり。git おてがるー。(こまめにブランチは切りましょう)
いいね! git++
ただ「pushしてなければ」っていうのを見逃してかわいそうなことになる人がいるかもしれないので強調しておく。push しちゃってたらやっちゃだめよ!
remote branch を削除する方法
忘れないうちにメモ
~/dev/git/test (master)
$ git checkout -b testbranch
Switched to a new branch "testbranch"
~/dev/git/test (testbranch)
$ vim test.txt
~/dev/git/test (testbranch)
$ git commit -a
Waiting for Emacs...
Created commit 7dea716: modified test.txt
1 files changed, 1 insertions(+), 0 deletions(-)
~/dev/git/test (testbranch)
$ git push origin testbranch
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 267 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
refs/heads/testbranch: 0000000000000000000000000000000000000000 -> 7dea716ff6f4984c3d0256d09279e9d954af3dc4
To git@github.com:typester/test.git
* [new branch] testbranch -> testbranch
~/dev/git/test (testbranch)
$ git checkout master
Switched to branch "master"
~/dev/git/test (master)
$ git branch -D testbranch
Deleted branch testbranch.
~/dev/git/test (master)
$ git push origin :heads/testbranch
refs/heads/testbranch: 7dea716ff6f4984c3d0256d09279e9d954af3dc4 -> deleted
To git@github.com:typester/test.git
- [deleted] testbranch
vc-annotate
そういえば設定したなとおもっておもむろに M-x vc-annotate
してみたら git でもできた!
設定はこんなんで
http://svn.coderepos.org/share/dotfiles/emacs/typester/.emacs.d/conf/50_git.el
elファイルはgit自体についてくる。
fast-forward merge
は git-svn なブランチ上では予期せぬ動作になるので使用しない方がいいっぽい。
新しいコミット発生しないので git svn dcommit できなくなる。
git-svn 作業フロー
plagger レポジトリで作業するとする。svkとの比較つき。
まず git レポジトリ作成
git svn init -s http://svn.bulknews.net/repos/plagger/ plagger
これで、plaggerってディレクトリにgitレポジトリができる。svk mirror的なものですね
次にsvnとデータをsyncさせる。
cd plagger
git svn fetch
これは svk sync 的なもので対象の変更をすべてtrackしてmerge情報とかを記録する。なので重い。体感では svk sync 以上。
ちなみに最初の init の代わりに clone とすると一気に fetch までしてくれる。
trunk で作業するよ (ここからが通常のワークフロー)
git checkout trunk
で trunk に移動。
svn が変更されてるかもしれないので
git svn rebase
でチェック。(svk pull 的なもの)
いろいろ編集後
git commit -a
で git レポジトリにコミット。この時点ではローカルの git レポジトリにしか反映されてない。
svn に反映させるには
git svn dcommit
とする。これが svk push 的なもの。
ここまでが一応 co から ci までの流れ。
もう少し例。
fastladder-crawler ブランチで作業してみる
ブランチに移動
git checkout fastladder-crawler
いろいろ変更後コミット
git commit -a
このブランチをtrunkにマージしよう
まずtrunkに移動して
git checkout trunk
マージ
git merge fastladder-crawler
これだけ。すばらしく簡単。
ローカルブランチを作って作業も簡単
まずtrunkのローカルブランチをつくる。まずtrunkへ移動
git checkout trunk
test という名前のブランチ作成してそこに移動
git branch test
git checkout test
これは以下で一発にできる
git checkout -b test
いろいろ編集して test ブランチにコミット
git commit -a
それを trunk に反映
git checkout trunk
git merge test
用が済んだらtestブランチ削除
git merge -d test
とかいう感じ。
ブランチ作ったりマージしたりがさくさくできて気持ちいい。svk ユーザーは一度さわってみるといいと思う。
zsh の prompt に git のブランチ情報を表示
svk でやってたものの git 版。
ref: refs/heads/
という部分を消していいのか、ほかのものが入る場合があるのかよくわからなかったので全表示している。
まぁぱっと見で git とわかるからいいかということでとりあえず。
codereposにあげてあるよ。
あぁ、なんか ref: とかすらでずに sha-1 ハッシュ値だけのときもある。もう少し調べないとだめだ。