Git プロジェクトは、 可能な限り下位互換性を確保することを狙っています。 マイナー・リリースでは、 セキュリティ上の脆弱性など、 非常に強い理由がない限り、下位互換性が失われることはありません。
それでも、 Git プロジェクトはとにかく古くからあるあるため、 変化する世界に合わせてプロジェクトを維持するために最終的に必要となる、 下位互換性のない変更のバックログが蓄積するのは当然のことです。 こういう変更はいくつかのカテゴリに分類されます:
-
デフォルトを長年に渡り確立されてきたものに変更する。
-
概念をより優れたデザインで置き換える。
-
大きく機能が足りない点があり、 かつ、 修正できないため、 置き換えできずに削除する、 概念やコマンドや構成やオプション。
ユーザーから見える振る舞いの変更を引き起こす可能性があっても、 軽微なバグの修正は、 このリストには入れません。
Git プロジェクトは、 古いバージョンとの下位互換性を意図的に破壊する破壊的なバージョンを不定期にリリースします。 これは、 Git が今後とも有意義であり続け、 安全性や保守性を維持できるようにするために行われます。 通常、 破壊的最新バージョンのリリース頻度は数年ごとに見られます。 過去には以下の主要な破壊的リリースがありました:
-
2008年8月リリースの Git 1.6.0
-
2014年5月リリースの Git 2.0
最近では、 Git 2.0 から初めた <メジャー>.<マイナー> 形式のリリース番号を使用しています。 将来のリリースについては、 次の最新リリースを作成するときにリリース番号の <メジャー> をインクリメントする予定です。 Git 2.0 より前は、 リリース番号形式は 1.<major>.<minor> でしたが、これは「通常の」互換性を損なうリリースのために <major> をインクリメントすることを目的としており、 非常に大きな下位互換性破壊を伴う重大な変更のために Git 2.0 への飛躍を予約しておいたものです。
このドキュメントの目的は、 将来の最新リリースで予定されている非推奨(deprecations)を追跡することです。 さらに、 このドキュメントでは、 非推奨にならないものについても追跡します。 これは、 議論が非推奨を支持する場合と、 非推奨を拒否する場合の両方を議論の結果の文書に文書化するために行われます。
項目には、 メーリング・リストでの議論を読まなくても簡単に理解できるような、 記載の変更を、行う理由・行わない理由の明確な概要が含まれている必要があります。 変更する機能の代替手段がある場合は、 それをユーザーに提示すべきです。
すべての項目には、 非推奨が議論された、 関連するメーリング・リストのスレッドへの参照を添付する必要があります。 これらの参照はメッセージ ID を使用しており以下によりアクセスできます
https://lore.kernel.org/git/$message_id/
これにより、 メッセージとそれにまつわる議論を確認します。 このような参照は、 当時、 そのプロジェクトがどのようにして説明された項目に関して合意に達したかを見つけやすくするためにあります。
プロジェクトを取り巻く環境は時間の経過とともに変化するため、 これは随時更新される文書です。 状況が変化した場合、 何かを廃止または変更するという、 以前決定したことをしばしば再検討する必要がある場合があります。 したがって、 このリストにある項目を「解決済みなので、 これを再度取り上げて時間を無駄にする必要はありません」という意味に受け取らないでください。
手順
重大な変更を加えたいことについて話し合い、 そして特定のバージョン境界で重大な変更を行うことを宣言し、 そしてこれらの決定をこの文書に記録することは必要ですが、 それで充分ではありません。 このような変更は多数になることが予想され、 その設計と実装は長期間にわたることが予想されるため、 そのようなバージョン境界で簡単にデプロイできる必要があります。
この処理手順を支援するために、 破壊的変更はコンパイル時スイッチ WITH_BREAKING_CHANGES で保護されなければなりません。 これを使用してビルドすると、 結果として得られる Git バイナリとそのドキュメントは、 次の大きなバージョン境界に予定されている重大な変更がすでに有効であるかのように振る舞います。 また、 これらの重大な変更を含む進行中のバージョンの Git を実行するための CI ジョブを 1 つまたは 2 つ用意する必要があるかもしれません。
Git 3.0
以下のサブセクションでは、 Git 3.0 の破壊的な変更について説明します。 この最新バージョンのリリース予定日は全く決まっていません。 このリリースの変更に使用されるアーリー・アダプター構成(early adopter configuration)は feature.git3
です。
提案されている変更および削除には、 行う「準備ができている(ready)」項目のみが含まれています。 言い換えれば、 これは、 代替機能がすでに実装されている場合に備えて、 変更または置き換えるべき機能の欲しい物リスト(wishlist)であることを想定していません。
変更されるもの
-
新しいリポジトリのデフォルトのハッシュ関数は、「sha1」から「sha256」に変更されます。 SHA-1 は 2011 年に NIST によって非推奨になり、 現在では FIPS 140-2 および同様の認証で使用しないことが推奨されています。 さらに、 以下のような SHA-1 の暗号特性を弱める実用的な攻撃がありました:
-
SHAppening (2015): 2^57 演算による SHA-1 に対する実用的な攻撃の最初のデモンストレーション。
-
SHAttered (2017): 2^63 演算による 2 つの有効(valid)な PDF ファイルの生成。
-
Birthday-Near-Collision (2019): この攻撃では、2^68 演算による選択プレフィックス攻撃(chosen prefix attacks)が可能になります。
-
Shambles (2020): この攻撃では、2^63 演算による選択プレフィックス攻撃(chosen prefix attacks)が可能になります。
既知の攻撃に対しては防御策が講じられていますが、 今後の研究により SHA-1 に対するさらに多くの攻撃が発見されることが予想されます。 ハードウェアの機能が成長し続けることと相まって、 SHA-1 を完全に破れるとみなされるのも時間の問題です。 我々はこれに備えたいので、 新しく初期化されるリポジトリのデフォルトのハッシュ・アルゴリズムを「sha256」に変更します。
この変更の重要な要件は、 エコシステムが「sha256」オブジェクト形式をサポートする準備ができていることです。 これには、 一般的な Git ライブラリやアプリケーションやフォージ(forges)が含まれます。
「sha1」オブジェクト形式を廃止する予定は、 現時点では何もありません(no plan)。
参照: <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>, <20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>, <CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
-
削除されるもの
-
grafts コミットのサポートは、 git-replace(1) に置き換えられて久しいです。 grafts は 置換 refs (replacement refs)よりも劣っています:
-
grafts はローカルのみのメカニズムであり、 リポジトリ間にまたがって共有することができません。
-
grafts は、リポジトリ間でオブジェクトを転送するときに診断が難しい問題を引き起こす可能性があります。
e650d0643b (文書: mark info/grafts as outdated, 2014-03-05)以降、 grafts メカニズムは時代遅れのモノとしてマークされています。 削除されます。
-
-
git-pack-redundant(1) コマンドを使用して、 重複したパック・ファイルを削除できます。 このサブ・コマンドは耐え難いほど遅いのですが、 これをパフォーマンスのバグとして誰も報告しない理由は、 このコマンドの利用者が存在しないことが原因であると考えられます。 私達はこのコマンドを削除対象に指定し、 コマンドが実行されるたびに利用者に表示される警告を発する事にしました(c3b58472be (pack-redundant: gauge the usage before proposing its removal, 2020-08-25))。
これまでのところ、 誰かがまだこのコマンドを使用しているという苦情が 1 件ありましたが、 その苦情によって方針を変更することはありませんでした。 それどころか、 非推奨についてはさらに強化しており、 4406522b76 (pack-redundant: escalate deprecation warning to an error, 2023-03-23) 以降は、 利用者が
--i-still-use-this
オプションを渡さない限り、 コマンドは終了(die)します。その後苦情は寄せられていないため、 このコマンドは最終的には削除される予定です。
参照: <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>, <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>, <20230323204047.GA9290@coredump.intra.peff.net>,
廃止されずに新機能に取って代わられたもの
一部の機能は、 特定の方法で設計を改善することを目的として、 新しい代替品を取得しました。 代替品があるからといって古いやり方が自動的に削除されることを意味するものではありません。 このセクションでは、 より新しい代替品を持つこれらの機能を追跡していきます。
-
git-checkout(1) が提供する機能は、 コマンド git-restore(1) と git-switch(1) のペアでカバーされています。 git-checkout(1) の使用は依然として広く普及しており、 この状態がすぐに変化するとは予想できないため、 3 つのコマンドはすべてそのまま残ります。
この決定は、 当該コマンドのユーザーがほとんどいないことが判明したときは、 再検討されるかもしれません。