mizdra's blog

ぽよぐらみんぐ

過去に git clone した OSS リポジトリを一覧する

ということをふと思いついた。定量的に物事を見れると良い振り返りができて嬉しいと思う。とりあえず集計だけでもやってみる。

shell の history から一覧を作る

どうやって一覧しよう、と思ってまず思いついたのが、shell の history を使う方法。ghq list で探しても良いけど、ディスク容量が減ってきたら見なくなったリポジトリを削除したりするので、やっぱり shell history からたどるのが良いだろうというアイデア。

history 1 の出力を grep すれば良いだけで、ちょっと前にも id:onk さんが似たようなことをされていた。

onk.hatenablog.jp

$ history 1 | awk '{ print $2,$3,$4 }' | grep -e 'git clone' | awk '{ print $3 }'
git@github.com:mizdra/typed-less-modules.git
git@github.com:vercel/next.js.git
git@github.com:madyankin/postcss-modules-example.git
...

普段は git clone ではなく ghq get を使っているので、OR 検索する。

$ history 1 | awk '{ print $2,$3,$4 }' | grep -e 'git clone' -e 'ghq get' | awk '{ print $3 }'
git@github.com:mizdra/typed-less-modules.git
git@github.com:vercel/next.js.git
git@github.com:madyankin/postcss-modules-example.git
git@github.com:mrmckeb/typescript-plugin-css-modules.git
--help
--shallow
...

ghq get --shallow <url> のようなケースが上手く考慮できていないので考慮してやる。ついでに --help は除外する。

$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' | grep -v '\-\-help' | awk '{ print $3,$4 }'
git@github.com:mizdra/typed-less-modules.git
git@github.com:vercel/next.js.git
git@github.com:madyankin/postcss-modules-example.git
git@github.com:mrmckeb/typescript-plugin-css-modules.git
--shallow git@github.com:vercel/next.js.git

id:mizdragit sclone という git clone --shallow の alias も使っているので、これも考慮する。

$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v '\-\-help' | awk '{ print $3,$4 }'
git@github.com:mizdra/typed-less-modules.git
git@github.com:vercel/next.js.git
git@github.com:madyankin/postcss-modules-example.git
git@github.com:mrmckeb/typescript-plugin-css-modules.git
--shallow git@github.com:vercel/next.js.git
git@github.com:garris/BackstopJS.git
...

自分以外の OSS のリポジトリのみに絞りたいので、org が自分のものは除外する (OSS を自分の org に fork したものも除外されてしまうけど…まあそんな数もないので気にせずで)。こういう時ハンドルネームがユニークだと、雑に除外条件を設定しても期待通りになってうれしい。

$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v -e '\-\-help' -e 'mizdra' | awk '{ print $3,$4 }'
git@github.com:vercel/next.js.git
git@github.com:madyankin/postcss-modules-example.git
git@github.com:mrmckeb/typescript-plugin-css-modules.git
--shallow git@github.com:vercel/next.js.git
git@github.com:garris/BackstopJS.git
...

完成系

という訳で、完成したワンライナーとその実行結果がこちら。private リポジトリ見られると良くないものや、mizdra 以外の org で自分が開発しているものなどは手作業で除外した。

$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v -e '\-\-help' -e 'mizdra' | awk '{ print $3,$4 }'
git@github.com:vnc0/magic-trackpad-switcher.git
git@github.com:mrmckeb/typescript-plugin-css-modules.git
git@github.com:AriPerkkio/eslint-remote-tester.git
git@github.com:zhouzi/graphql-codegen-factories.git
git@github.com:garris/BackstopJS.git
git@github.com:APIs-guru/graphql-faker.git
git@github.com:isucon/isucon11-qualify.git
git@github.com:vercel/next.js.git
--shallow git@github.com:vercel/next.js.git
git@github.com:vercel/next.js.git
git@github.com:jest-community/vscode-jest.git
https://github.com/jest-community/jest-editor-support.git
git@github.com:prettier/prettier.git
https://github.com/royriojas/file-entry-cache
--shallow git@github.com:microsoft/TypeScript.git
--shallow git@github.com:dotansimha/graphql-code-generator.git
git@github.com:madyankin/postcss-modules-example.git
git@github.com:facebook/docusaurus.git
git@github.com:postcss/postcss.git

同じリポジトリが何回も出力されていたり、--shallow が出ていたりするのが気になるけど、とりあえず良さそうなデータが集計できて満足した!

shell history だけだと clone 日時まではわからないので、なんか色々工夫したほうが良いのかもしれない。HISTTIMEFORMAT を変更して shell history に日付が埋め込まれるようにするのが良い気がするけど、これって過去の履歴壊れたりしないかな…どうしようかな…というところで悩み中。

takami-hiroki.hatenablog.com

おまけ

ところで一覧を見て、「なんか最近触ったリポジトリばかりだな…」と思ったのでちょっと調べてみたら…

$ history 1 | wc -l
    1068
$ echo $HISTSIZE
2000
$ cat ~/.zshenv | grep HISTSIZE
export HISTSIZE=1000000

.zshrc で設定した $HISTSIZE が上手く適用されていないのか、1068 件しか保存されてなさそう。というか値 3 つともバラバラになっている。そんな………………

追記 (2022/08/06 02:12)

どうやら shell history の最大件数は HISTSIZE ではなく HISTFILESIZE で調整するものらしい。

oplern.hatenablog.com

$ echo $HISTFILESIZE

$ cat ~/.zshenv | grep HISTFILESIZE
$ echo $?
1

何も設定していなくて、zsh のデフォルト値が使われていそう。そういうことだったのか…

追記 (2022/08/06 12:23)

もうちょっと調べてみたら、zsh で履歴の最大保存件数を表す環境変数は HISTFILESIZE ではなく SAVEHIST のようだった。これ shell ごとに違うんですね。

timesaving.hatenablog.com

$ echo $SAVEHIST
1000
$ cat ~/.zshenv | grep SAVEHIST
export SAVEHIST=1000000

.zshenvSAVEHIST 設定しているはずなのだけど、なぜか無視されていた。.zshenv で設定している他の環境変数 (export EDITOR="code --wait" とか) はちゃんと認識されているのだけどなー。なんでだろう。

追記 (2022/08/06 13:26)

メーリングリストで何か議論されていないかな…と思ってメーリングリストのアーカイブを検索してみる。アーカイブは https://www.zsh.org/mla/ にあるけど、全文検索機能は付いていないので、ここは Google で <キーワード> site:https://www.zsh.org/mla/ というクエリを打ち込んで調べる。Google 便利。

という訳で ghq get git@github.com:zsh-users/zsh.git する。こうして git clone した OSS リポジトリがまた1つ増えていく…

もう追う体力残ってないので、.zshrc に設定を移動して終わりにした。

ポケットモンスター・ポケモン・Pokémon・は任天堂・クリーチャーズ・ゲームフリークの登録商標です.

当ブログは @mizdra 個人により運営されており, 株式会社ポケモン及びその関連会社とは一切関係ありません.