Hata's Blog

個人的にやっているgitプロジェクトのセットアップ方法

この記事では、私が仕事やOSSプロジェクトをセットアップする際にやっていることを紹介します。主にgit hook の設定や作業メモの作成のtipsなどです。この記事を読まれる方にとっては今更な知識が多いですが、自分のためにもまとめておきます。

ghqでリポジトリをcloneする

gitプロジェクトは基本的にghqでcloneします。ghqはリポジトリを特定のディレクトリ以下にcloneしてくれるツールです。リポジトリの管理がしやすくなるのでおすすめです。

GitHub - x-motemen/ghq: Remote repository management made easyRemote repository management made easy. Contribute to x-motemen/ghq development by creating an account on GitHub.
favicon of https://github.com/x-motemen/ghqgithub.com
ogp of https://opengraph.githubassets.com/2a0f8f7a65ec390618012dd7d68abc796ff1918de4716af0f8a6348dd8c832e3/x-motemen/ghq
ghq get https://github.com/hoge/hoge.git

ghqでリポジトリを管理する一番の恩恵は、なんといってもpeco等のインクリメンタルサーチが可能になるツールと組み合わせて、リポジトリ移動が便利になることです。

ghq + インクリメンタルサーチツールを使ったリポジトリ管理の記事はいくらでもあるので、詳しい説明はそちらに譲ります。

ghqでリポジトリ管理を簡単にする
favicon of https://zenn.dev/oreo2990/articles/13c80cf34a95afzenn.dev
ogp of https://res.cloudinary.com/zenn/image/upload/s--zayjZZ3Z--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:ghq%25E3%2581%25A7%25E3%2583%25AA%25E3%2583%259D%25E3%2582%25B8%25E3%2583%2588%25E3%2583%25AA%25E7%25AE%25A1%25E7%2590%2586%25E3%2582%2592%25E7%25B0%25A1%25E5%258D%2598%25E3%2581%25AB%25E3%2581%2599%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:oreo2990%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzdlZWE4N2IyOGEuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png

lefthookを使ったgit hookの設定

大体の場合、仕事やOSSのプロジェクトにはCIが設定されています。十分なのですが、個人的にリモートに上げてからCIがコケると面倒に感じるので、基本的にLintやテストはリモートにプッシュする前にチェックします。 ですが人間なので、ついつい忘れてしまうこともあります。そのため、git hookを使ってチェックするようにしています。 git hookは、gitのコマンドを実行する際に自動で実行されるスクリプトです。pre-commitpre-pushなどがあります。私は主にpre-pushを使っています。一時期はpre-commitも使っていましたが、作業効率が落ちると感じたのでやめました。

git hookの設定には、lefthookを使っています。lefthookは、git hookの設定を簡単にしてくれるツールです。

GitHub - evilmartians/lefthook: Fast and powerful Git hooks manager for any type of projects.Fast and powerful Git hooks manager for any type of projects. - evilmartians/lefthook
favicon of https://github.com/evilmartians/lefthookgithub.com
ogp of https://repository-images.githubusercontent.com/169250119/0bf8ef80-96c8-11e9-98c4-5c275172132d

以前はhuskylint-stagedを組み合わせて使っていたのですが、ツールが2つ必要かつ依存関係が多い1ことと、huskyはNode.jsが必要になるのが面倒に感じ、Go製のlefthookに乗り換えました。

lefthookはプロジェクト配下でlefthook installをするとボイラープレートが生成されるので、あとは.lefthook.ymlにhookの設定を書くだけなのですが。自分は運用にいくつかの味付けをしています。

lefthook設定ファイルををgitignore globalにする

基本的にgit hookはgit管理下になりませんが、設定ファイルのlefthook.yml(例)はプロジェクト配下に置かれます。huskyにも同じ問題を抱えていますが、個人的に使用しているツールの設定ファイルがgit管理されたくない問題があります。 まだ自分のプロジェクトなら問題ありませんが、複数人が携わる仕事のプロジェクトに導入するモチベも特にないですし、OSSでは論外です。.gitignoreに記述するにも気が引けます。

そこで、~/.config/git/ignorelefthook.ymlを追加し、git管理下に設定ファイルが入らないようにしています。

# ~/.config/git/ignore
lefthook.yml

少し本末転倒感があり、git hookマネージャを使わずgit hookに手作業でスクリプトを追加した方が良いのではないかと思うかもしれません。

ただ、lefthookは実行時に適切なファイルに置き換えられるファイルテンプレート機能2(たとえば{push_files}という変数を使うことで、コミットされたがpush前のファイルのみを対象にチェックできる)をはじめ、便利な機能があるのでこういった運用をしています。

あとは、lefthook.ymlのコマンドのプレフィックスを数字にして、実行順を制御するくらいでしょうか。

# lefthook.yml
pre-push:
	commands:
		1_test:
			run: go test ./... -shuffle
		2_lint:
			run: golangci-lint run

おわりに

個人的にやっているgitプロジェクトのセットアップ方法を紹介しました。ここで紹介したツールは全てGoで書かれています。シングルバイナリを吐き出してくれるというのと、Goで書かれているので、いざなにか問題があったときに自分で修正できるというのが理由です。

Footnotes

  1. https://arc.net/l/quote/ukodtyet

  2. https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md#run

x(Twitter)にポスト
Profile
Shoki Hata

決済領域のソフトウェアエンジニア。週末はコーヒー豆を焙煎しています。