544文字
3分
編集

Git 2.54

Git 2.54.0 がリリースされた。

実験コマンドの git history は、コミットメッセージの書き換え(reword)と、対話的に hunk を選んで 1 つのコミットを 2 つに分ける(split)に対応する。作業ツリーやインデックスは触れずベアリポジトリでも動かせる一方、マージコミットを含む履歴や、結果としてマージコンフリクトが発生する操作は拒否する。実装は git replay 周りの基盤に載っている。

#設定ファイルのフック

これまでフックは $GIT_DIR/hooks(または core.hooksPath)に置いた実行可能スクリプトでしか定義できなかった。2.54 では、Git 設定に [hook "<名前>"] ブロックを書き、eventcommand でフックを宣言できる。

定義の要点は次のとおりである。

  • eventpre-commit などのイベント名、command に起動するコマンドを書く。ブロックは ~/.gitconfig、システムの gitconfig、リポジトリローカルの設定 .git/configなど、いつもの優先順位で読まれる設定ファイルのどこにでも置ける。
  • 同じ event に対して複数ブロックを並べられる。実行順は、Git が設定を読み取った順に従う。
  • 登録内容を確認するには git hook list <イベント> を使う。どの設定層(global や local など)由来かも表示される。
  • ブロック単位で止めたいときは hook.<名前>.enabled = false とする。システム全体の設定で定義しつつ、特定リポジトリだけ外す、といった使い方がしやすい。
  • $GIT_DIR/hooks に残している従来のスクリプトはこれまでどおり動き、設定で宣言したコマンドより後に実行される。

たとえば pre-commit にリンタと秘密情報検査を並べる場合は次のように書く。

plaintext
[hook "linter"]
	event = pre-commit
	command = ~/bin/linter --cpp20

[hook "no-leaks"]
	event = pre-commit
	command = ~/bin/leak-detector

登録の確認例は次のとおり。

plaintext
$ git hook list pre-commit
global	linter	~/bin/linter --cpp20
local	no-leaks	~/bin/leak-detector

これ単体でhuskyなどのようにリポジトリローカル上にファイルとしてフック管理できる機能ではないため、もしそのような運用をしたい場合は、git config --local include.path ../.gitconfig.localで読み込ませるような運用が必要。

#参考文献