Git 2.41 ソース管理システムが利用可能

2.41 か月の開発を経て、分散ソース管理システム Git XNUMX のリリースが公開されました。 Git は、最も人気があり、信頼性が高く、高性能のバージョン管理システムの XNUMX つであり、ブランチの分岐とマージに基づいた柔軟な非線形開発ツールを提供します。 履歴の整合性と遡及的変更への耐性を確保するために、各コミットで以前の履歴全体の暗黙的なハッシュが使用され、開発者からのデジタル署名を使用して個々のタグとコミットを検証することもできます。

以前のリリースと比較して、542 人の開発者の参加によって準備された新しいバージョンには 95 件の変更が受け入れられ、そのうち 29 人が初めて開発に参加しました。 主な革新:

  • リポジトリ内で参照されていない (ブランチまたはタグが参照されていない) 到達不能オブジェクトの処理が改善されました。 到達不能なオブジェクトはガベージ コレクターによって削除されますが、競合状態を避けるために、削除される前に一定時間リポジトリに残ります。 到達不能オブジェクトの期間を追跡するには、同様のオブジェクトの変更時刻をラベルにバインドする必要があります。これでは、すべてのオブジェクトが共通の変更時刻を持つ XNUMX つのパック ファイルにオブジェクトを保存できません。 以前は、各到達不能オブジェクトは個別のファイルに保存されていたため、まだ削除の対象になっていない新しい到達不能オブジェクトが多数ある場合に問題が発生していました。 新しいリリースでは、デフォルトで、「クラフト パック」メカニズムを使用して到達不能オブジェクトをパックします。これにより、すべての到達不能オブジェクトを XNUMX つのパック ファイルに保存し、各オブジェクトの変更時刻のデータを、拡張子「.mtimes」のファイルを作成し、拡張子「.idx」のインデックス ファイルを使用してリンクします。
    Git 2.41 ソース管理システムが利用可能
  • デフォルトでは、パック ファイルのディスク上での逆インデックス (revindex) の維持が有効になっています。 Torvalds/Linux リポジトリでテストしたところ、逆インデックスを使用することで、リソースを大量に消費する「git Push」操作を 1.49 倍高速化でき、また、「git cat- file --batch='%(objectsize:disk)' » 77 回。 逆引きインデックスを持つファイル (「.rev」) は、リポジトリ内の「.git/objects/pack」ディレクトリに保存されます。

    Git はすべてのデータをオブジェクトの形式で保存し、別のファイルに配置することを思い出してください。 リポジトリの操作効率を高めるために、オブジェクトはさらにパック ファイルに配置されます。パック ファイルでは、情報が次々に続くオブジェクトのストリームの形式で表示されます (git fetch および git でオブジェクトを転送するときにも同様の形式が使用されます)プッシュコマンド)。 パック ファイルごとにインデックス ファイル (.idx) が作成されるため、指定されたオブジェクトがオブジェクト識別子によって格納されるパック ファイル内のオフセットを非常に迅速に判断できます。

    新しいリリースに含まれる逆インデックスは、パック ファイル内のオブジェクトの場所に関する情報からオブジェクト ID を決定するプロセスを合理化することを目的としています。 以前は、このような変換はパック ファイルの解析中にオンザフライで実行され、メモリにのみ保存されていたため、そのようなインデックスの再利用ができず、毎回インデックスを生成する必要がありました。 インデックスを構築する操作は、オブジェクトと位置のペアの配列を構築し、それを位置でソートするだけですが、パック ファイルが大きい場合は長時間かかることがあります。

    たとえば、直接インデックスを使用したオブジェクトの内容を表示する操作は、位置とオブジェクトの関係データにインデックスが付けられていないオブジェクトのサイズを表示する操作より 62 倍高速でした。 逆インデックスを使用した後は、これらの操作にほぼ同じ時間がかかるようになりました。 逆インデックスを使用すると、既製のデータをディスクから直接転送することで、フェッチおよびプッシュ コマンドを実行するときにオブジェクトの送信操作を高速化することもできます。

    Git 2.41 ソース管理システムが利用可能

  • 制限されたリポジトリにアクセスするときに資格情報を渡すために使用される「資格情報ヘルパー」プロトコルに、資格情報ハンドラーと認証サービスの間で WWW-Authenticate ヘッダーを渡すためのサポートが追加されました。 WWW-Authenticate ヘッダーのサポートにより、OAuth スコープ パラメーターをリポジトリへのよりきめ細かく個別のユーザー アクセスに渡し、リクエストに使用できるスコープを区切ることができます。
  • フォーマットオプション「%(ahead-behind: )」を使用すると、別のブランチと比較して、特定のブランチに存在するコミット数または存在しないコミット数に関する情報 (コミットのレベルで、あるブランチが別のブランチよりどれだけ遅れているか、または進んでいるか) に関する情報をすぐに取得できます。 以前は、この情報を取得するには、ブランチに固有のコミット数を取得する「git rev-list --count main..my-feature」と、「git rev-list --count my-feature..」という 2 つの別々のコマンドが必要でした。 main" を実行して、欠落しているコミットの数を取得します。 このような計算を 96 つのコマンドに減らすことができるため、ハンドラーの作成が簡素化され、実行時間が短縮されます。 たとえば、マージされていないブランチを表示し、それらがメイン ブランチの後ろにあるか前にあるかを評価するには、次のワンライナーを使用できます。 $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(ahead-behind :origin/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 16 96 tb/for-each-ref—以前に使用したスクリプトの代わりに 47 3 tb/roaring-bitmaps 17 2 を除外します。これは 96 倍遅くなります: $ git for-each-ref - format='%(refname:short)' --no-merged=origin/HEAD \ refs/heads/tb | while read ref do Above="$(git rev-list --countorigin/HEAD..$ref)" Behind="$(git rev-list --count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" 完了 | 列 -t tb/cruft-extra-tips 16 96 tb/for-each-ref—exclude 47 3 tb/roaring-bitmaps XNUMX XNUMX
  • 「git fetch」コマンドに「--porcelain」オプションを追加しました。これは、「」形式で出力を生成します。 」と読みにくくなりますが、スクリプトでの解析には便利です。
  • サーバーがオブジェクトの完全なセットを送信したかどうかをチェックする段階で、ローカル リポジトリ内のリンクの一部を非表示にすることで「git fetch」操作を高速化する「fetch.hideRefs」設定を追加しました。これにより、チェックをサーバーのみに限定することで時間を節約できます。そこからデータが直接取得されます。 たとえば、追跡対象の外部リンクが多数含まれるリポジトリを含むシステムでテストする場合、$remote ターゲット サーバーに宛てられたリンクを除くすべてのリンクを除外すると、「git fetch」操作が 20 分から 30 秒に短縮されました。 $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • 「git fsck」コマンドは、アクセシビリティ ビットマップと逆インデックスの値の破損、チェックサムの一致、正確性をチェックする機能を実装します。
  • $GIT_DIR 内のシンボリック リンクを含むリポジトリからコピーしようとすると、「git clone --local」コマンドでエラーが表示されるようになりました。

出所: オープンネット.ru

コメントを追加します