{"id":92344,"date":"2025-11-17T09:54:31","date_gmt":"2025-11-17T17:54:31","guid":{"rendered":"https:\/\/github.blog\/?p=92344"},"modified":"2025-11-17T10:18:15","modified_gmt":"2025-11-17T18:18:15","slug":"highlights-from-git-2-52","status":"publish","type":"post","link":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/","title":{"rendered":"Highlights from Git 2.52"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><p>The open source Git project <a href=\"https:\/\/lore.kernel.org\/git\/xmqqh5usmvsd.fsf@gitster.g\/\">just released Git 2.52<\/a> with features and bug fixes from over 94 contributors, 33 of them new. We last caught up with you on the latest in Git back <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/\">when 2.51 was released<\/a>.<\/p>\n\n\n\n<p>To celebrate this most recent release, here is GitHub&rsquo;s look at some of the most interesting features and changes introduced since last time.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h-tree-level-blame-information\">Tree-level blame information<\/h1>\n\n\n\n<p><\/p><p>If you&rsquo;re a seasoned Git user, then you are no doubt familiar with git blame, Git&rsquo;s tool for figuring out which commit most recently modified each line at a given filepath. Git&rsquo;s blame functionality is great for figuring out when a bug was introduced, or why some code was written the way it was.<\/p><p>\nIf you want to know which commit last modified any portion of a given filepath, that&rsquo;s easy enough to do with <code>git log -1 -- path\/to\/my\/file<\/code>, since <code>-1<\/code> will give us only the first commit which modifies that path. But what if instead you want to know which commit most recently modified every file in some directory? Answering that question may seem contrived, but it&rsquo;s not. If you&rsquo;ve ever looked at a repository&rsquo;s file listing on GitHub, the middle column of information has a link to the commit which most recently modified that path, along with (part of) its commit message.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"454\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?resize=1024%2C454\" alt=\"Screenshot of GitHub's repository file.\" class=\"wp-image-92348\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?w=1600 1600w, https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?w=1024 1024w, https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-1.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\"><em>GitHub&rsquo;s repository file listing, showing tree-level blame information.<\/em><\/figcaption><\/figure>\n\n\n\n<p>The question remains: how do we efficiently determine which commit most recently modified each file in a given directory? You could imagine that you might enumerate each tree entry, feeding it to <code>git log -1<\/code> and collecting the output there, like so:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>$ git ls-tree -z --name-only HEAD^{tree} | xargs -0 -I{} sh -c '\n    git log -1 --format=\"$1 %h %s\" -- $1\n  ' -- {}  | column -t -l3 \n.cirrus.yml     1e77de10810  ci: update FreeBSD image to 14.3\n.clang-format   37215410730  clang-format: exclude control macros from SpaceBeforeParens\n.editorconfig   c84209a0529  editorconfig: add .bash extension\n.gitattributes  d3b58320923  merge-file doc: set conflict-marker-size attribute\n.github         5db9d35a28f  Merge branch 'js\/ci-github-actions-update'\n[...]<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"$ git ls-tree -z --name-only HEAD^{tree} | xargs -0 -I{} sh -c '\n    git log -1 --format=&quot;$1 %h %s&quot; -- $1\n  ' -- {}  | column -t -l3 \n.cirrus.yml     1e77de10810  ci: update FreeBSD image to 14.3\n.clang-format   37215410730  clang-format: exclude control macros from SpaceBeforeParens\n.editorconfig   c84209a0529  editorconfig: add .bash extension\n.gitattributes  d3b58320923  merge-file doc: set conflict-marker-size attribute\n.github         5db9d35a28f  Merge branch 'js\/ci-github-actions-update'\n[...]\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>That works, but not efficiently. To see why, consider a case with files <code>A<\/code>, <code>B<\/code>, and <code>C<\/code> introduced by commits <code>C1<\/code>, <code>C2<\/code>, and <code>C3<\/code>, respectively. To blame <code>A<\/code>, we walk from <code>C3<\/code> back to <code>C1<\/code> in order to determine that <code>C1<\/code> was the most recent commit to modify <code>A<\/code>. That traversal passed through <code>C2<\/code> and <code>C3<\/code>, but since we were only looking for modifications to <code>A<\/code>, we&rsquo;ll end up revisiting those commits when trying to blame <code>B<\/code> and <code>C<\/code>. In this example, we visit those three commits six times in total, which is twice the necessary number of history traversals.<\/p>\n\n\n\n<p>Git 2.52 introduces a new command which comes up with the same information in a fraction of the time: <code>git last-modified<\/code>. To get a sense for how much faster <code>last-modified<\/code> is than the example above, here are some <a href=\"https:\/\/github.com\/sharkdp\/hyperfine\">hyperfine<\/a> results:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>Benchmark 1: git ls-tree + log\n  Time (mean &plusmn; &sigma;):      3.962 s &plusmn;  0.011 s    [User: 2.676 s, System: 1.330 s]\n  Range (min &hellip; max):    3.940 s &hellip;  3.984 s    10 runs\n\nBenchmark 2: git last-modified\n  Time (mean &plusmn; &sigma;):     722.7 ms &plusmn;   4.6 ms    [User: 682.4 ms, System: 40.1 ms]\n  Range (min &hellip; max):   717.3 ms &hellip; 731.3 ms    10 runs\n\nSummary\n  git last-modified ran\n    5.48 &plusmn; 0.04 times faster than git ls-tree + log<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"Benchmark 1: git ls-tree + log\n  Time (mean &plusmn; &sigma;):      3.962 s &plusmn;  0.011 s    [User: 2.676 s, System: 1.330 s]\n  Range (min &hellip; max):    3.940 s &hellip;  3.984 s    10 runs\n\nBenchmark 2: git last-modified\n  Time (mean &plusmn; &sigma;):     722.7 ms &plusmn;   4.6 ms    [User: 682.4 ms, System: 40.1 ms]\n  Range (min &hellip; max):   717.3 ms &hellip; 731.3 ms    10 runs\n\nSummary\n  git last-modified ran\n    5.48 &plusmn; 0.04 times faster than git ls-tree + log\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>The core functionality behind <code>git last-modified<\/code> was written by GitHub over many years (originally called <code>blame-tree<\/code> in GitHub&rsquo;s fork of Git), and is what has powered our tree-level blame since 2012. Earlier this year, we <a href=\"https:\/\/lore.kernel.org\/git\/Z+XJ+1L3PnC9Dyba@nand.local\/\">shared those patches<\/a> with engineers at GitLab, who tidied up <a href=\"https:\/\/github.com\/git\/git\/compare\/d61ab360b996c6370f65bb9eaa316c68a58f7fd1%5E...ttaylorr:git:tb\/blame-tree\">years of development<\/a> into a <a href=\"https:\/\/lore.kernel.org\/git\/20250422-toon-new-blame-tree-v1-0-fdb51b8a394a@iotcl.com\/#t\">reviewable series<\/a> of patches which landed in this release.<\/p>\n\n\n\n<p>There are still some features in GitHub&rsquo;s version of this command that have yet to make their way into a Git release, including an on-disk format to cache the results of previous runs. In the meantime, <a href=\"https:\/\/git-scm.com\/docs\/git-last-modified\/2.52.0\">check out <code>git last-modified<\/code><\/a>, available in Git 2.52.<\/p>\n\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/a3c6459ab6610d93da8c95000d0ffc803ce39892...a1dfa5448d583bbfd1ec45642a4495ad499970c9\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/576e0b6eb34f8989f07ae77db10baf1c75125c47...8d9a7cdfda4c883e83d6ea7b57d0a1d989a7d439\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/96ed0a89066c2ea57c18b6586b2cab2edc333515...e6c06e87a255995d2e7ead2b8e49e46e29a724fb\">source<\/a>]<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"advanced-repository-maintenance-strategies\">Advanced repository maintenance strategies<\/h1>\n\n\n\n<p>Returning readers of this series <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-31\/#introducing-git-maintenance\">may recall<\/a> our coverage of the <code>git maintenance<\/code> command. If this is your first time reading along, or you could use a refresher, we&rsquo;ve got you covered.<\/p>\n\n\n\n<p><code>git maintenance<\/code> is a Git command which can perform repository housekeeping tasks either on a scheduled or ad-hoc basis. The <code>maintenance<\/code> command can perform a <a href=\"https:\/\/git-scm.com\/docs\/git-maintenance\/2.52.0#_tasks\">variety of tasks<\/a>, like repacking the contents of your repository, updating commit-graphs, expiring stale reflog entries, and much more. Put together, <code>maintenance<\/code> ensures that your repository continues to operate smoothly and efficiently.<\/p>\n\n\n\n<p>By default (or when running the <code>gc<\/code> task), <code>git maintenance<\/code> relies on <code>git gc<\/code> internally to repack your repository, and remove any unreachable objects. This has a couple of drawbacks, namely that <code>git gc<\/code> performs &ldquo;all-into-one&rdquo; repacks to consolidate the contents of your repository, which can be sluggish for very large repositories. As an alternative, <code>git maintenance<\/code> has an <code>incremental-repack<\/code> strategy, but this never prunes out any unreachable objects.<\/p>\n\n\n\n<p>Git 2.52 bridges this gap by introducing a new <code>geometric<\/code> task within <code>git maintenance<\/code> that avoids all-into-one repacks when possible, and prunes unreachable objects on a less frequent basis. This new task uses tools (like geometric repacking) that were designed at GitHub and have <a href=\"https:\/\/github.blog\/2021-04-29-scaling-monorepo-maintenance\/\">powered GitHub&rsquo;s own repository maintenance<\/a> for many years. Those tools have been in Git <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-33\/#geometric-repacking\">since 2.33<\/a>, but were awkward to use or discover since their implementation was buried within <code>git repack<\/code>, not <code>git gc<\/code>.<\/p>\n\n\n\n<p>The <code>geometric<\/code> task here works by inspecting the contents of your repository to determine if we can combine some number of <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Packfiles\">packfiles<\/a> to form a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Geometric_progression\">geometric progression<\/a> by object count. If it can, it performs a geometric repack, condensing the contents of your repository without pruning any objects. Alternatively, if a geometric repack would pack the entirety of your repository into a single pack, then a full <code>git gc<\/code> is performed instead, which consolidates the contents of your repository and prunes out unreachable objects.<\/p>\n\n\n\n<p>Git 2.52 makes it a breeze to keep even your largest repositories running smoothly. Check out the new <code>geometric<\/code> strategy, or any of the many other capabilities of <code>git maintenance<\/code> can do in 2.52.<\/p>\n\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/52364670907b84f91bcd42035ddd30ceac0f2771...a4265572bb8488205b53a4a1af0c8d877f11dbe6\">source<\/a>]<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\" id=\"the-tip-of-the-iceberg\">The tip of the iceberg&hellip;<\/h1>\n\n\n\n<p>Now that we&rsquo;ve covered some of the larger changes in more detail, let&rsquo;s take a closer look at a selection of some other new features and updates in this release.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p>This release saw a couple of new sub-commands be added to <a href=\"https:\/\/git-scm.com\/docs\/git-refs\"><code>git refs<\/code><\/a>, Git&rsquo;s relatively new tool for providing low-level access to your repository&rsquo;s <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Git-References\">references<\/a>. Prior to this release, <code>git refs<\/code> was capable of migrating between reference backends (e.g., to have your repository store reference data in the <a href=\"https:\/\/git-scm.com\/docs\/reftable\">reftable<\/a> format), along with verifying the internal representation of those references.<\/p><p><code>git refs<\/code> now includes two new sub-commands: <code>git refs list<\/code> and <code>git refs exists<\/code>. The former is an alias for <code>git for-each-ref<\/code> and supports the same set of options. The latter works like <code>git show-ref --exists<\/code>, and can be used to quickly determine whether or not a given reference exists.<\/p><p>Neither of these new sub-commands introduce new functionality, but they do consolidate a couple of common reference-related operations into a single Git command rather than many individual ones.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/fd13909eb63ef121824f243183db6b1f49ef1aed...c44afd67d2bcfc2958e7cc79d7064ab5fcfa468a\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>If you&rsquo;ve ever scripted around Git, you are likely familiar with Git&rsquo;s <code>rev-parse<\/code> command. If not, you&rsquo;d be forgiven for thinking that <code>rev-parse<\/code> is designed to just resolve the various ways to describe a commit into a full object ID. In reality, <code>rev-parse<\/code> can perform functionality totally unrelated to resolving object IDs, including shell quoting, option parsing (as a replacement for <a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/getopt.1.html\">getopt<\/a>), printing local <code>GIT_<\/code> environment variables, resolving paths inside of <code>$GIT_DIR<\/code> and <a href=\"https:\/\/git-scm.com\/docs\/git-rev-parse\/2.52.0\">so much more<\/a>.<\/p><p>Git 2.52 introduces the first step to giving some of this functionality a new home via its new <code>git repo<\/code> command. The <code>git repo<\/code> command&mdash;currently designated as experimental&mdash;is designed to be a general-purpose tool for retrieving pieces of information about your repository. For example, you can check whether or not a repository is shallow or bare, along with what type of object and reference format it uses, like so:<\/p>\n<pre class=\"wp-block-code\"><code>$ keys='layout.bare layout.shallow object.format references.format'\n$ git repo info $keys\nlayout.bare=false\nlayout.shallow=false\nobject.format=sha1\nreferences.format=files<\/code><\/pre>\n<p>The new <code>git repo<\/code> command can also print out some general statistics about your repository&rsquo;s structure and contents via its <code>git repo structure<\/code> sub-command:<\/p>\n<pre class=\"wp-block-code language-plaintext\"><code>$ git repo structure\nCounting objects: 497533, done.\n| Repository structure | Value  |\n| -------------------- | ------ |\n| * References         |        |\n|   * Count            |   2871 |\n|     * Branches       |     58 |\n|     * Tags           |   1273 |\n|     * Remotes        |   1534 |\n|     * Others         |      6 |\n|                      |        |\n| * Reachable objects  |        |\n|   * Count            | 497533 |\n|     * Commits        |  91386 |\n|     * Trees          | 208050 |\n|     * Blobs          | 197103 |\n|     * Tags           |    994 |<\/code><\/pre>\n\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/eed447dd959bd99a24c43688b7f6f14f727b550b...a81224d12818e94a2e3c257ee2e5b0f3169da12b\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/7d00521d7be21ca4a3713b2fa367eb7296212e09...c2e3713334aa822683f046bbad7905ec8510d38b\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/175048344f5b04c720e34426137418b64c7b260f...16a93c03c7824a40b034a6ee1cb1c68c8ef48682\">source<\/a>]<\/p><\/li>\n<li><p>Back in 2.28, the Git project <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-28\/#introducing-init-defaultbranch\">introduced<\/a> the <code>init.defaultBranch<\/code> <a href=\"https:\/\/git-scm.com\/docs\/git-config\/2.52.0#Documentation\/git-config.txt-initdefaultBranch\">configuration option<\/a> to provide a default branch name for any repositories created with <code>git init<\/code>. Since its introduction, the default value of that configuration option was &ldquo;master&rdquo;, though many set <code>init.defaultBranch<\/code> to &ldquo;main&rdquo; instead.<\/p><p>Beginning in Git 3.0, the default value for <code>init.defaultBranch<\/code> will change to &ldquo;main&rdquo;. That means that any repositories created in Git 3.0 or newer using <code>git init<\/code> will have their default branch named &ldquo;main&rdquo; without the need for any additional configuration.<\/p><p>If you want to get a sneak peak of that, or any other planned change for Git 3.0, you can build Git locally with the <code>WITH_BREAKING_CHANGES<\/code> build-flag to try out the new changes today.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/d235f69ae880aba0a29841c61eec214f59b19650...5590b4e7f52017794169a93d571204141bab3d28\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/e50c3ca095b33a941833ffab150b8822099d1b75...373ad8917beb99dc643b6e7f5c117a294384a57e\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>By default, Git uses SHA-1 to provide a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Content-addressable_storage\">content-addressable hash<\/a> of any object in your repository. In Git 3.0, Git will instead use SHA-256 which offers more appealing security properties. Back in <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-45\">our coverage of Git 2.45<\/a>, we talked about <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-45\/#preliminary-support-for-sha-1-and-sha-256-interoperability\">some new changes<\/a> which enable writing out separate copies of new objects using both SHA-1 and SHA-256 as a transitory step towards interoperability between the two.<\/p><p>In Git 2.52, the rest of that work towards interoperability begins. Though the changes that landed in this release are focused on laying the groundwork for future interoperability features, the hope is that eventually you can use a Git repository with one hash algorithm, while pushing and pulling from another repository using a different hash algorithm.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/c9ccf81948973e9b9632cbb483a3908307092620...db00605c13a9f5709da712671df5c7594c06cf31\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>Speaking of other bleeding-edge changes in Git, this release is the first to (optionally) use Rust code for some internal functionality within Git. This mode is optional and guarded behind a new <code>WITH_RUST<\/code> build flag. When built with this mode enabled, Git will use a <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.52.0\/src\/varint.rs\">Rust implementation<\/a> for encoding and decoding <a href=\"https:\/\/en.wikipedia.org\/wiki\/Variable-length_quantity\">variable-width integers<\/a>.<\/p><p>Though this release only introduces a Rust variant of some minor utility functionality, it sets up the infrastructure for much more interesting parts of Git to be rewritten in Rust.<\/p><p>Rust support is not yet mandatory, so Git 2.52 will continue to run just fine on platforms that don&rsquo;t have a Rust compiler. However, Rust support <a href=\"https:\/\/github.com\/git\/git\/commit\/8f5daaff927e868b0460dda40cdb0923b8a6ef35\">will be required for Git 3.0<\/a>, at which point many more components of Git will likely depend on Rust code.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/3aa0ced36a53b817a27844c898c0474b9c120db9...e425c40aa00d2ae6b1bbc33cfa9fecd30a0a8ec6\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/3deb97fe24eccb1245e9323475f10cfba705e08f...e509b5b8be0f17467dcc75130f941d84a09d96a3\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/4253630c6f07a4bdcc9aa62a50e26a4d466219d1...f3b4c89d59f15f3b67f29bff6f1f53dbc11a5b58\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>Long-time readers may recall our coverage of changed-path Bloom filters within Git from <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-28\/\">back in 2.28<\/a>. If not, a changed-path <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bloom_filter\">Bloom filter<\/a> is a probabilistic data structure that can approximate which file path(s) were modified by a commit (relative to its first parent). Since Bloom filters never have false negatives (i.e. indicating a commit did not modify some path when it in fact did), they can be used to accelerate many path-scoped traversals throughout Git (including <code>last-modified<\/code> above!).<\/p><p><a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/\">More recently<\/a>, we covered new ways of using Bloom filters within Git, like providing multiple paths of interest at the same time (e.g., <code>git log \/my\/subdir \/my\/other\/subdir<\/code>) which previously were not supported with Bloom filters. At that time, we wrote that there were <a href=\"https:\/\/lore.kernel.org\/git\/20250807051243.96884-1-yldhome2d2@gmail.com\/\">ongoing discussions<\/a> about supporting Bloom filters in even more of Git&rsquo;s expressive pathspec syntax.<\/p><p>This release delivers the result of those discussions, and now supports the performance benefits of using Bloom filters in even more scenarios. One example here is when a pathspec contains wildcards in some, but not all of its components, like <code>foo\/bar\/*\/baz<\/code>, where Git will now use its Bloom filter for the non-wildcard components of the path. To read about even more scenarios that can now leverage Bloom filters, check out the link below.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/d1123cd8103b238da624e0d09655df853799bb38...6d192462eb3ca605600731a9717fd0d9aa72eff0\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>This release also saw a number of performance improvements across many areas of the project. <code>git describe<\/code> learned how to use a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Priority_queue\">priority queue<\/a> to speed up performance by 30%. <code>git remote<\/code> picked up a couple of new tricks to optimize renaming references with its <code>rename<\/code> sub-command. <code>git ls-files<\/code> can keep the index sparse in cases where it couldn&rsquo;t before. <code>git log -L<\/code> became <a href=\"https:\/\/github.com\/git\/git\/commit\/a3540ed20efad4e1aebb71edac2fc74604f2122e\">significantly faster<\/a> by avoiding some unnecessary tree-level diffs when processing merge commits. Finally, <code>xdiff<\/code> (the library that powers Git&rsquo;s file-level diff and merge engine) benefitted from a pair of optimizations (<a href=\"https:\/\/github.com\/git\/git\/commit\/41d97837ab1e5a35fdcfd7f6af9b5d56af62e92a\">here<\/a>, and <a href=\"https:\/\/github.com\/git\/git\/commit\/a4bbe8af0b48f9c80ccc2c4619309c4a81c1460a\">here<\/a>) in this release, and <a href=\"https:\/\/lore.kernel.org\/git\/pull.1980.git.git.1752784344.gitgitgadget@gmail.com\/\">even more optimizations<\/a> that will likely land in a future release.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/9a85fa8406d6281dfcc3caa1e3d3828a5f73a363...08bb69d70f55cb6b44cdc6aefa7bc1d9cf4eb3f3\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/c3c8b6910a7cd3d5a25522d3fd6925083048be24...16c4fa26b99e6f6c24dc93575ffa884c13b1fe5f\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/4a7ebb9138b47bdc469fd8c8a97a753714fd5d92...681f26bccc017371ae6ee20db55e3edb52420a25\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/8d5e4290a73069466f34743993f23cad1fe90fc2...a4bbe8af0b48f9c80ccc2c4619309c4a81c1460a\">source<\/a>]<\/p><\/li>\n\n\n\n<li><p>Last but not least, some updates to Git&rsquo;s <code>sparse-checkout<\/code> feature, which learned a new &ldquo;clean&rdquo; sub-command. <code>git sparse-checkout clean<\/code> can help you recover from tricky cases where some files are left outside of your sparse-checkout definition when changing which part(s) of the repository you have checked out.<\/p><p>The details of how one might get into this situation, and why recovering from it with pre-2.52 tools alone was so difficult, are surprisingly technical. If you&rsquo;re interested in all of the gory details, <a href=\"https:\/\/github.com\/git\/git\/commit\/2520efd3bc8c81cb4bd8f832b241c3b2b8c0630f\">this commit<\/a> has all of the information about this change.<\/p><p>In the meantime, if you use <code>sparse-checkout<\/code> and have ever had difficulty cleaning up when switching your <code>sparse-checkout<\/code> definition, give <code>git sparse-checkout clean<\/code> a whirl with Git 2.52.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/419c72cb8ada252b260efc38ff91fe201de7c8c3...c32aa72466ec9da5762ef56f70ec10b42cab65da\">source<\/a>]<\/p><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"the-rest-of-the-iceberg\">&hellip;the rest of the iceberg<\/h1>\n\n\n\n<p>That&rsquo;s just a sample of changes from the latest release. For more, check out the release notes for <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.52.0\/Documentation\/RelNotes\/2.52.0.adoc\">2.52<\/a>, or <a href=\"https:\/\/github.com\/git\/git\/tree\/v2.52.0\/Documentation\/RelNotes\">any previous version<\/a> in <a href=\"https:\/\/github.c&lt;om\/git\/git\">the Git repository<\/a>.<\/p>\n<\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.<\/p>\n","protected":false},"author":1282,"featured_media":92349,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"yes","_gh_post_is_no_robots":"","_gh_post_is_featured":"yes","_gh_post_is_excluded":"","_gh_post_is_unlisted":"","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"","_gh_post_sq_img_id":"","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"","_gh_post_recirc_hide":"","_gh_post_recirc_col_1":"","_gh_post_recirc_col_2":"","_gh_post_recirc_col_3":"","_gh_post_recirc_col_4":"","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"_links_to":"","_links_to_target":""},"categories":[3330,67],"tags":[132],"coauthors":[2189],"class_list":["post-92344","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-git","category-open-source","tag-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.7 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Highlights from Git 2.52 - The GitHub Blog<\/title>\n<meta name=\"description\" content=\"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Highlights from Git 2.52\" \/>\n<meta property=\"og:description\" content=\"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-17T17:54:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-17T18:18:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"839\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Taylor Blau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Taylor Blau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/\"},\"author\":{\"name\":\"Taylor Blau\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\"},\"headline\":\"Highlights from Git 2.52\",\"datePublished\":\"2025-11-17T17:54:31+00:00\",\"dateModified\":\"2025-11-17T18:18:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/\"},\"wordCount\":1957,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/unnamed-2.png?fit=1600%2C839\",\"keywords\":[\"Git\"],\"articleSection\":[\"Git\",\"Open Source\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/\",\"name\":\"Highlights from Git 2.52 - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/unnamed-2.png?fit=1600%2C839\",\"datePublished\":\"2025-11-17T17:54:31+00:00\",\"dateModified\":\"2025-11-17T18:18:15+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\"},\"description\":\"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/unnamed-2.png?fit=1600%2C839\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/unnamed-2.png?fit=1600%2C839\",\"width\":1600,\"height\":839,\"caption\":\"git 2.52 is here!\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-52\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Open Source\",\"item\":\"https:\\\/\\\/github.blog\\\/open-source\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Git\",\"item\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Highlights from Git 2.52\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\",\"name\":\"Taylor Blau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g2ce44289191883c54a58a554d8fc874a\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g\",\"caption\":\"Taylor Blau\"},\"description\":\"Taylor Blau is a Principal Software Engineer at GitHub where he works on Git.\",\"sameAs\":[\"https:\\\/\\\/ttaylorr.com\"],\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/ttaylorr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Highlights from Git 2.52 - The GitHub Blog","description":"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/","og_locale":"en_US","og_type":"article","og_title":"Highlights from Git 2.52","og_description":"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","og_url":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/","og_site_name":"The GitHub Blog","article_published_time":"2025-11-17T17:54:31+00:00","article_modified_time":"2025-11-17T18:18:15+00:00","og_image":[{"width":1600,"height":839,"url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png","type":"image\/png"}],"author":"Taylor Blau","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Taylor Blau","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#article","isPartOf":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/"},"author":{"name":"Taylor Blau","@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524"},"headline":"Highlights from Git 2.52","datePublished":"2025-11-17T17:54:31+00:00","dateModified":"2025-11-17T18:18:15+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/"},"wordCount":1957,"image":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png?fit=1600%2C839","keywords":["Git"],"articleSection":["Git","Open Source"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/","url":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/","name":"Highlights from Git 2.52 - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png?fit=1600%2C839","datePublished":"2025-11-17T17:54:31+00:00","dateModified":"2025-11-17T18:18:15+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524"},"description":"The open source Git project just released Git 2.52. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","breadcrumb":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png?fit=1600%2C839","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png?fit=1600%2C839","width":1600,"height":839,"caption":"git 2.52 is here!"},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-52\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Open Source","item":"https:\/\/github.blog\/open-source\/"},{"@type":"ListItem","position":3,"name":"Git","item":"https:\/\/github.blog\/open-source\/git\/"},{"@type":"ListItem","position":4,"name":"Highlights from Git 2.52"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524","name":"Taylor Blau","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g2ce44289191883c54a58a554d8fc874a","url":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g","caption":"Taylor Blau"},"description":"Taylor Blau is a Principal Software Engineer at GitHub where he works on Git.","sameAs":["https:\/\/ttaylorr.com"],"url":"https:\/\/github.blog\/author\/ttaylorr\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/11\/unnamed-2.png?fit=1600%2C839","jetpack_shortlink":"https:\/\/wp.me\/pamS32-o1q","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/92344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/1282"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=92344"}],"version-history":[{"count":16,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/92344\/revisions"}],"predecessor-version":[{"id":92376,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/92344\/revisions\/92376"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/92349"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=92344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=92344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=92344"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=92344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}