Hatena::ブログ(Diary)

アジャイルSEを目指すブログ

2010-12-08

tmp コミットのための独自サブコマンド git-now

追記[2011/09/26]

  • git-now のurlをgistからgit-hubに変更しました。

追記[2011/10/17]

一時的なtmp コミットや、簡単なログメッセージのコミット(push 前にログメッセージを整えています)を作るとき、今まで↓みたいな事をしていました。

で、これを使いながら「〜〜も出来たら便利かもー」とかつぶやいていたら、隣の人が一晩で(ry

f:id:sinsoku:20101207225422j:image

と、そんな感じで出来たgit-now の紹介

簡単な実行例

  • コマンド
$ git now

これで、版管理されているファイルのtmp コミットが作成できます。

[from now] Tue Dec  7 23:00:24     2010

diff --git a/hello.py b/hello.py
index 51cff9f..9e84b86 100644
--- a/hello.py
+++ b/hello.py
@@ -3,4 +3,4 @@

 if __name__ == '__main__':
-    print 'Hello'
+    print 'Hello, World!!'

使い方

  1. トピックブランチで作業中に、コミットメッセージを考えて手が止まったらとりあえず「git なう」しておく
  2. 作業が終わったら、歴史を整える
    1. rebase でコミットメッセージを整える( git now --rebase )
    2. master に1つのコミットとしてマージしてしまう( git merge --squash topic-branch )
  3. push する

インストール方法

  1. https://github.com/toshi-kawanishi/git-now からgit-now をダウンロードする。
  2. %GIT_HOME%/libexec/git-core にgit-now を置く。

ソース

  • git-now (rev:ce05ba)
#!/bin/sh

PREFIX="from now"
MESSAGE="[${PREFIX}] `date`"

if [ $# -eq 0 ]
then
    git add -u
    printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
elif [ $1 != "--rebase" ]
then
    git add $@
    printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
else
    FIRST_NOW_COMMIT=`git log --pretty=oneline --grep="${PREFIX}" | tail -n 1 | cut -d " " -f 1`
    INITIAL_COMMIT=`git log --pretty=oneline | tail -n 1 | cut -d " " -f 1`

    if [ ${FIRST_NOW_COMMIT} != ${INITIAL_COMMIT} ]
    then
        git rebase -i ${FIRST_NOW_COMMIT}^
    else
        WORKING_BRANCH=`git branch -l | grep "*" | cut -d " " -f 2`

        git checkout ${FIRST_NOW_COMMIT}
        git commit --amend
        git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}
    fi
fi

ヘルプ

git-now(1)
==========

NAME
----
git-now - Record changes to the repository with a log message from time now and diff

SYNOPSIS
--------
[verse]
'git now' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
	  [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
	  [--refresh] [--ignore-errors] [--ignore-missing] [--]
	  [<filepattern>...]
'git now' [--rebase]

DESCRIPTION
-----------
一時的なコミットを簡単に作成できます。
このコマンドで作成したコミットは--rebase オプションで簡単に変更できます。

OPTIONS
-------
--rebase 以外::
	基本的にadd と同じ

--reabase::
	git-now で変更したコミットを書き換えることができる
	HEAD から辿り、一番古いgit-now コミットからrebase を始める

EXAMPLES
--------
現在時刻と差分をコミットログにして、版管理の対象ファイルを全てコミットする

------------
$ git now
------------

Documentation のサブディレクトリを含む *.txt ファイルをadd してから、
現在時刻と差分をコミットログにしてコミットする

------------
$ git now Documentation/\*.txt
------------

一番古いgit now のコミットからrebase を始める

------------
$ git now --rebase
------------


Author
------
Written by toshi-kawanishi and sinsoku

*1:英語でかっこいいヘルプ書こうと思ったけど、無理だった...orz

mobcovmobcov 2011/10/14 16:33 rebaseをsubcommand化して、あとオプション追加したり、zshの補完関数書いてみたりました↓
https://github.com/iwata/git-now
もし許可がいただけるようでしたら、これをhomebrewのrepositoryにpull requestしようと思っているのですが、いかがでしょうか?

sinsokusinsoku 2011/10/17 17:57 >mobcov さん
返信遅くなり、すみません。
長くなりそうなので、この後メールを送ります。

mobcovmobcov 2011/10/17 23:31 メールありがとうございます!
早速cherry-pickしてREADMEにも追記しておきましたー
コードもうちょっときれいにしたらhomebrewにpullリク送ろうとおもいまう。

sinsokusinsoku 2011/10/18 01:05 >mobcovさん
ありがとうございます!

kompirokompiro 2011/11/05 16:40 あれ?すみません。
--rebase オプションって、サブコマンド化されてますか?もしかして。

sinsokusinsoku 2011/11/07 14:53 >kompiroさん
rebase はサブコマンド化されています。
すみません、ブログの内容が古くなっていますね...

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証