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 "<名前>"] ブロックを書き、event と command でフックを宣言できる。
定義の要点は次のとおりである。
eventにpre-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で読み込ませるような運用が必要。