git log
でその日に行ったcommitの一覧をターミナルに表示と、
markdownに出力したくなったので、そのメモとか解説とか注意点とか。
今日行った作業を表示する
![スクリーンショット 2015-12-07 11.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/27802/980a8b01-ab49-53f8-c5de-96b8e72bdb05.png)
こんな感じで、今日行った作業が一覧となって表示されます。
使い方
以下のエイリアスを、.gitconfigに追加する。
[alias]
today = "!f () {\
git log --oneline --reverse --branches \
--since=midnight --date=iso \
--author=\"$(git config user.name)\" \
--format=\" - %C(auto)%h%Creset : %s %C(green)(%ad)%Creset\";\
};f"
git today
と打てば実行されます。
$ git today
## 出力結果
- d9bed14 : first commit (2015-12-07 11:29:50 +0900)
- 700eeed : second commit (2015-12-07 11:30:00 +0900)
- 20ee988 : third commit (2015-12-07 11:30:06 +0900)
- bc5d42d : forth commit (2015-12-07 12:04:56 +0900)
ワンライナーでも書けるとは思いますが、見やすさ重視の為に、!f () { };f
を使用してます。
コピペでなく手入力で追加する際は、スペースの位置**( ()と{の間とか
)**に気をつけてください。
一部のoption、formatは好みがあると思うので、下記参考にしてカスタマイズしてもらえればと思います。
###オプション等の解説
-
--reverse
指定する事で、取得したコミットログを逆順で出力することができます。
これによって、今日の作業を昇順で出力することができます。オプションをつけなければ通常どおり、最新のものから順に降順で出力されます。 -
--branches
指定することで、コミットログを出力する対象を全てのブランチにすることができます。
特定のブランチのみを指定することもできますし、指定しなければ、自分が今いるブランチに対してのコミットログのみを対象とすることができます。 -
--since
--since=midnight
を指定することで、その日の0:00からのコミットログに絞ることができます。
--since="1 day ago"
や、--since="24 hours ago"
とかでも近いことは出来ますが、コマンドを実行した時刻からの相対になってしまうため、おすすめできません。 -
--date
指定することで、時刻の形式を変更することができます。後述の--format
で表示する時刻の形式にも影響します。
--date=iso
と指定すると、"YYYY-MM-DD HHss"の形式にすることができます。(タイムゾーンも付加されてしまいますが...)
指定できるものは、「git logのフォーマットを指定する (のページ下部)」が参考になると思います。 -
--author
--author="name"
と指定することで、コミットログのうち、指定したAuthorのものだけに絞ることができます。
自分のみのプロジェクトなら問題ないですが、複数人で作業しているプロジェクトだと、他の人が混ざってしまうこともあるので、自分の名前を指定します。
ただ、名前を直書きするのもあれなので、
--author=\"$(git config user.name)\"
と書いて、.gitconfigから取得するようにしています。プロジェクト毎にuser.nameを指定していればそれを、そうでなければ、globalの.gitconfigから取得する形になります。 -
--format
出力するときのフォーマットを指定します。指定しないと、デフォルトフォーマットが適応され、以下のようになります。
d9bed14 first commit
700eeed second commit
20ee988 (HEAD -> master) third commit
bc5d42d (develop) forth commit
自分の場合は、
--format=\" - %C(auto)%h%Creset : %s %C(green)(%ad)%Creset\"
と指定して、
- コミット番号 : コミットメッセージ (時刻)
となるようにしています。ついでに色付けも行っています。
先頭に-
を付加しているので、markdownファイルに出力したときはそのままリスト形式になったりします。
(余談:
時刻が含まれていると、自分で確認する分にはいいですが、
これを後述の、ファイル出力して、誰かに提出するときとかはどの時間に何やったかわかってしまうので、
除いたほうがいいかもしれないですね。笑
)
フォーマット、色付けに関しては以下が参考になると思います。
今日行った作業をファイル(.txt等)に出力する
上記todayエイリアスの--format
に色指定を入れていない場合は...
エイリアス登録の際に、--format
内に色の指定をしていなければ、以降の作業は不要です。
そのまま、
git today > path/to/log.txt
のようにして出力することができます。
ここまでで、ターミナルに表示することができるようになったので、いつでもgit today
と打てば、
今日自分これだけやったんだなーって確認することができます。
git todayの内容を、
$ git today > log.txt
などとしてあげれば、テキストファイルに出力することができます。
ただ、1つだけ問題があって、--format
内で色の変更を指定していると、正しい出力結果が得られない場合があります。
試しに上記コマンドを実行して、log.txtを除いてみると...
$ git today > log.txt
$ less log.txt
## 出力結果
- [33md9bed14[m[m : first commit [32m(2015-12-07 11:29:50 +0900)[m
- [33m700eeed[m[m : second commit [32m(2015-12-07 11:30:00 +0900)[m
- [33m20ee988[m[m : third commit [32m(2015-12-07 11:30:06 +0900)[m
- [33mbc5d42d[m[m : forth commit [32m(2015-12-07 12:04:56 +0900)[m
こんな感じで、[m
などといった、"エスケープシーケンス"がついてしまいます。
ちなみに、cat log.txt
とやるぶんにはこのようにはなりません。less
で見たり、FinderからtxtファイルをEditorで開くとこうなるかと思います。
cat
とless
で違う結果になってしまう理由がわかってなくてすみません。。
寄り道になりますが、エスケープシーケンスについてはこちらを。(@riocampos さんより。)
参考:シェル - echoで文字に色をつける その1
回避策としては、--format
内で色の変更をしないようにするのが一番楽かと思います。
ただ、ターミナルで表示するときは色がついてて欲しい!って場合は、以下のようにエイリアスを別で用意して(あまりうまい方法とはいえないかもですが...)、
git today-output > log.txt
とすればうまくいきます。
[alias]
today-output = "!f () {\
git log --oneline --reverse --branches \
--since=midnight --date=iso \
--author=\"$(git config user.name)\" \
--format=\" - %h : %s \";\
};f"
※today
エイリアスから色を抜いて、時刻も抜いています。(上記余談参照。)
$ git today-output > log.txt
$ less log.txt
## 出力結果
- d9bed14 : first commit
- 700eeed : second commit
- 20ee988 : third commit
- bc5d42d : forth commit