7月30日、GitLabで「What’s new in Git 2.46.0?」と題した記事が公開された。この記事では、Git 2.46.0の新機能と改良点について詳しく紹介されている。
1. reftablesフォーマットへの移行コマンド git-refs
Git 2.45.0で導入されたreftablesフォーマットは、大規模リポジトリにおけるパフォーマンスや管理を改善する新しいバックエンドである。このリリースでは、既存のリポジトリをreftablesフォーマットに移行するための新しいコマンドgit-refs
が導入された。以下はその使用例である。
# 新しいリポジトリを「ベア」として初期化
$ git init --bare .
$ git commit --allow-empty -m "init"
# 参照をファイルバックエンドで生成
$ git branch foo
$ git branch bar
$ tree .git/refs
.git/refs
├── heads
│ ├── bar
│ ├── foo
│ ├── main
└── tags
# reftablesフォーマットに移行
$ git refs migrate --ref-format=reftable
# 新しいバックエンドの確認
$ tree .git/reftable
.git/reftable
├── 0x000000000001-0x000000000001-a3451eed.ref
└── tables.list
# リポジトリの設定確認
$ cat config
[core]
repositoryformatversion = 1
filemode = true
bare = true
ignorecase = true
precomposeunicode = true
[extensions]
refstorage = reftable
リポジトリが移行されると、ディスク上のフォーマットがreftablesバックエンドに変更される。移行ツールには現在いくつかの制限があり、reflogsやworktreesを含むリポジトリでは使用できないが、将来的には改善される可能性がある。
2. トランザクションによるsymref更新
git-update-ref
コマンドは、参照の更新をトランザクションとして一括して行うことができる。このリリースでは、新たにsymref-create
、symref-update
、symref-delete
、symref-verify
といった操作が追加され、トランザクション内でシンボリックリファレンスを更新する機能が提供された。
# symrefの作成
$ git symbolic-ref refs/heads/symref refs/heads/main
# symrefの更新
$ git update-ref --stdin --no-deref <<EOF
> start
> symref-create refs/heads/new-symref refs/heads/main
> symref-update refs/heads/symref refs/heads/new-ref
> commit
> EOF
$ git symbolic-ref refs/heads/symref
refs/heads/new-ref
$ git symbolic-ref refs/heads/new-symref
refs/heads/main
3. git-configコマンドのUX改善
git-config
コマンドは、リポジトリやグローバルの設定を表示・設定するためのものである。このリリースでは、より現代的なUIに合わせてlist
、get
、set
、unset
などのサブコマンドが導入された。
$ git config list
$ git config get user.name
$ git config set user.name "Sidney Jones"
4. パフォーマンス問題の修正
Git 2.43.0では、bareリポジトリの.gitattributes
ファイルの読み取りがデフォルトで有効になったが、これがパフォーマンスに重大な影響を与えることが判明した。今回のリリースでは、この設定が一部元に戻され、パフォーマンスの改善が図られた。
5. ユニットテストの移行
Gitプロジェクトでは、従来のシェルスクリプトによるエンドツーエンドテストに加え、新たにC言語で書かれたユニットテストフレームワークが導入された。今回のリリースでは、いくつかのテストがユニットテストフレームワークに移行された。
詳細はWhat’s new in Git 2.46.0?を参照していただきたい。