* [RFC PATCH 0/4] doc: move BreakingChanges to a manpage
@ 2026-09-28 10:41 kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 1/4] doc: transform breaking changes doc " kristofferhaugsbakk
` (4 more replies)
0 siblings, 5 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-09-28 10:41 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
Topic name: kh/doc-gitbreaking-changes7
Topic summary: Move BreakingChanges document to a manpage for easier
visibility.
Users are the ones who are impacted by breaking changes. Certainly much
more than Git developers who are already plugged in to the development
channels that discuss the trajectory of the project. Advertizing the
planned breaking changes to all users will help the whole Git community
prepare.
[1/4] doc: transform breaking changes doc to a manpage
[2/4] doc: gitbreaking-changes: replace msg-ids with URLs
[3/4] doc: gitbreaking-changes: add note about living document
[4/4] doc: git: mention gitbreaking-changes(7)
Documentation/BreakingChanges.adoc | 360 +----------------------
Documentation/Makefile | 1 +
Documentation/git.adoc | 5 +-
Documentation/gitbreaking-changes.adoc | 387 +++++++++++++++++++++++++
Documentation/meson.build | 1 +
command-list.txt | 1 +
6 files changed, 395 insertions(+), 360 deletions(-)
create mode 100644 Documentation/gitbreaking-changes.adoc
base-commit: 0f8e75abebff0877cae681a3d5ff31ac47f54220
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply [flat|nested] 25+ messages in thread
* [RFC PATCH 1/4] doc: transform breaking changes doc to a manpage
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
@ 2026-09-28 10:41 ` kristofferhaugsbakk
2026-09-30 13:28 ` Patrick Steinhardt
2026-09-28 10:41 ` [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
` (3 subsequent siblings)
4 siblings, 1 reply; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-09-28 10:41 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
The breaking changes document is not a regular Git documentation page.
That means that you cannot navigate to the doc with git(1), i.e. with:
git help BreakingChanges
You instead have to download the Git project source. Or go to
git-scm.com.[1] Then you get this disclaimer:[2]
This information is specific to the Git project
Please note that this information is only relevant to you if you
plan on contributing to the Git project itself. It is in no shape or
form required reading for regular Git users.
But this document is relevant to *all* Git users. Everyone should have
as easy access to it as the other doc and guide pages.
To that end, let’s move the text to a manpage. But keep the old page,
just linking to the new one. (We wouldn’t want to break any readers.)
Just do the minimal changes for the new format. Also demote the first
section to the second level, i.e. make “Introduction” the same level
as “Procedure’.
† 1: https://git-scm.com/docs/BreakingChanges.html
† 2: Which I first mentioned in 098230f7 (you-still-use-that??: help the
user help themselves, 2025-09-17), footnote #1.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/BreakingChanges.adoc | 360 +----------------------
Documentation/Makefile | 1 +
Documentation/gitbreaking-changes.adoc | 378 +++++++++++++++++++++++++
Documentation/meson.build | 1 +
4 files changed, 381 insertions(+), 359 deletions(-)
create mode 100644 Documentation/gitbreaking-changes.adoc
diff --git a/Documentation/BreakingChanges.adoc b/Documentation/BreakingChanges.adoc
index 73bb939359c..d35850a08e4 100644
--- a/Documentation/BreakingChanges.adoc
+++ b/Documentation/BreakingChanges.adoc
@@ -1,359 +1 @@
-= Upcoming breaking changes
-
-The Git project aims to ensure backwards compatibility to the best extent
-possible. Minor releases will not break backwards compatibility unless there is
-a very strong reason to do so, like for example a security vulnerability.
-
-Regardless of that, due to the age of the Git project, it is only natural to
-accumulate a backlog of backwards-incompatible changes that will eventually be
-required to keep the project aligned with a changing world. These changes fall
-into several categories:
-
-* Changes to long established defaults.
-* Concepts that have been replaced with a superior design.
-* Concepts, commands, configuration or options that have been lacking in major
- ways and that cannot be fixed and which will thus be removed without any
- replacement.
-
-Explicitly not included in this list are fixes to minor bugs that may cause a
-change in user-visible behavior.
-
-The Git project irregularly releases breaking versions that deliberately break
-backwards compatibility with older versions. This is done to ensure that Git
-remains relevant, safe and maintainable going forward. The release cadence of
-breaking versions is typically measured in multiple years. We had the following
-major breaking releases in the past:
-
-* Git 1.6.0, released in August 2008.
-* Git 2.0, released in May 2014.
-
-We use <major>.<minor> release numbers these days, starting from Git 2.0. For
-future releases, our plan is to increment <major> in the release number when we
-make the next breaking release. Before Git 2.0, the release numbers were
-1.<major>.<minor> with the intention to increment <major> for "usual" breaking
-releases, reserving the jump to Git 2.0 for really large backward-compatibility
-breaking changes.
-
-The intent of this document is to track upcoming deprecations for future
-breaking releases. Furthermore, this document also tracks what will _not_ be
-deprecated. This is done such that the outcome of discussions document both
-when the discussion favors deprecation, but also when it rejects a deprecation.
-
-Items should have a clear summary of the reasons why we do or do not want to
-make the described change that can be easily understood without having to read
-the mailing list discussions. If there are alternatives to the changed feature,
-those alternatives should be pointed out to our users.
-
-All items should be accompanied by references to relevant mailing list threads
-where the deprecation was discussed. These references use message-IDs, which
-can visited via
-
- https://lore.kernel.org/git/$message_id/
-
-to see the message and its surrounding discussion. Such a reference is there to
-make it easier for you to find how the project reached consensus on the
-described item back then.
-
-This is a living document as the environment surrounding the project changes
-over time. If circumstances change, an earlier decision to deprecate or change
-something may need to be revisited from time to time. So do not take items on
-this list to mean "it is settled, do not waste our time bringing it up again".
-
-== Procedure
-
-Discussing the desire to make breaking changes, declaring that breaking
-changes are made at a certain version boundary, and recording these
-decisions in this document, are necessary but not sufficient.
-Because such changes are expected to be numerous, and the design and
-implementation of them are expected to span over time, they have to
-be deployable trivially at such a version boundary, prepared over long
-time.
-
-The breaking changes MUST be guarded with the a compile-time switch,
-WITH_BREAKING_CHANGES, to help this process. When built with it,
-the resulting Git binary together with its documentation would
-behave as if these breaking changes slated for the next big version
-boundary are already in effect. We also have a CI job to exercise
-the work-in-progress version of Git with these breaking changes.
-
-
-== Git 3.0
-
-The following subsections document upcoming breaking changes for Git 3.0. There
-is no planned release date for this breaking version yet.
-
-Proposed changes and removals only include items which are "ready" to be done.
-In other words, this is not supposed to be a wishlist of features that should
-be changed to or replaced in case the alternative was implemented already.
-
-=== Changes
-
-* The default hash function for new repositories will be changed from "sha1"
- to "sha256". SHA-1 has been deprecated by NIST in 2011 and is nowadays
- recommended against in FIPS 140-2 and similar certifications. Furthermore,
- there are practical attacks on SHA-1 that weaken its cryptographic properties:
-+
- ** The SHAppening (2015). The first demonstration of a practical attack
- against SHA-1 with 2^57 operations.
- ** SHAttered (2017). Generation of two valid PDF files with 2^63 operations.
- ** Birthday-Near-Collision (2019). This attack allows for chosen prefix
- attacks with 2^68 operations.
- ** Shambles (2020). This attack allows for chosen prefix attacks with 2^63
- operations.
-+
-While we have protections in place against known attacks, it is expected
-that more attacks against SHA-1 will be found by future research. Paired
-with the ever-growing capability of hardware, it is only a matter of time
-before SHA-1 will be considered broken completely. We want to be prepared
-and will thus change the default hash algorithm to "sha256" for newly
-initialized repositories.
-+
-An important requirement for this change is that the ecosystem is ready to
-support the "sha256" object format. This includes popular Git libraries,
-applications and forges.
-+
-There is no plan to deprecate the "sha1" object format at this point in time.
-+
-Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
-<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
-<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
-
-* The default storage format for references in newly created repositories will
- be changed from "files" to "reftable". The "reftable" format provides
- multiple advantages over the "files" format:
-+
- ** It is impossible to store two references that only differ in casing on
- case-insensitive filesystems with the "files" format. This issue is common
- on Windows and macOS platforms. As the "reftable" backend does not use
- filesystem paths to encode reference names this problem goes away.
- ** Similarly, macOS normalizes path names that contain unicode characters,
- which has the consequence that you cannot store two names with unicode
- characters that are encoded differently with the "files" backend. Again,
- this is not an issue with the "reftable" backend.
- ** Deleting references with the "files" backend requires Git to rewrite the
- complete "packed-refs" file. In large repositories with many references
- this file can easily be dozens of megabytes in size, in extreme cases it
- may be gigabytes. The "reftable" backend uses tombstone markers for
- deleted references and thus does not have to rewrite all of its data.
- ** Repository housekeeping with the "files" backend typically performs
- all-into-one repacks of references. This can be quite expensive, and
- consequently housekeeping is a tradeoff between the number of loose
- references that accumulate and slow down operations that read references,
- and compressing those loose references into the "packed-refs" file. The
- "reftable" backend uses geometric compaction after every write, which
- amortizes costs and ensures that the backend is always in a
- well-maintained state.
- ** Operations that write multiple references at once are not atomic with the
- "files" backend. Consequently, Git may see in-between states when it reads
- references while a reference transaction is in the process of being
- committed to disk.
- ** Writing many references at once is slow with the "files" backend because
- every reference is created as a separate file. The "reftable" backend
- significantly outperforms the "files" backend by multiple orders of
- magnitude.
- ** The reftable backend uses a binary format with prefix compression for
- reference names. As a result, the format uses less space compared to the
- "packed-refs" file.
-+
-Users that get immediate benefit from the "reftable" backend could continue to
-opt-in to the "reftable" format manually by setting the "init.defaultRefFormat"
-config. But defaults matter, and we think that overall users will have a better
-experience with less platform-specific quirks when they use the new backend by
-default.
-+
-A prerequisite for this change is that the ecosystem is ready to support the
-"reftable" format. Most importantly, alternative implementations of Git like
-JGit, libgit2 and Gitoxide need to support it.
-
-* In new repositories, the default branch name will be `main`. We have been
- warning that the default name will change since 675704c74dd (init:
- provide useful advice about init.defaultBranch, 2020-12-11). The new name
- matches the default branch name used in new repositories by many of the
- big Git forges.
-
-* Git will require Rust as a mandatory part of the build process. While Git
- already started to adopt Rust in Git 2.49, all parts written in Rust are
- optional for the time being. This includes:
-+
- ** The Rust wrapper around libgit.a that is part of "contrib/" and which has
- been introduced in Git 2.49.
- ** Subsystems that have an alternative implementation in Rust to test
- interoperability between our C and Rust codebase.
- ** Newly written features that are not mission critical for a fully functional
- Git client.
-+
-These changes are meant as test balloons to allow distributors of Git to prepare
-for Rust becoming a mandatory part of the build process. There will be multiple
-milestones for the introduction of Rust:
-+
---
-1. Initially, with Git 2.52, support for Rust will be auto-detected by Meson and
- disabled in our Makefile so that the project can sort out the initial
- infrastructure.
-2. In Git 2.55, both build systems will default-enable support for Rust.
- Consequently, builds will break by default if Rust is not available on the
- build host. The use of Rust can still be explicitly disabled via build
- flags.
-3. In Git 3.0, the build options will be removed and support for Rust is
- mandatory.
---
-+
-You can explicitly ask both Meson and our Makefile-based system to enable Rust
-by saying `meson configure -Drust=enabled` and `make WITH_RUST=YesPlease`,
-respectively.
-+
-The Git project will declare the last version before Git 3.0 to be a long-term
-support release. This long-term release will receive important bug fixes for at
-least four release cycles and security fixes for six release cycles. The Git
-project will hand over maintainership of the long-term release to distributors
-in case they need to extend the life of that long-term release even further.
-Details of how this long-term release will be handed over to the community will
-be discussed once the Git project decides to stop officially supporting it.
-+
-We will evaluate the impact on downstream distributions before making Rust
-mandatory in Git 3.0. If we see that the impact on downstream distributions
-would be significant, we may decide to defer this change to a subsequent minor
-release. This evaluation will also take into account our own experience with
-how painful it is to keep Rust an optional component.
-
-* The default value of `safe.bareRepository` will change from `all` to
- `explicit`. It is all too easy for an attacker to trick a user into cloning a
- repository that contains an embedded bare repository with malicious hooks
- configured. If the user enters that subdirectory and runs any Git command, Git
- discovers the bare repository and the hooks fire. The user does not even need
- to run a Git command explicitly: many shell prompts run `git status` in the
- background to display branch and dirty state information, and `git status` in
- turn may invoke the fsmonitor hook if so configured, making the user
- vulnerable the moment they `cd` into the directory. The `safe.bareRepository`
- configuration variable was introduced in 8959555cee (setup_git_directory():
- add an owner check for the top-level directory, 2022-03-02) with a default of
- `all` to preserve backwards compatibility.
-+
-Changing the default to `explicit` means that Git will refuse to work with bare
-repositories that are discovered implicitly by walking up the directory tree.
-Bare repositories specified explicitly via the `--git-dir` command-line option
-or the `GIT_DIR` environment variable continue to work regardless of this
-setting. Repositories that look like a `.git` directory, a worktree, or a
-submodule directory are also unaffected.
-+
-Users who rely on implicit discovery of bare repositories can restore the
-previous behavior by setting `safe.bareRepository=all` in their global or
-system configuration.
-
-=== Removals
-
-* Support for grafting commits has long been superseded by git-replace(1).
- Grafts are inferior to replacement refs:
-+
- ** Grafts are a local-only mechanism and cannot be shared across
- repositories.
- ** Grafts can lead to hard-to-diagnose problems when transferring objects
- between repositories.
-+
-The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
-info/grafts as outdated, 2014-03-05) and will be removed.
-+
-Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
-
-* The git-pack-redundant(1) command can be used to remove redundant pack files.
- The subcommand is unusably slow and the reason why nobody reports it as a
- performance bug is suspected to be the absence of users. We have nominated
- the command for removal and have started to emit a user-visible warning in
- c3b58472be (pack-redundant: gauge the usage before proposing its removal,
- 2020-08-25) whenever the command is executed.
-+
-So far there was a single complaint about somebody still using the command, but
-that complaint did not cause us to reverse course. On the contrary, we have
-doubled down on the deprecation and starting with 4406522b76 (pack-redundant:
-escalate deprecation warning to an error, 2023-03-23), the command dies unless
-the user passes the `--i-still-use-this` option.
-+
-There have not been any subsequent complaints, so this command will finally be
-removed.
-+
-Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
- <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
- <20230323204047.GA9290@coredump.intra.peff.net>,
-
-* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
- and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
- the repository configuration.
-+
-The mechanism has originally been introduced in f170e4b39d ([PATCH] fetch/pull:
-short-hand notation for remote repositories., 2005-07-16) and was superseded by
-6687f8fea2 ([PATCH] Use .git/remote/origin, not .git/branches/origin.,
-2005-08-20), where we switched from ".git/branches/" to ".git/remotes/". That
-commit already mentions an upcoming deprecation of the ".git/branches/"
-directory, and starting with a1d4aa7424 (Add repository-layout document.,
-2005-09-01) we have also marked this layout as deprecated. Eventually we also
-started to migrate away from ".git/remotes/" in favor of config-based remotes,
-and we have marked the directory as legacy in 3d3d282146 (Documentation:
-Grammar correction, wording fixes and cleanup, 2011-08-23)
-+
-As our documentation mentions, these directories are unlikely to be used in
-modern repositories and most users aren't even aware of these mechanisms. They
-have been deprecated for almost 20 years and 14 years respectively, and we are
-not aware of any active users that have complained about this deprecation.
-Furthermore, the ".git/branches/" directory is nowadays misleadingly named and
-may cause confusion as "branches" are almost exclusively used in the context of
-references.
-+
-These features will be removed.
-
-* Support for "--stdin" option in the "name-rev" command was
- deprecated (and hidden from the documentation) in the Git 2.40
- timeframe, in preference to its synonym "--annotate-stdin". Git 3.0
- removes the support for "--stdin" altogether.
-
-* The git-whatchanged(1) command has outlived its usefulness more than
- 10 years ago, and takes more keystrokes to type than its rough
- equivalent `git log --raw`. We have nominated the command for
- removal, have changed the command to refuse to work unless the
- `--i-still-use-this` option is given, and asked the users to report
- when they do so.
-+
-The command will be removed.
-
-* Support for `core.commentString=auto` has been deprecated and will
- be removed in Git 3.0.
-+
-cf. <xmqqa59i45wc.fsf@gitster.g>
-
-* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
- removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
- out in favor of using plain files using the textual representation of
- symbolic refs.
-+
-Symbolic references were initially always stored as a symbolic link. This was
-changed in 9b143c6e15 (Teach update-ref about a symbolic ref stored in a
-textfile., 2005-09-25), where a new textual symref format was introduced to
-store those symbolic refs in a plain file. In 9f0bb90d16
-(core.prefersymlinkrefs: use symlinks for .git/HEAD, 2006-05-02), the Git
-project switched the default to use the textual symrefs in favor of symbolic
-links.
-+
-The migration away from symbolic links has happened almost 20 years ago by now,
-and there is no known reason why one should prefer them nowadays. Furthermore,
-symbolic links are not supported on some platforms.
-+
-Note that only the writing side for such symbolic links is deprecated. Reading
-such symbolic links is still supported for now.
-
-== Superseded features that will not be deprecated
-
-Some features have gained newer replacements that aim to improve the design in
-certain ways. The fact that there is a replacement does not automatically mean
-that the old way of doing things will eventually be removed. This section tracks
-those features with newer alternatives.
-
-* The features git-checkout(1) offers are covered by the pair of commands
- git-restore(1) and git-switch(1). Because the use of git-checkout(1) is still
- widespread, and it is not expected that this will change anytime soon, all
- three commands will stay.
-+
-This decision may get revisited in case we ever figure out that there are
-almost no users of any of the commands anymore.
-+
-Cf. <xmqqttjazwwa.fsf@gitster.g>,
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+This document as been moved to linkgit:gitbreaking-changes[7].
diff --git a/Documentation/Makefile b/Documentation/Makefile
index f8dea4b3953..8b0390ac0fc 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -49,6 +49,7 @@ MAN5_TXT += gitprotocol-v2.adoc
MAN5_TXT += gitrepository-layout.adoc
MAN5_TXT += gitweb.conf.adoc
+MAN7_TXT += gitbreaking-changes.adoc
MAN7_TXT += gitcli.adoc
MAN7_TXT += gitcore-tutorial.adoc
MAN7_TXT += gitcredentials.adoc
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
new file mode 100644
index 00000000000..c6b974b6d8c
--- /dev/null
+++ b/Documentation/gitbreaking-changes.adoc
@@ -0,0 +1,378 @@
+gitbreaking-changes(7)
+======================
+
+NAME
+----
+gitbreaking-changes - Breaking changes for upcoming Git 3.0
+
+SYNOPSIS
+--------
+*
+
+DESCRIPTION
+-----------
+*
+
+== Introduction: Upcoming breaking changes
+
+The Git project aims to ensure backwards compatibility to the best extent
+possible. Minor releases will not break backwards compatibility unless there is
+a very strong reason to do so, like for example a security vulnerability.
+
+Regardless of that, due to the age of the Git project, it is only natural to
+accumulate a backlog of backwards-incompatible changes that will eventually be
+required to keep the project aligned with a changing world. These changes fall
+into several categories:
+
+* Changes to long established defaults.
+* Concepts that have been replaced with a superior design.
+* Concepts, commands, configuration or options that have been lacking in major
+ ways and that cannot be fixed and which will thus be removed without any
+ replacement.
+
+Explicitly not included in this list are fixes to minor bugs that may cause a
+change in user-visible behavior.
+
+The Git project irregularly releases breaking versions that deliberately break
+backwards compatibility with older versions. This is done to ensure that Git
+remains relevant, safe and maintainable going forward. The release cadence of
+breaking versions is typically measured in multiple years. We had the following
+major breaking releases in the past:
+
+* Git 1.6.0, released in August 2008.
+* Git 2.0, released in May 2014.
+
+We use <major>.<minor> release numbers these days, starting from Git 2.0. For
+future releases, our plan is to increment <major> in the release number when we
+make the next breaking release. Before Git 2.0, the release numbers were
+1.<major>.<minor> with the intention to increment <major> for "usual" breaking
+releases, reserving the jump to Git 2.0 for really large backward-compatibility
+breaking changes.
+
+The intent of this document is to track upcoming deprecations for future
+breaking releases. Furthermore, this document also tracks what will _not_ be
+deprecated. This is done such that the outcome of discussions document both
+when the discussion favors deprecation, but also when it rejects a deprecation.
+
+Items should have a clear summary of the reasons why we do or do not want to
+make the described change that can be easily understood without having to read
+the mailing list discussions. If there are alternatives to the changed feature,
+those alternatives should be pointed out to our users.
+
+All items should be accompanied by references to relevant mailing list threads
+where the deprecation was discussed. These references use message-IDs, which
+can visited via
+
+ https://lore.kernel.org/git/$message_id/
+
+to see the message and its surrounding discussion. Such a reference is there to
+make it easier for you to find how the project reached consensus on the
+described item back then.
+
+This is a living document as the environment surrounding the project changes
+over time. If circumstances change, an earlier decision to deprecate or change
+something may need to be revisited from time to time. So do not take items on
+this list to mean "it is settled, do not waste our time bringing it up again".
+
+== Procedure
+
+Discussing the desire to make breaking changes, declaring that breaking
+changes are made at a certain version boundary, and recording these
+decisions in this document, are necessary but not sufficient.
+Because such changes are expected to be numerous, and the design and
+implementation of them are expected to span over time, they have to
+be deployable trivially at such a version boundary, prepared over long
+time.
+
+The breaking changes MUST be guarded with the a compile-time switch,
+WITH_BREAKING_CHANGES, to help this process. When built with it,
+the resulting Git binary together with its documentation would
+behave as if these breaking changes slated for the next big version
+boundary are already in effect. We also have a CI job to exercise
+the work-in-progress version of Git with these breaking changes.
+
+
+== Git 3.0
+
+The following subsections document upcoming breaking changes for Git 3.0. There
+is no planned release date for this breaking version yet.
+
+Proposed changes and removals only include items which are "ready" to be done.
+In other words, this is not supposed to be a wishlist of features that should
+be changed to or replaced in case the alternative was implemented already.
+
+=== Changes
+
+* The default hash function for new repositories will be changed from "sha1"
+ to "sha256". SHA-1 has been deprecated by NIST in 2011 and is nowadays
+ recommended against in FIPS 140-2 and similar certifications. Furthermore,
+ there are practical attacks on SHA-1 that weaken its cryptographic properties:
++
+ ** The SHAppening (2015). The first demonstration of a practical attack
+ against SHA-1 with 2^57 operations.
+ ** SHAttered (2017). Generation of two valid PDF files with 2^63 operations.
+ ** Birthday-Near-Collision (2019). This attack allows for chosen prefix
+ attacks with 2^68 operations.
+ ** Shambles (2020). This attack allows for chosen prefix attacks with 2^63
+ operations.
++
+While we have protections in place against known attacks, it is expected
+that more attacks against SHA-1 will be found by future research. Paired
+with the ever-growing capability of hardware, it is only a matter of time
+before SHA-1 will be considered broken completely. We want to be prepared
+and will thus change the default hash algorithm to "sha256" for newly
+initialized repositories.
++
+An important requirement for this change is that the ecosystem is ready to
+support the "sha256" object format. This includes popular Git libraries,
+applications and forges.
++
+There is no plan to deprecate the "sha1" object format at this point in time.
++
+Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
+<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
+<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
+
+* The default storage format for references in newly created repositories will
+ be changed from "files" to "reftable". The "reftable" format provides
+ multiple advantages over the "files" format:
++
+ ** It is impossible to store two references that only differ in casing on
+ case-insensitive filesystems with the "files" format. This issue is common
+ on Windows and macOS platforms. As the "reftable" backend does not use
+ filesystem paths to encode reference names this problem goes away.
+ ** Similarly, macOS normalizes path names that contain unicode characters,
+ which has the consequence that you cannot store two names with unicode
+ characters that are encoded differently with the "files" backend. Again,
+ this is not an issue with the "reftable" backend.
+ ** Deleting references with the "files" backend requires Git to rewrite the
+ complete "packed-refs" file. In large repositories with many references
+ this file can easily be dozens of megabytes in size, in extreme cases it
+ may be gigabytes. The "reftable" backend uses tombstone markers for
+ deleted references and thus does not have to rewrite all of its data.
+ ** Repository housekeeping with the "files" backend typically performs
+ all-into-one repacks of references. This can be quite expensive, and
+ consequently housekeeping is a tradeoff between the number of loose
+ references that accumulate and slow down operations that read references,
+ and compressing those loose references into the "packed-refs" file. The
+ "reftable" backend uses geometric compaction after every write, which
+ amortizes costs and ensures that the backend is always in a
+ well-maintained state.
+ ** Operations that write multiple references at once are not atomic with the
+ "files" backend. Consequently, Git may see in-between states when it reads
+ references while a reference transaction is in the process of being
+ committed to disk.
+ ** Writing many references at once is slow with the "files" backend because
+ every reference is created as a separate file. The "reftable" backend
+ significantly outperforms the "files" backend by multiple orders of
+ magnitude.
+ ** The reftable backend uses a binary format with prefix compression for
+ reference names. As a result, the format uses less space compared to the
+ "packed-refs" file.
++
+Users that get immediate benefit from the "reftable" backend could continue to
+opt-in to the "reftable" format manually by setting the "init.defaultRefFormat"
+config. But defaults matter, and we think that overall users will have a better
+experience with less platform-specific quirks when they use the new backend by
+default.
++
+A prerequisite for this change is that the ecosystem is ready to support the
+"reftable" format. Most importantly, alternative implementations of Git like
+JGit, libgit2 and Gitoxide need to support it.
+
+* In new repositories, the default branch name will be `main`. We have been
+ warning that the default name will change since 675704c74dd (init:
+ provide useful advice about init.defaultBranch, 2020-12-11). The new name
+ matches the default branch name used in new repositories by many of the
+ big Git forges.
+
+* Git will require Rust as a mandatory part of the build process. While Git
+ already started to adopt Rust in Git 2.49, all parts written in Rust are
+ optional for the time being. This includes:
++
+ ** The Rust wrapper around libgit.a that is part of "contrib/" and which has
+ been introduced in Git 2.49.
+ ** Subsystems that have an alternative implementation in Rust to test
+ interoperability between our C and Rust codebase.
+ ** Newly written features that are not mission critical for a fully functional
+ Git client.
++
+These changes are meant as test balloons to allow distributors of Git to prepare
+for Rust becoming a mandatory part of the build process. There will be multiple
+milestones for the introduction of Rust:
++
+--
+1. Initially, with Git 2.52, support for Rust will be auto-detected by Meson and
+ disabled in our Makefile so that the project can sort out the initial
+ infrastructure.
+2. In Git 2.55, both build systems will default-enable support for Rust.
+ Consequently, builds will break by default if Rust is not available on the
+ build host. The use of Rust can still be explicitly disabled via build
+ flags.
+3. In Git 3.0, the build options will be removed and support for Rust is
+ mandatory.
+--
++
+You can explicitly ask both Meson and our Makefile-based system to enable Rust
+by saying `meson configure -Drust=enabled` and `make WITH_RUST=YesPlease`,
+respectively.
++
+The Git project will declare the last version before Git 3.0 to be a long-term
+support release. This long-term release will receive important bug fixes for at
+least four release cycles and security fixes for six release cycles. The Git
+project will hand over maintainership of the long-term release to distributors
+in case they need to extend the life of that long-term release even further.
+Details of how this long-term release will be handed over to the community will
+be discussed once the Git project decides to stop officially supporting it.
++
+We will evaluate the impact on downstream distributions before making Rust
+mandatory in Git 3.0. If we see that the impact on downstream distributions
+would be significant, we may decide to defer this change to a subsequent minor
+release. This evaluation will also take into account our own experience with
+how painful it is to keep Rust an optional component.
+
+* The default value of `safe.bareRepository` will change from `all` to
+ `explicit`. It is all too easy for an attacker to trick a user into cloning a
+ repository that contains an embedded bare repository with malicious hooks
+ configured. If the user enters that subdirectory and runs any Git command, Git
+ discovers the bare repository and the hooks fire. The user does not even need
+ to run a Git command explicitly: many shell prompts run `git status` in the
+ background to display branch and dirty state information, and `git status` in
+ turn may invoke the fsmonitor hook if so configured, making the user
+ vulnerable the moment they `cd` into the directory. The `safe.bareRepository`
+ configuration variable was introduced in 8959555cee (setup_git_directory():
+ add an owner check for the top-level directory, 2022-03-02) with a default of
+ `all` to preserve backwards compatibility.
++
+Changing the default to `explicit` means that Git will refuse to work with bare
+repositories that are discovered implicitly by walking up the directory tree.
+Bare repositories specified explicitly via the `--git-dir` command-line option
+or the `GIT_DIR` environment variable continue to work regardless of this
+setting. Repositories that look like a `.git` directory, a worktree, or a
+submodule directory are also unaffected.
++
+Users who rely on implicit discovery of bare repositories can restore the
+previous behavior by setting `safe.bareRepository=all` in their global or
+system configuration.
+
+=== Removals
+
+* Support for grafting commits has long been superseded by git-replace(1).
+ Grafts are inferior to replacement refs:
++
+ ** Grafts are a local-only mechanism and cannot be shared across
+ repositories.
+ ** Grafts can lead to hard-to-diagnose problems when transferring objects
+ between repositories.
++
+The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
+info/grafts as outdated, 2014-03-05) and will be removed.
++
+Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
+
+* The git-pack-redundant(1) command can be used to remove redundant pack files.
+ The subcommand is unusably slow and the reason why nobody reports it as a
+ performance bug is suspected to be the absence of users. We have nominated
+ the command for removal and have started to emit a user-visible warning in
+ c3b58472be (pack-redundant: gauge the usage before proposing its removal,
+ 2020-08-25) whenever the command is executed.
++
+So far there was a single complaint about somebody still using the command, but
+that complaint did not cause us to reverse course. On the contrary, we have
+doubled down on the deprecation and starting with 4406522b76 (pack-redundant:
+escalate deprecation warning to an error, 2023-03-23), the command dies unless
+the user passes the `--i-still-use-this` option.
++
+There have not been any subsequent complaints, so this command will finally be
+removed.
++
+Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
+ <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
+ <20230323204047.GA9290@coredump.intra.peff.net>,
+
+* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
+ and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
+ the repository configuration.
++
+The mechanism has originally been introduced in f170e4b39d ([PATCH] fetch/pull:
+short-hand notation for remote repositories., 2005-07-16) and was superseded by
+6687f8fea2 ([PATCH] Use .git/remote/origin, not .git/branches/origin.,
+2005-08-20), where we switched from ".git/branches/" to ".git/remotes/". That
+commit already mentions an upcoming deprecation of the ".git/branches/"
+directory, and starting with a1d4aa7424 (Add repository-layout document.,
+2005-09-01) we have also marked this layout as deprecated. Eventually we also
+started to migrate away from ".git/remotes/" in favor of config-based remotes,
+and we have marked the directory as legacy in 3d3d282146 (Documentation:
+Grammar correction, wording fixes and cleanup, 2011-08-23)
++
+As our documentation mentions, these directories are unlikely to be used in
+modern repositories and most users aren't even aware of these mechanisms. They
+have been deprecated for almost 20 years and 14 years respectively, and we are
+not aware of any active users that have complained about this deprecation.
+Furthermore, the ".git/branches/" directory is nowadays misleadingly named and
+may cause confusion as "branches" are almost exclusively used in the context of
+references.
++
+These features will be removed.
+
+* Support for "--stdin" option in the "name-rev" command was
+ deprecated (and hidden from the documentation) in the Git 2.40
+ timeframe, in preference to its synonym "--annotate-stdin". Git 3.0
+ removes the support for "--stdin" altogether.
+
+* The git-whatchanged(1) command has outlived its usefulness more than
+ 10 years ago, and takes more keystrokes to type than its rough
+ equivalent `git log --raw`. We have nominated the command for
+ removal, have changed the command to refuse to work unless the
+ `--i-still-use-this` option is given, and asked the users to report
+ when they do so.
++
+The command will be removed.
+
+* Support for `core.commentString=auto` has been deprecated and will
+ be removed in Git 3.0.
++
+cf. <xmqqa59i45wc.fsf@gitster.g>
+
+* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
+ removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
+ out in favor of using plain files using the textual representation of
+ symbolic refs.
++
+Symbolic references were initially always stored as a symbolic link. This was
+changed in 9b143c6e15 (Teach update-ref about a symbolic ref stored in a
+textfile., 2005-09-25), where a new textual symref format was introduced to
+store those symbolic refs in a plain file. In 9f0bb90d16
+(core.prefersymlinkrefs: use symlinks for .git/HEAD, 2006-05-02), the Git
+project switched the default to use the textual symrefs in favor of symbolic
+links.
++
+The migration away from symbolic links has happened almost 20 years ago by now,
+and there is no known reason why one should prefer them nowadays. Furthermore,
+symbolic links are not supported on some platforms.
++
+Note that only the writing side for such symbolic links is deprecated. Reading
+such symbolic links is still supported for now.
+
+== Superseded features that will not be deprecated
+
+Some features have gained newer replacements that aim to improve the design in
+certain ways. The fact that there is a replacement does not automatically mean
+that the old way of doing things will eventually be removed. This section tracks
+those features with newer alternatives.
+
+* The features git-checkout(1) offers are covered by the pair of commands
+ git-restore(1) and git-switch(1). Because the use of git-checkout(1) is still
+ widespread, and it is not expected that this will change anytime soon, all
+ three commands will stay.
++
+This decision may get revisited in case we ever figure out that there are
+almost no users of any of the commands anymore.
++
+Cf. <xmqqttjazwwa.fsf@gitster.g>,
+<xmqqleeubork.fsf@gitster.g>,
+<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/meson.build b/Documentation/meson.build
index f4854f802d4..af436b2d5e9 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -192,6 +192,7 @@ manpages = {
'gitweb.conf.adoc' : 5,
# Category 7.
+ 'gitbreaking-changes.adoc' : 7,
'gitcli.adoc' : 7,
'gitcore-tutorial.adoc' : 7,
'gitcredentials.adoc' : 7,
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 1/4] doc: transform breaking changes doc " kristofferhaugsbakk
@ 2026-09-28 10:41 ` kristofferhaugsbakk
2026-09-30 13:28 ` Patrick Steinhardt
2026-09-28 10:41 ` [RFC PATCH 3/4] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
` (2 subsequent siblings)
4 siblings, 1 reply; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-09-28 10:41 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
This document has used msg-ids to reference emails since its
inception.[1] This makes the text a bit more terse, and is perhaps
also convenient for people who can use msg-ids to link to messages
in their inbox. But we should consider how convenient this is for people
in general, now that this is a more public-facing page (see previous
commit). And I suspect that most people will be forced to paste the
msg-id according to the described URL template:
https://lore.kernel.org/git/$message_id/
Let’s instead replace all of the msg-ids with complete links. That way
everyone can jump right to the discussions.
† 1: 57ec9254 (docs: introduce document to announce breaking changes, 2024-06-14)
Note that we have to URL encode two msg-ids:
CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com
CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com
Lore can handle them just fine, but asciidoctor(1) cannot.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/gitbreaking-changes.adoc | 33 +++++++++++++-------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index c6b974b6d8c..9aba419efc9 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -59,15 +59,14 @@ make the described change that can be easily understood without having to read
the mailing list discussions. If there are alternatives to the changed feature,
those alternatives should be pointed out to our users.
-All items should be accompanied by references to relevant mailing list threads
-where the deprecation was discussed. These references use message-IDs, which
-can visited via
+All items should be accompanied by links to relevant mailing list threads
+where the deprecation was discussed. These links use this format:
https://lore.kernel.org/git/$message_id/
-to see the message and its surrounding discussion. Such a reference is there to
-make it easier for you to find how the project reached consensus on the
-described item back then.
+I.e. they link to the `Message-ID` of the email on the mailing
+list. These references are there to make it easier for you to find how
+the project reached consensus on the described item back then.
This is a living document as the environment surrounding the project changes
over time. If circumstances change, an earlier decision to deprecate or change
@@ -129,9 +128,9 @@ applications and forges.
+
There is no plan to deprecate the "sha1" object format at this point in time.
+
-Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
-<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
-<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
+Cf. https://lore.kernel.org/git/2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com,
+https://lore.kernel.org/git/20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain,
+https://lore.kernel.org/git/CA%2BEOSBncr%3D4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE%2BDiUQ@mail.gmail.com/.
* The default storage format for references in newly created repositories will
be changed from "files" to "reftable". The "reftable" format provides
@@ -268,7 +267,7 @@ system configuration.
The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
info/grafts as outdated, 2014-03-05) and will be removed.
+
-Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
+Cf. https://lore.kernel.org/git/20140304174806.GA11561@sigill.intra.peff.net.
* The git-pack-redundant(1) command can be used to remove redundant pack files.
The subcommand is unusably slow and the reason why nobody reports it as a
@@ -286,9 +285,9 @@ the user passes the `--i-still-use-this` option.
There have not been any subsequent complaints, so this command will finally be
removed.
+
-Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
- <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
- <20230323204047.GA9290@coredump.intra.peff.net>,
+Cf. https://lore.kernel.org/git/xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com,
+https://lore.kernel.org/git/CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ%3DKAKhtpDNTvHJFuX1NA%40mail.gmail.com,
+https://lore.kernel.org/git/20230323204047.GA9290@coredump.intra.peff.net,
* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
@@ -332,7 +331,7 @@ The command will be removed.
* Support for `core.commentString=auto` has been deprecated and will
be removed in Git 3.0.
+
-cf. <xmqqa59i45wc.fsf@gitster.g>
+cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
@@ -369,9 +368,9 @@ those features with newer alternatives.
This decision may get revisited in case we ever figure out that there are
almost no users of any of the commands anymore.
+
-Cf. <xmqqttjazwwa.fsf@gitster.g>,
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+Cf. https://lore.kernel.org/git/xmqqttjazwwa.fsf@gitster.g,
+https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
+https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
GIT
---
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [RFC PATCH 3/4] doc: gitbreaking-changes: add note about living document
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 1/4] doc: transform breaking changes doc " kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
@ 2026-09-28 10:41 ` kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 4/4] doc: git: mention gitbreaking-changes(7) kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-09-28 10:41 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
This document has always stated that it is a “living document”, subject
to change. With that in mind, we should be mindful of a potentially
larger readerbase now that this is a more public-facing page. One could
imagine that someone reads this document on a released version,
disagrees with a point there, and posts feedback to the project—but this
decision could have already been reverted in the live document.[1]
Let’s add a note (admonition) following the “live document” with such
a reminder. Let’s keep it short and simple though and not go into how
to fetch the source. They can figure that out themselves.
† 1: Let’s say that someone on Git for Debian Stable reads about the
breaking changes for Git 3.0. They don’t like something about it
so they post it to the mailing list. Then the mailing list informs
them that Git 3.0 was released two years ago and that the current
document is about Git 4.0.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/gitbreaking-changes.adoc | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index 9aba419efc9..410476c7993 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -73,6 +73,16 @@ over time. If circumstances change, an earlier decision to deprecate or change
something may need to be revisited from time to time. So do not take items on
this list to mean "it is settled, do not waste our time bringing it up again".
+[NOTE]
+--
+In case you are reading this document from a released version: this
+being a _living document_ means that you might want to consult what
+the current, development version of the document looks like in case
+anything here motivates you to post some feedback to the project.
+Because specific details you read here might have been changed in the
+development version.
+--
+
== Procedure
Discussing the desire to make breaking changes, declaring that breaking
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [RFC PATCH 4/4] doc: git: mention gitbreaking-changes(7)
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
` (2 preceding siblings ...)
2026-09-28 10:41 ` [RFC PATCH 3/4] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
@ 2026-09-28 10:41 ` kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-09-28 10:41 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
Users are the ones who are impacted by breaking changes. Certainly much
more than Git developers who are already plugged in to the development
channels that discuss the trajectory of the project.
We have to that end already made the breaking changes document into a
more public-facing page, namely a regular manpage. Now let’s mention on
git(1) like the other user-relevant guides.
Like last time,[1] use double-spacing for sentences since that is the
existing convention.
† 1: 5745353d (doc: git: link to the gitdatamodel(7) tutorial,
2026-09-05)
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/git.adoc | 5 ++++-
command-list.txt | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/Documentation/git.adoc b/Documentation/git.adoc
index 6f0075f9188..6a4ef2dff5c 100644
--- a/Documentation/git.adoc
+++ b/Documentation/git.adoc
@@ -26,7 +26,9 @@ See linkgit:gittutorial[7] to get started, then see
linkgit:giteveryday[7] for a useful minimum set of
commands. The link:user-manual.html[Git User's Manual] has a more
in-depth introduction. See linkgit:gitdatamodel[7] if you want to
-learn about the data model and important terminology.
+learn about the data model and important terminology. See
+linkgit:gitbreaking-changes[7] for a discussion of breaking changes
+planned for Git 3.0.
After you mastered the basic concepts, you can come back to this
page to learn what commands Git offers. You can learn more about
@@ -1204,6 +1206,7 @@ linkgit:gittutorial[7], linkgit:gittutorial-2[7],
linkgit:giteveryday[7], linkgit:gitcvs-migration[7],
linkgit:gitglossary[7], linkgit:gitdatamodel[7],
linkgit:gitcore-tutorial[7], linkgit:gitcli[7],
+linkgit:gitbreaking-changes[7],
link:user-manual.html[The Git User's Manual],
linkgit:gitworkflows[7]
diff --git a/command-list.txt b/command-list.txt
index 63ae2a67c94..1b7236a62fd 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -213,6 +213,7 @@ git-whatchanged ancillaryinterrogators complete
git-worktree mainporcelain
git-write-tree plumbingmanipulators
gitattributes userinterfaces
+gitbreaking-changes guide
gitcli userinterfaces
gitcore-tutorial guide
gitcredentials guide
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 1/4] doc: transform breaking changes doc to a manpage
2026-09-28 10:41 ` [RFC PATCH 1/4] doc: transform breaking changes doc " kristofferhaugsbakk
@ 2026-09-30 13:28 ` Patrick Steinhardt
2026-09-30 14:17 ` Kristoffer Haugsbakk
0 siblings, 1 reply; 25+ messages in thread
From: Patrick Steinhardt @ 2026-09-30 13:28 UTC (permalink / raw)
To: kristofferhaugsbakk; +Cc: git, Kristoffer Haugsbakk
On Mon, Sep 28, 2026 at 12:41:25PM +0200, kristofferhaugsbakk@fastmail.com wrote:
> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>
> The breaking changes document is not a regular Git documentation page.
> That means that you cannot navigate to the doc with git(1), i.e. with:
>
> git help BreakingChanges
>
> You instead have to download the Git project source. Or go to
> git-scm.com.[1] Then you get this disclaimer:[2]
>
> This information is specific to the Git project
>
> Please note that this information is only relevant to you if you
> plan on contributing to the Git project itself. It is in no shape or
> form required reading for regular Git users.
>
> But this document is relevant to *all* Git users. Everyone should have
> as easy access to it as the other doc and guide pages.
Yeah, I agree with that sentiment. The one interesting question about it
is of course what we'll do with the document once Git 3.0 is out. Will
we retain it? Will we remove it? Will we empty it and make it focus on
Git 4.0?
I guess once it's a manpage we should definitely retain its contents for
a while longer. The breaking changes will be relevant to users even
after they've already upgraded to Git 3.0. But if so, we should probably
introduce a new section for Git 4.0, at least if we already want to
start thinking about that.
NB: even if we start thinking about it I think we should probably not
release it anytime soon. I guess having a major release once per
decade may be good enough.
> To that end, let’s move the text to a manpage. But keep the old page,
> just linking to the new one. (We wouldn’t want to break any readers.)
>
> Just do the minimal changes for the new format. Also demote the first
> section to the second level, i.e. make “Introduction” the same level
> as “Procedure’.
I feel like a good first step could've been to convert the
BreakingChanges.adoc document in-place to use the new format. Like that,
it would've become way easier to see what's actually changing. The
rename could've then been a 1:1 move.
Patrick
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-28 10:41 ` [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
@ 2026-09-30 13:28 ` Patrick Steinhardt
2026-09-30 14:09 ` Kristoffer Haugsbakk
2026-09-30 19:45 ` Junio C Hamano
0 siblings, 2 replies; 25+ messages in thread
From: Patrick Steinhardt @ 2026-09-30 13:28 UTC (permalink / raw)
To: kristofferhaugsbakk; +Cc: git, Kristoffer Haugsbakk
On Mon, Sep 28, 2026 at 12:41:26PM +0200, kristofferhaugsbakk@fastmail.com wrote:
> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>
> This document has used msg-ids to reference emails since its
> inception.[1] This makes the text a bit more terse, and is perhaps
> also convenient for people who can use msg-ids to link to messages
> in their inbox. But we should consider how convenient this is for people
> in general, now that this is a more public-facing page (see previous
> commit). And I suspect that most people will be forced to paste the
> msg-id according to the described URL template:
>
> https://lore.kernel.org/git/$message_id/
>
> Let’s instead replace all of the msg-ids with complete links. That way
> everyone can jump right to the discussions.
Fair. The links may of course break if at any point in time
lore.kernel.org were to vanish or change its interface. But if so we can
adapt accordingly, also because the message ID can still be extracted
trivially.
>
> diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
> index c6b974b6d8c..9aba419efc9 100644
> --- a/Documentation/gitbreaking-changes.adoc
> +++ b/Documentation/gitbreaking-changes.adoc
> @@ -59,15 +59,14 @@ make the described change that can be easily understood without having to read
> the mailing list discussions. If there are alternatives to the changed feature,
> those alternatives should be pointed out to our users.
>
> -All items should be accompanied by references to relevant mailing list threads
> -where the deprecation was discussed. These references use message-IDs, which
> -can visited via
> +All items should be accompanied by links to relevant mailing list threads
> +where the deprecation was discussed. These links use this format:
>
> https://lore.kernel.org/git/$message_id/
>
> -to see the message and its surrounding discussion. Such a reference is there to
> -make it easier for you to find how the project reached consensus on the
> -described item back then.
> +I.e. they link to the `Message-ID` of the email on the mailing
> +list. These references are there to make it easier for you to find how
> +the project reached consensus on the described item back then.
>
> This is a living document as the environment surrounding the project changes
> over time. If circumstances change, an earlier decision to deprecate or change
I wonder whether the information on how to add new entries should now go
towards the end of this document. The target audience is expanding with
your patch series, and most of those new readers will not care about how
to add an entry.
> @@ -332,7 +331,7 @@ The command will be removed.
> * Support for `core.commentString=auto` has been deprecated and will
> be removed in Git 3.0.
> +
> -cf. <xmqqa59i45wc.fsf@gitster.g>
> +cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
>
> * Support for `core.preferSymlinkRefs=true` has been deprecated and will be
> removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
Nit: two spaces.
Patrick
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-30 13:28 ` Patrick Steinhardt
@ 2026-09-30 14:09 ` Kristoffer Haugsbakk
2026-09-30 19:45 ` Junio C Hamano
1 sibling, 0 replies; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-09-30 14:09 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: git
On Wed, Sep 30, 2026, at 15:28, Patrick Steinhardt wrote:
> On Mon, Sep 28, 2026 at 12:41:26PM +0200,
> kristofferhaugsbakk@fastmail.com wrote:
>>[snip]
>> Let’s instead replace all of the msg-ids with complete links. That way
>> everyone can jump right to the discussions.
>
> Fair. The links may of course break if at any point in time
> lore.kernel.org were to vanish or change its interface. But if so we can
> adapt accordingly, also because the message ID can still be extracted
> trivially.
Yeah makes sense.
>
>>
>> diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
>> index c6b974b6d8c..9aba419efc9 100644
>> --- a/Documentation/gitbreaking-changes.adoc
>> +++ b/Documentation/gitbreaking-changes.adoc
>> @@ -59,15 +59,14 @@ make the described change that can be easily understood without having to read
>> the mailing list discussions. If there are alternatives to the changed feature,
>> those alternatives should be pointed out to our users.
>>
>> -All items should be accompanied by references to relevant mailing list threads
>> -where the deprecation was discussed. These references use message-IDs, which
>> -can visited via
>> +All items should be accompanied by links to relevant mailing list threads
>> +where the deprecation was discussed. These links use this format:
>>
>> https://lore.kernel.org/git/$message_id/
>>
>> -to see the message and its surrounding discussion. Such a reference is there to
>> -make it easier for you to find how the project reached consensus on the
>> -described item back then.
>> +I.e. they link to the `Message-ID` of the email on the mailing
>> +list. These references are there to make it easier for you to find how
>> +the project reached consensus on the described item back then.
>>
>> This is a living document as the environment surrounding the project changes
>> over time. If circumstances change, an earlier decision to deprecate or change
>
> I wonder whether the information on how to add new entries should now go
> towards the end of this document. The target audience is expanding with
> your patch series, and most of those new readers will not care about how
> to add an entry.
Yeah, I can make that change.
>
>> @@ -332,7 +331,7 @@ The command will be removed.
>> * Support for `core.commentString=auto` has been deprecated and will
>> be removed in Git 3.0.
>> +
>> -cf. <xmqqa59i45wc.fsf@gitster.g>
>> +cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
>>
>> * Support for `core.preferSymlinkRefs=true` has been deprecated and will be
>> removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
>
> Nit: two spaces.
Thanks, I’ll fix that.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 1/4] doc: transform breaking changes doc to a manpage
2026-09-30 13:28 ` Patrick Steinhardt
@ 2026-09-30 14:17 ` Kristoffer Haugsbakk
2026-09-30 14:28 ` Patrick Steinhardt
0 siblings, 1 reply; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-09-30 14:17 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: git
On Wed, Sep 30, 2026, at 15:28, Patrick Steinhardt wrote:
> On Mon, Sep 28, 2026 at 12:41:25PM +0200,
> kristofferhaugsbakk@fastmail.com wrote:
>> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>>
>> The breaking changes document is not a regular Git documentation page.
>> That means that you cannot navigate to the doc with git(1), i.e. with:
>>
>> git help BreakingChanges
>>
>> You instead have to download the Git project source. Or go to
>> git-scm.com.[1] Then you get this disclaimer:[2]
>>
>> This information is specific to the Git project
>>
>> Please note that this information is only relevant to you if you
>> plan on contributing to the Git project itself. It is in no shape or
>> form required reading for regular Git users.
>>
>> But this document is relevant to *all* Git users. Everyone should have
>> as easy access to it as the other doc and guide pages.
>
> Yeah, I agree with that sentiment.
I’m glad that this idea makes sense to more than one person. x)
> [...] The one interesting question about it is of course what we'll do
> with the document once Git 3.0 is out. Will we retain it? Will we
> remove it? Will we empty it and make it focus on Git 4.0?
>
> I guess once it's a manpage we should definitely retain its contents for
> a while longer. The breaking changes will be relevant to users even
> after they've already upgraded to Git 3.0. But if so, we should probably
> introduce a new section for Git 4.0, at least if we already want to
> start thinking about that.
>
> NB: even if we start thinking about it I think we should probably not
> release it anytime soon. I guess having a major release once per
> decade may be good enough.
I know you are wondering out loud here to the fora. But just personally,
I imagine that this will happen after Git 3.0:
• A section at the end about Git 3.0 for historical interest as well as
people on older versions who might be browsing outside of their
installation (probably git-scm) (and who might be on pre-3.0)
• Git 4.0 discussion before that, however hypothetical or distant the
release date
>
>> To that end, let’s move the text to a manpage. But keep the old page,
>> just linking to the new one. (We wouldn’t want to break any readers.)
>>
>> Just do the minimal changes for the new format. Also demote the first
>> section to the second level, i.e. make “Introduction” the same level
>> as “Procedure’.
>
> I feel like a good first step could've been to convert the
> BreakingChanges.adoc document in-place to use the new format. Like that,
> it would've become way easier to see what's actually changing. The
> rename could've then been a 1:1 move.
Like this?
1. Convert to the manpage format without changing the filename
2. Rename the file: pure rename without any other modifications
3. Resurrect `BreakingChanges.adoc` with one line that points to the new
document
Thanks for reviewing.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 1/4] doc: transform breaking changes doc to a manpage
2026-09-30 14:17 ` Kristoffer Haugsbakk
@ 2026-09-30 14:28 ` Patrick Steinhardt
0 siblings, 0 replies; 25+ messages in thread
From: Patrick Steinhardt @ 2026-09-30 14:28 UTC (permalink / raw)
To: Kristoffer Haugsbakk; +Cc: git
On Wed, Sep 30, 2026 at 04:17:44PM +0200, Kristoffer Haugsbakk wrote:
> On Wed, Sep 30, 2026, at 15:28, Patrick Steinhardt wrote:
> > On Mon, Sep 28, 2026 at 12:41:25PM +0200, kristofferhaugsbakk@fastmail.com wrote:
> >> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
> > [...] The one interesting question about it is of course what we'll do
> > with the document once Git 3.0 is out. Will we retain it? Will we
> > remove it? Will we empty it and make it focus on Git 4.0?
> >
> > I guess once it's a manpage we should definitely retain its contents for
> > a while longer. The breaking changes will be relevant to users even
> > after they've already upgraded to Git 3.0. But if so, we should probably
> > introduce a new section for Git 4.0, at least if we already want to
> > start thinking about that.
> >
> > NB: even if we start thinking about it I think we should probably not
> > release it anytime soon. I guess having a major release once per
> > decade may be good enough.
>
> I know you are wondering out loud here to the fora. But just personally,
> I imagine that this will happen after Git 3.0:
>
> • A section at the end about Git 3.0 for historical interest as well as
> people on older versions who might be browsing outside of their
> installation (probably git-scm) (and who might be on pre-3.0)
> • Git 4.0 discussion before that, however hypothetical or distant the
> release date
Yeah, that's also mostly what I arrived at, too.
> >> To that end, let’s move the text to a manpage. But keep the old page,
> >> just linking to the new one. (We wouldn’t want to break any readers.)
> >>
> >> Just do the minimal changes for the new format. Also demote the first
> >> section to the second level, i.e. make “Introduction” the same level
> >> as “Procedure’.
> >
> > I feel like a good first step could've been to convert the
> > BreakingChanges.adoc document in-place to use the new format. Like that,
> > it would've become way easier to see what's actually changing. The
> > rename could've then been a 1:1 move.
>
> Like this?
>
> 1. Convert to the manpage format without changing the filename
> 2. Rename the file: pure rename without any other modifications
> 3. Resurrect `BreakingChanges.adoc` with one line that points to the new
> document
I guess (2) and (3) can easily be combined. I'd hope that Git still
detects this as a 1:1 rename.
Patrick
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-30 13:28 ` Patrick Steinhardt
2026-09-30 14:09 ` Kristoffer Haugsbakk
@ 2026-09-30 19:45 ` Junio C Hamano
2026-10-01 6:27 ` Patrick Steinhardt
2026-10-03 11:52 ` Kristoffer Haugsbakk
1 sibling, 2 replies; 25+ messages in thread
From: Junio C Hamano @ 2026-09-30 19:45 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: kristofferhaugsbakk, git, Kristoffer Haugsbakk
Patrick Steinhardt <ps@pks.im> writes:
> On Mon, Sep 28, 2026 at 12:41:26PM +0200, kristofferhaugsbakk@fastmail.com wrote:
>> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>>
>> This document has used msg-ids to reference emails since its
>> inception.[1] This makes the text a bit more terse, and is perhaps
>> also convenient for people who can use msg-ids to link to messages
>> in their inbox. But we should consider how convenient this is for people
>> in general, now that this is a more public-facing page (see previous
>> commit). And I suspect that most people will be forced to paste the
>> msg-id according to the described URL template:
>>
>> https://lore.kernel.org/git/$message_id/
>>
>> Let’s instead replace all of the msg-ids with complete links. That way
>> everyone can jump right to the discussions.
>
> Fair. The links may of course break if at any point in time
> lore.kernel.org were to vanish or change its interface. But if so we can
> adapt accordingly, also because the message ID can still be extracted
> trivially.
One caveat is that some "funny characters" in message IDs need to be
URL-encoded.
A recent example I saw was <20260930061524.GNkIK%taahol@utu.fi>;
https://lore.kernel.org/git/20260930061524.GNkIK%25taahol@utu.fi/ is
the URL you need to visit to view the message.
Having said that, I am somewhat negative on what this particular
patch does. We should instead give both, having something like
cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/[<xmqqa59i45wc.fsf@gitster.g>^]
in the source, and render a readable link text with reachable href
when shown in the browser.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-30 19:45 ` Junio C Hamano
@ 2026-10-01 6:27 ` Patrick Steinhardt
2026-10-03 11:52 ` Kristoffer Haugsbakk
1 sibling, 0 replies; 25+ messages in thread
From: Patrick Steinhardt @ 2026-10-01 6:27 UTC (permalink / raw)
To: Junio C Hamano; +Cc: kristofferhaugsbakk, git, Kristoffer Haugsbakk
On Wed, Sep 30, 2026 at 12:45:06PM -0700, Junio C Hamano wrote:
> Patrick Steinhardt <ps@pks.im> writes:
>
> > On Mon, Sep 28, 2026 at 12:41:26PM +0200, kristofferhaugsbakk@fastmail.com wrote:
> >> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
> >>
> >> This document has used msg-ids to reference emails since its
> >> inception.[1] This makes the text a bit more terse, and is perhaps
> >> also convenient for people who can use msg-ids to link to messages
> >> in their inbox. But we should consider how convenient this is for people
> >> in general, now that this is a more public-facing page (see previous
> >> commit). And I suspect that most people will be forced to paste the
> >> msg-id according to the described URL template:
> >>
> >> https://lore.kernel.org/git/$message_id/
> >>
> >> Let’s instead replace all of the msg-ids with complete links. That way
> >> everyone can jump right to the discussions.
> >
> > Fair. The links may of course break if at any point in time
> > lore.kernel.org were to vanish or change its interface. But if so we can
> > adapt accordingly, also because the message ID can still be extracted
> > trivially.
>
> One caveat is that some "funny characters" in message IDs need to be
> URL-encoded.
>
> A recent example I saw was <20260930061524.GNkIK%taahol@utu.fi>;
> https://lore.kernel.org/git/20260930061524.GNkIK%25taahol@utu.fi/ is
> the URL you need to visit to view the message.
>
> Having said that, I am somewhat negative on what this particular
> patch does. We should instead give both, having something like
>
> cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/[<xmqqa59i45wc.fsf@gitster.g>^]
>
> in the source, and render a readable link text with reachable href
> when shown in the browser.
Oh, that's even better if you ask me!
Patrick
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-09-30 19:45 ` Junio C Hamano
2026-10-01 6:27 ` Patrick Steinhardt
@ 2026-10-03 11:52 ` Kristoffer Haugsbakk
2026-10-03 14:10 ` Kristoffer Haugsbakk
2026-10-04 2:31 ` Junio C Hamano
1 sibling, 2 replies; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-10-03 11:52 UTC (permalink / raw)
To: Junio C Hamano, Patrick Steinhardt; +Cc: git
On Wed, Sep 30, 2026, at 21:45, Junio C Hamano wrote:
> Patrick Steinhardt <ps@pks.im> writes:
>> On Mon, Sep 28, 2026 at 12:41:26PM +0200, kristofferhaugsbakk@fastmail.com wrote:
>>> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>>>[snip]
>>
>> Fair. The links may of course break if at any point in time
>> lore.kernel.org were to vanish or change its interface. But if so we can
>> adapt accordingly, also because the message ID can still be extracted
>> trivially.
>
> One caveat is that some "funny characters" in message IDs need to be
> URL-encoded.
>
> A recent example I saw was <20260930061524.GNkIK%taahol@utu.fi>;
> https://lore.kernel.org/git/20260930061524.GNkIK%25taahol@utu.fi/ is
> the URL you need to visit to view the message.
>
> Having said that, I am somewhat negative on what this particular
> patch does. We should instead give both, having something like
>
> cf.
> https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/[<xmqqa59i45wc.fsf@gitster.g>^]
>
> in the source, and render a readable link text with reachable href
> when shown in the browser.
With that I get a regular `href` and a `mailto` href.
<div class="paragraph"><p>cf. <a href="https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/"><<a href="mailto:xmqqa59i45wc.fsf@gitster.g">xmqqa59i45wc.fsf@gitster.g</a>>^</a></p></div>
The `mailto` wins and prepares to send an email.
For HTML output at least (I haven’t tested man yet) you can use
`@`:
cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/[<xmqqa59i45wc.fsf@gitster.g>^]
And that works.
But with this rendered output:
• Support for core.commentString=auto has been deprecated and will
be removed in Git 3.0.
cf. <xmqqa59i45wc.fsf@gitster.g>^
You have an exceptionally short (cf. UUID monstrosity) msg-id, like all
your msg-ids,[1] to the point that it looks as long as an email address
but more random-looking and with a weird domain name. And the exception
for email addresses (looking) that are formatted as links are that they
are `mailto` links. So what would the expectation be for someone who
hasn’t read a preamble about what these things with @-symbols are? That
they are contact addresses perhaps?
I don’t think this is an improvement. Now people unaccustomed to using
msg-ids have to be cognizant of these things as links (not as weird
email addresses), which is even assuming that they read the
preamble. But with regular URLs you don’t even need a preamble.
As for the man format: my terminal lets me open links.
Maybe we should drop this patch if we disagree that either choice here
is an improvement.
† 1: 3/11 of the existing msg-ids are from the maintainer
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-10-03 11:52 ` Kristoffer Haugsbakk
@ 2026-10-03 14:10 ` Kristoffer Haugsbakk
2026-10-04 2:31 ` Junio C Hamano
1 sibling, 0 replies; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-10-03 14:10 UTC (permalink / raw)
To: Junio C Hamano, Patrick Steinhardt; +Cc: git
On Sat, Oct 3, 2026, at 13:52, Kristoffer Haugsbakk wrote:
> [snip]
> And the exception
> for email addresses (looking) that are formatted as links are that they
> are `mailto` links.
Sorry. Replace “exception” with “expectation”.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-10-03 11:52 ` Kristoffer Haugsbakk
2026-10-03 14:10 ` Kristoffer Haugsbakk
@ 2026-10-04 2:31 ` Junio C Hamano
2026-10-06 16:38 ` Kristoffer Haugsbakk
1 sibling, 1 reply; 25+ messages in thread
From: Junio C Hamano @ 2026-10-04 2:31 UTC (permalink / raw)
To: Kristoffer Haugsbakk; +Cc: Patrick Steinhardt, git
"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com> writes:
>> Having said that, I am somewhat negative on what this particular
>> patch does. We should instead give both, having something like
>>
>> cf.
>> https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/[<xmqqa59i45wc.fsf@gitster.g>^]
>>
>> in the source, and render a readable link text with reachable href
>> when shown in the browser.
>
> With that I get a regular `href` and a `mailto` href.
>
> <div class="paragraph"><p>cf. <a href="https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/"><<a href="mailto:xmqqa59i45wc.fsf@gitster.g">xmqqa59i45wc.fsf@gitster.g</a>>^</a></p></div>
>
> The `mailto` wins and prepares to send an email.
Ouch.
Our primary goal is to give readers ready access to the messages we
refer to. With that mailto glitch, it would be unusable, so let's
scrap the idea of using the Message-ID as the link text for the link
that leads to the lore archive, unless we can tell Asciidoctor to do
what we want. Quite honestly, I did not know Asciidoctor was that
broken.
Also, if readers do not recognize "Message-ID used as link text" as
clickable links, that also defeats the purpose.
The secondary goal of my suggestion was to avoid repeating the
disaster we faced after gmane stopped offering HTTP access to its
archive. We ended up with a bunch of references like $gmane/217 to
refer to their article numbers in our historical commit log
messages, and of course, once we could no longer rely on them, we
had no way of knowing what message article 217 referred to [*]. The
URL to the lore archive does contain an encoded Message-ID, so the
situation is much better than that of gmane from long ago. However,
if you live in an environment where it is easier to feed the
Message-ID directly to your e-mail program or newsreader than having
to visit the web and then come back to your e-mail environment to
continue your work, having a readily cut-and-pasteable Message-ID
that is not encoded as part of a URL is definitely superior to
having the lore URL alone.
But the important point is that this was a secondary goal. If the
format using Message-IDs as link texts to go to the lore archive does
not work (either because we cannot bypass the mailto behavior, or
because readers would not recognize that Message-IDs are clickable
links), I am perfectly fine with leaving only the HTTP link that
is so obviously a URL (even though I find them rather ugly, but
I am not the primary target audience).
Thanks for testing this and finding the issues before we went too
far.
[References]
* It is <Pine.LNX.4.58.0504150753440.7211@ppc970.osdl.org>, which I
think is still one of the most important messages on the list ;-)
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-10-04 2:31 ` Junio C Hamano
@ 2026-10-06 16:38 ` Kristoffer Haugsbakk
2026-10-06 20:33 ` Junio C Hamano
0 siblings, 1 reply; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-10-06 16:38 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Patrick Steinhardt, git
On Sun, Oct 4, 2026, at 04:31, Junio C Hamano wrote:
> "Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com> writes:
>
>>>[snip]
>>
>> With that I get a regular `href` and a `mailto` href.
>>
>> <div class="paragraph"><p>cf. <a href="https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g/"><<a href="mailto:xmqqa59i45wc.fsf@gitster.g">xmqqa59i45wc.fsf@gitster.g</a>>^</a></p></div>
>>
>> The `mailto` wins and prepares to send an email.
>
> Ouch.
>
> Our primary goal is to give readers ready access to the messages we
> refer to. With that mailto glitch, it would be unusable, so let's
> scrap the idea of using the Message-ID as the link text for the link
> that leads to the lore archive, unless we can tell Asciidoctor to do
> what we want. Quite honestly, I did not know Asciidoctor was that
> broken.
Surprised I was not.
>
> Also, if readers do not recognize "Message-ID used as link text" as
> clickable links, that also defeats the purpose.
>
> The secondary goal of my suggestion was to avoid repeating the
> disaster we faced after gmane stopped offering HTTP access to its
> archive. We ended up with a bunch of references like $gmane/217 to
> refer to their article numbers in our historical commit log
> messages, and of course, once we could no longer rely on them, we
> had no way of knowing what message article 217 referred to [*]. The
> URL to the lore archive does contain an encoded Message-ID, so the
> situation is much better than that of gmane from long ago.
Yes, I find it frustrating to read Gmane-era list messages.
But now these references are already forever in the Git history. So even
if I end up obfuscating them with a URL encoding, it will be clear from
the history... for those who go to the trouble of looking.
But see later in this message about how to retain the original msg-ids.
> However,
> if you live in an environment where it is easier to feed the
> Message-ID directly to your e-mail program or newsreader than having
> to visit the web and then come back to your e-mail environment to
> continue your work, having a readily cut-and-pasteable Message-ID
> that is not encoded as part of a URL is definitely superior to
> having the lore URL alone.
Yeah I suspected that email-only users would have such a slick
setup. Thanks for explaining.
> But the important point is that this was a secondary goal. If the
> format using Message-IDs as link texts to go to the lore archive does
> not work (either because we cannot bypass the mailto behavior, or
> because readers would not recognize that Message-IDs are clickable
> links), I am perfectly fine with leaving only the HTTP link that
> is so obviously a URL (even though I find them rather ugly, but
> I am not the primary target audience).
What if we used footnotes for all of the original msg-ids?
<URL>[1]
[...]
[1]: <msg-id>
Or maybe just for the ones that need URL encoding? I personally think it
would be better to use them for all if we go for this approach.
>[snip]
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs
2026-10-06 16:38 ` Kristoffer Haugsbakk
@ 2026-10-06 20:33 ` Junio C Hamano
0 siblings, 0 replies; 25+ messages in thread
From: Junio C Hamano @ 2026-10-06 20:33 UTC (permalink / raw)
To: Kristoffer Haugsbakk; +Cc: Patrick Steinhardt, git
"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com> writes:
> What if we used footnotes for all of the original msg-ids?
>
> <URL>[1]
>
> [...]
>
> [1]: <msg-id>
>
> Or maybe just for the ones that need URL encoding? I personally think it
> would be better to use them for all if we go for this approach.
If this is an attempt to cater to those who prefer raw message IDs
over URLs that encode them, I doubt it is an improvement.
A footnote placed far down the document that merely repeats what is
already in the URL is uglier than simply using the URL without such
a footnote layout. The cost of avoiding this ugliness is rather
small for such users. They have to extract the encoded message ID
from the URL, perhaps decoding it manually, before using it. That
is not too much work.
So, unless we can use a clickable link whose text can be copied
to get the raw message ID (which even novice users would clearly
recognize as a link rather than an e-mail address), which we
already agreed is impossible, let's just provide the URL. Users
can copy and paste it into their browsers, and many terminal
emulators will let them click it directly, as you mentioned
earlier.
Thanks.
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH v2 0/5] doc: move BreakingChanges to a manpage
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
` (3 preceding siblings ...)
2026-09-28 10:41 ` [RFC PATCH 4/4] doc: git: mention gitbreaking-changes(7) kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 1/5] doc: BreakingChanges: transform " kristofferhaugsbakk
` (4 more replies)
4 siblings, 5 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
Topic name: kh/doc-gitbreaking-changes7
Topic summary: Move BreakingChanges document to a manpage for easier
visibility.
Notes to the maintainer: conflicts with topics ps/ref-storage-format (in
`master`) and bc/restrict-hex-to-lowercase (in `seen`). Respectively, they
add these things to `BreakingChanges.adoc`:
(1)
+
Users that get immediate benefit from the "reftable" backend could continue to
-opt-in to the "reftable" format manually by setting the "init.defaultRefFormat"
+opt-in to the "reftable" format manually by setting the "init.defaultRefStorageFormat"
(2)
matches the default branch name used in new repositories by many of the
big Git forges.
+* Git will accept hex object IDs only in lowercase. The fact that Git has
+ historically allowed uppercase characters in hex object IDs has been the
+ source of a variety of bugs and security problems in software using Git. We
+ don't expect most users to notice any change.
(But (2) uses tabs for the three last lines)
So they would need to be moved from `BreakingChanges.adoc` to
`gitbreaking-changes.adoc`.
***
Users are the ones who are impacted by breaking changes. Certainly much
more than Git developers who are already plugged in to the development
channels that discuss the trajectory of the project. Advertizing the
planned breaking changes to all users will help the whole Git community
prepare.
§ Changes in v2
Drop RFC status since Patrick seems to think that this is an okay
change.[1]
Patch “mention gitbreaking-changes(7)” is dropped. This is because Julia’s
parallel topic je/doc-promote-git-help removes guide-mentions on the git(1)
doc.[2]
Series v1 patch “transform breaking changes doc to a manpage” has been
split into two in order to make tracing the moved lines easier.[1] I did
not go all the way and made another commit for a pure filemove. I think
`--color-moved` should be enough here. But I can of course make another
commit.
Note that this split isn’t that obvious from the range diff. It might have
been etter if it compared the previous round with the first commit, but
futzing with `--creation-factor` didn’t help me here.
Patch “replace msg-ids with URLs”: fixed unintended space changes. Another
linking scheme was discussed but it lead to no changes.[4] But! I found out
that one URL does not render properly with asciidoc(1). So I made a
compromise for now. Maybe that sinks the URL aspirations here.
Patch “move new-items discussion to the end” is new and based on what I
hope is my correct interpretation of Patrick’s suggestion.[3]
† 1: <ar0OicAaDipYx-xU@pks.im>
† 2: <ea29fe74-7f76-440c-9597-fdbc173be90f@app.fastmail.com>
† 3: <ar0OltAkeTiCx81c@pks.im>
† 4: <xmqqeceaa5h9.fsf@gitster.g>
§ Link to v1
https://lore.kernel.org/git/CV_gitbrchanges7_please.d1c@m5gid.xyz/
[1/5] doc: BreakingChanges: transform to a manpage
[2/5] doc: gitbreaking-changes: create from BreakingChanges
[3/5] doc: gitbreaking-changes: replace msg-ids with URLs
[4/5] doc: gitbreaking-changes: add note about living document
[5/5] doc: gitbreaking-changes: move new-items discussion to the end
Documentation/BreakingChanges.adoc | 360 +----------------------
Documentation/Makefile | 1 +
Documentation/gitbreaking-changes.adoc | 389 +++++++++++++++++++++++++
Documentation/meson.build | 1 +
command-list.txt | 1 +
5 files changed, 393 insertions(+), 359 deletions(-)
create mode 100644 Documentation/gitbreaking-changes.adoc
Interdiff against v1:
diff --git a/Documentation/git.adoc b/Documentation/git.adoc
index 6a4ef2dff5c..6f0075f9188 100644
--- a/Documentation/git.adoc
+++ b/Documentation/git.adoc
@@ -26,9 +26,7 @@ See linkgit:gittutorial[7] to get started, then see
linkgit:giteveryday[7] for a useful minimum set of
commands. The link:user-manual.html[Git User's Manual] has a more
in-depth introduction. See linkgit:gitdatamodel[7] if you want to
-learn about the data model and important terminology. See
-linkgit:gitbreaking-changes[7] for a discussion of breaking changes
-planned for Git 3.0.
+learn about the data model and important terminology.
After you mastered the basic concepts, you can come back to this
page to learn what commands Git offers. You can learn more about
@@ -1206,7 +1204,6 @@ linkgit:gittutorial[7], linkgit:gittutorial-2[7],
linkgit:giteveryday[7], linkgit:gitcvs-migration[7],
linkgit:gitglossary[7], linkgit:gitdatamodel[7],
linkgit:gitcore-tutorial[7], linkgit:gitcli[7],
-linkgit:gitbreaking-changes[7],
link:user-manual.html[The Git User's Manual],
linkgit:gitworkflows[7]
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index 410476c7993..e984c2c8ca5 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -54,20 +54,6 @@ breaking releases. Furthermore, this document also tracks what will _not_ be
deprecated. This is done such that the outcome of discussions document both
when the discussion favors deprecation, but also when it rejects a deprecation.
-Items should have a clear summary of the reasons why we do or do not want to
-make the described change that can be easily understood without having to read
-the mailing list discussions. If there are alternatives to the changed feature,
-those alternatives should be pointed out to our users.
-
-All items should be accompanied by links to relevant mailing list threads
-where the deprecation was discussed. These links use this format:
-
- https://lore.kernel.org/git/$message_id/
-
-I.e. they link to the `Message-ID` of the email on the mailing
-list. These references are there to make it easier for you to find how
-the project reached consensus on the described item back then.
-
This is a living document as the environment surrounding the project changes
over time. If circumstances change, an earlier decision to deprecate or change
something may need to be revisited from time to time. So do not take items on
@@ -140,7 +126,7 @@ There is no plan to deprecate the "sha1" object format at this point in time.
+
Cf. https://lore.kernel.org/git/2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com,
https://lore.kernel.org/git/20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain,
-https://lore.kernel.org/git/CA%2BEOSBncr%3D4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE%2BDiUQ@mail.gmail.com/.
+https://lore.kernel.org/git/CACBZZX65Kbp8N9X9UtBfJca7U1T0m-VtKZeKM5q9mhyCR7dwGg@mail.gmail.com.
* The default storage format for references in newly created repositories will
be changed from "files" to "reftable". The "reftable" format provides
@@ -341,7 +327,7 @@ The command will be removed.
* Support for `core.commentString=auto` has been deprecated and will
be removed in Git 3.0.
+
-cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
+cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
@@ -379,8 +365,24 @@ This decision may get revisited in case we ever figure out that there are
almost no users of any of the commands anymore.
+
Cf. https://lore.kernel.org/git/xmqqttjazwwa.fsf@gitster.g,
-https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
-https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
+ https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
+ https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
+
+== Adding new items
+
+Items should have a clear summary of the reasons why we do or do not want to
+make the described change that can be easily understood without having to read
+the mailing list discussions. If there are alternatives to the changed feature,
+those alternatives should be pointed out to our users.
+
+All items should be accompanied by links to relevant mailing list threads
+where the deprecation was discussed. These links use this format:
+
+ https://lore.kernel.org/git/$message_id/
+
+I.e. they link to the `Message-ID` of the email on the mailing
+list. These references are there to make it easier for you to find how
+the project reached consensus on the described item back then.
GIT
---
Range-diff against v1:
-: ----------- > 1: 2b5d0b23a5a doc: BreakingChanges: transform to a manpage
1: 4f98172c30d ! 2: 476d8849135 doc: transform breaking changes doc to a manpage
@@ Metadata
Author: Kristoffer Haugsbakk <code@khaugsbakk.name>
## Commit message ##
- doc: transform breaking changes doc to a manpage
+ doc: gitbreaking-changes: create from BreakingChanges
- The breaking changes document is not a regular Git documentation page.
- That means that you cannot navigate to the doc with git(1), i.e. with:
+ We can rename to gitbreaking-changes(7) now that we have changed to
+ the required format in the preceding commit.
- git help BreakingChanges
-
- You instead have to download the Git project source. Or go to
- git-scm.com.[1] Then you get this disclaimer:[2]
-
- This information is specific to the Git project
-
- Please note that this information is only relevant to you if you
- plan on contributing to the Git project itself. It is in no shape or
- form required reading for regular Git users.
-
- But this document is relevant to *all* Git users. Everyone should have
- as easy access to it as the other doc and guide pages.
-
- To that end, let’s move the text to a manpage. But keep the old page,
- just linking to the new one. (We wouldn’t want to break any readers.)
-
- Just do the minimal changes for the new format. Also demote the first
- section to the second level, i.e. make “Introduction” the same level
- as “Procedure’.
-
- † 1: https://git-scm.com/docs/BreakingChanges.html
- † 2: Which I first mentioned in 098230f7 (you-still-use-that??: help the
- user help themselves, 2025-09-17), footnote #1.
+ But we also need to keep `BreakingChanges.adoc` in order to point to
+ the new document. That way old links and whatnot are still serviceable.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
## Documentation/BreakingChanges.adoc ##
@@
--= Upcoming breaking changes
+-gitbreaking-changes(7)
+-======================
+-
+-NAME
+-----
+-gitbreaking-changes - Breaking changes for upcoming Git 3.0
+-
+-SYNOPSIS
+---------
+-*
+-
+-DESCRIPTION
+------------
+-*
+-
+-== Introduction: Upcoming breaking changes
-
-The Git project aims to ensure backwards compatibility to the best extent
-possible. Minor releases will not break backwards compatibility unless there is
@@ Documentation/BreakingChanges.adoc
-Cf. <xmqqttjazwwa.fsf@gitster.g>,
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+-
+-GIT
+----
+-Part of the linkgit:git[1] suite
+This document as been moved to linkgit:gitbreaking-changes[7].
## Documentation/Makefile ##
@@ Documentation/meson.build: manpages = {
'gitcli.adoc' : 7,
'gitcore-tutorial.adoc' : 7,
'gitcredentials.adoc' : 7,
+
+ ## command-list.txt ##
+@@ command-list.txt: git-whatchanged ancillaryinterrogators complete
+ git-worktree mainporcelain
+ git-write-tree plumbingmanipulators
+ gitattributes userinterfaces
++gitbreaking-changes guide
+ gitcli userinterfaces
+ gitcore-tutorial guide
+ gitcredentials guide
2: a6626aafac8 ! 3: c8983aced71 doc: gitbreaking-changes: replace msg-ids with URLs
@@ Commit message
† 1: 57ec9254 (docs: introduce document to announce breaking changes, 2024-06-14)
- Note that we have to URL encode two msg-ids:
+ Note that we have to URL encode this msg-id:
CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com
+
+ Lore can handle it just fine, but asciidoctor(1) cannot.
+
+ Worse yet, this msg-id can be handled by asciidoctor(1) but not by
+ asciidoc:
+
CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com
- Lore can handle them just fine, but asciidoctor(1) cannot.
+ URL encoding does not help. So compromise by linking to the only
+ second-level reply:
+
+ CACBZZX65Kbp8N9X9UtBfJca7U1T0m-VtKZeKM5q9mhyCR7dwGg@mail.gmail.com
+
+ Which properly quotes the first message. So no loss of fidelity in
+ my opinion.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
@@ Documentation/gitbreaking-changes.adoc: applications and forges.
-<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
+Cf. https://lore.kernel.org/git/2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com,
+https://lore.kernel.org/git/20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain,
-+https://lore.kernel.org/git/CA%2BEOSBncr%3D4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE%2BDiUQ@mail.gmail.com/.
++https://lore.kernel.org/git/CACBZZX65Kbp8N9X9UtBfJca7U1T0m-VtKZeKM5q9mhyCR7dwGg@mail.gmail.com.
* The default storage format for references in newly created repositories will
be changed from "files" to "reftable". The "reftable" format provides
@@ Documentation/gitbreaking-changes.adoc: The command will be removed.
be removed in Git 3.0.
+
-cf. <xmqqa59i45wc.fsf@gitster.g>
-+cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
++cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
@@ Documentation/gitbreaking-changes.adoc: those features with newer alternatives.
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+Cf. https://lore.kernel.org/git/xmqqttjazwwa.fsf@gitster.g,
-+https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
-+https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
++ https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
++ https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
GIT
---
3: 75397436eb9 = 4: 46f08bb65d9 doc: gitbreaking-changes: add note about living document
4: 9d14f13664f < -: ----------- doc: git: mention gitbreaking-changes(7)
-: ----------- > 5: 85fe7ebe89e doc: gitbreaking-changes: move new-items discussion to the end
base-commit: 0f8e75abebff0877cae681a3d5ff31ac47f54220
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 1/5] doc: BreakingChanges: transform to a manpage
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
2026-10-08 19:46 ` D. Ben Knoble
2026-10-08 19:27 ` [PATCH v2 2/5] doc: gitbreaking-changes: create from BreakingChanges kristofferhaugsbakk
` (3 subsequent siblings)
4 siblings, 1 reply; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
The breaking changes document is not a regular Git documentation page.
That means that you cannot navigate to the doc with git(1), i.e. with:
git help BreakingChanges
You instead have to download the Git project source. Or go to
git-scm.com.[1] Then you get this disclaimer:[2]
This information is specific to the Git project
Please note that this information is only relevant to you if you
plan on contributing to the Git project itself. It is in no shape or
form required reading for regular Git users.
But this document is relevant to *all* Git users. Everyone should have
as easy access to it as the other doc and guide pages.
To that end, let’s move the text to a new manpage
gitbreaking-changes(7) in two steps:
1. Transform this document without renaming it (this step)
2. Rename it to gitbreaking-changes(7). But resurrect BreakingChanges in
order to add a line linking to the new manpage (We wouldn’t want to
break any readers)
Just do the minimal changes for the new format. Also demote the first
section to the second level, i.e. make “Introduction” the same level
as “Procedure’.
Step two is for the next commit.
† 1: https://git-scm.com/docs/BreakingChanges.html
† 2: Which I first mentioned in 098230f7 (you-still-use-that??: help the
user help themselves, 2025-09-17), footnote #1.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/BreakingChanges.adoc | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/Documentation/BreakingChanges.adoc b/Documentation/BreakingChanges.adoc
index 73bb939359c..c6b974b6d8c 100644
--- a/Documentation/BreakingChanges.adoc
+++ b/Documentation/BreakingChanges.adoc
@@ -1,4 +1,19 @@
-= Upcoming breaking changes
+gitbreaking-changes(7)
+======================
+
+NAME
+----
+gitbreaking-changes - Breaking changes for upcoming Git 3.0
+
+SYNOPSIS
+--------
+*
+
+DESCRIPTION
+-----------
+*
+
+== Introduction: Upcoming breaking changes
The Git project aims to ensure backwards compatibility to the best extent
possible. Minor releases will not break backwards compatibility unless there is
@@ -357,3 +372,7 @@ almost no users of any of the commands anymore.
Cf. <xmqqttjazwwa.fsf@gitster.g>,
<xmqqleeubork.fsf@gitster.g>,
<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+
+GIT
+---
+Part of the linkgit:git[1] suite
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 2/5] doc: gitbreaking-changes: create from BreakingChanges
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 1/5] doc: BreakingChanges: transform " kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 3/5] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
` (2 subsequent siblings)
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
We can rename to gitbreaking-changes(7) now that we have changed to
the required format in the preceding commit.
But we also need to keep `BreakingChanges.adoc` in order to point to
the new document. That way old links and whatnot are still serviceable.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/BreakingChanges.adoc | 379 +------------------------
Documentation/Makefile | 1 +
Documentation/gitbreaking-changes.adoc | 378 ++++++++++++++++++++++++
Documentation/meson.build | 1 +
command-list.txt | 1 +
5 files changed, 382 insertions(+), 378 deletions(-)
create mode 100644 Documentation/gitbreaking-changes.adoc
diff --git a/Documentation/BreakingChanges.adoc b/Documentation/BreakingChanges.adoc
index c6b974b6d8c..d35850a08e4 100644
--- a/Documentation/BreakingChanges.adoc
+++ b/Documentation/BreakingChanges.adoc
@@ -1,378 +1 @@
-gitbreaking-changes(7)
-======================
-
-NAME
-----
-gitbreaking-changes - Breaking changes for upcoming Git 3.0
-
-SYNOPSIS
---------
-*
-
-DESCRIPTION
------------
-*
-
-== Introduction: Upcoming breaking changes
-
-The Git project aims to ensure backwards compatibility to the best extent
-possible. Minor releases will not break backwards compatibility unless there is
-a very strong reason to do so, like for example a security vulnerability.
-
-Regardless of that, due to the age of the Git project, it is only natural to
-accumulate a backlog of backwards-incompatible changes that will eventually be
-required to keep the project aligned with a changing world. These changes fall
-into several categories:
-
-* Changes to long established defaults.
-* Concepts that have been replaced with a superior design.
-* Concepts, commands, configuration or options that have been lacking in major
- ways and that cannot be fixed and which will thus be removed without any
- replacement.
-
-Explicitly not included in this list are fixes to minor bugs that may cause a
-change in user-visible behavior.
-
-The Git project irregularly releases breaking versions that deliberately break
-backwards compatibility with older versions. This is done to ensure that Git
-remains relevant, safe and maintainable going forward. The release cadence of
-breaking versions is typically measured in multiple years. We had the following
-major breaking releases in the past:
-
-* Git 1.6.0, released in August 2008.
-* Git 2.0, released in May 2014.
-
-We use <major>.<minor> release numbers these days, starting from Git 2.0. For
-future releases, our plan is to increment <major> in the release number when we
-make the next breaking release. Before Git 2.0, the release numbers were
-1.<major>.<minor> with the intention to increment <major> for "usual" breaking
-releases, reserving the jump to Git 2.0 for really large backward-compatibility
-breaking changes.
-
-The intent of this document is to track upcoming deprecations for future
-breaking releases. Furthermore, this document also tracks what will _not_ be
-deprecated. This is done such that the outcome of discussions document both
-when the discussion favors deprecation, but also when it rejects a deprecation.
-
-Items should have a clear summary of the reasons why we do or do not want to
-make the described change that can be easily understood without having to read
-the mailing list discussions. If there are alternatives to the changed feature,
-those alternatives should be pointed out to our users.
-
-All items should be accompanied by references to relevant mailing list threads
-where the deprecation was discussed. These references use message-IDs, which
-can visited via
-
- https://lore.kernel.org/git/$message_id/
-
-to see the message and its surrounding discussion. Such a reference is there to
-make it easier for you to find how the project reached consensus on the
-described item back then.
-
-This is a living document as the environment surrounding the project changes
-over time. If circumstances change, an earlier decision to deprecate or change
-something may need to be revisited from time to time. So do not take items on
-this list to mean "it is settled, do not waste our time bringing it up again".
-
-== Procedure
-
-Discussing the desire to make breaking changes, declaring that breaking
-changes are made at a certain version boundary, and recording these
-decisions in this document, are necessary but not sufficient.
-Because such changes are expected to be numerous, and the design and
-implementation of them are expected to span over time, they have to
-be deployable trivially at such a version boundary, prepared over long
-time.
-
-The breaking changes MUST be guarded with the a compile-time switch,
-WITH_BREAKING_CHANGES, to help this process. When built with it,
-the resulting Git binary together with its documentation would
-behave as if these breaking changes slated for the next big version
-boundary are already in effect. We also have a CI job to exercise
-the work-in-progress version of Git with these breaking changes.
-
-
-== Git 3.0
-
-The following subsections document upcoming breaking changes for Git 3.0. There
-is no planned release date for this breaking version yet.
-
-Proposed changes and removals only include items which are "ready" to be done.
-In other words, this is not supposed to be a wishlist of features that should
-be changed to or replaced in case the alternative was implemented already.
-
-=== Changes
-
-* The default hash function for new repositories will be changed from "sha1"
- to "sha256". SHA-1 has been deprecated by NIST in 2011 and is nowadays
- recommended against in FIPS 140-2 and similar certifications. Furthermore,
- there are practical attacks on SHA-1 that weaken its cryptographic properties:
-+
- ** The SHAppening (2015). The first demonstration of a practical attack
- against SHA-1 with 2^57 operations.
- ** SHAttered (2017). Generation of two valid PDF files with 2^63 operations.
- ** Birthday-Near-Collision (2019). This attack allows for chosen prefix
- attacks with 2^68 operations.
- ** Shambles (2020). This attack allows for chosen prefix attacks with 2^63
- operations.
-+
-While we have protections in place against known attacks, it is expected
-that more attacks against SHA-1 will be found by future research. Paired
-with the ever-growing capability of hardware, it is only a matter of time
-before SHA-1 will be considered broken completely. We want to be prepared
-and will thus change the default hash algorithm to "sha256" for newly
-initialized repositories.
-+
-An important requirement for this change is that the ecosystem is ready to
-support the "sha256" object format. This includes popular Git libraries,
-applications and forges.
-+
-There is no plan to deprecate the "sha1" object format at this point in time.
-+
-Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
-<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
-<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
-
-* The default storage format for references in newly created repositories will
- be changed from "files" to "reftable". The "reftable" format provides
- multiple advantages over the "files" format:
-+
- ** It is impossible to store two references that only differ in casing on
- case-insensitive filesystems with the "files" format. This issue is common
- on Windows and macOS platforms. As the "reftable" backend does not use
- filesystem paths to encode reference names this problem goes away.
- ** Similarly, macOS normalizes path names that contain unicode characters,
- which has the consequence that you cannot store two names with unicode
- characters that are encoded differently with the "files" backend. Again,
- this is not an issue with the "reftable" backend.
- ** Deleting references with the "files" backend requires Git to rewrite the
- complete "packed-refs" file. In large repositories with many references
- this file can easily be dozens of megabytes in size, in extreme cases it
- may be gigabytes. The "reftable" backend uses tombstone markers for
- deleted references and thus does not have to rewrite all of its data.
- ** Repository housekeeping with the "files" backend typically performs
- all-into-one repacks of references. This can be quite expensive, and
- consequently housekeeping is a tradeoff between the number of loose
- references that accumulate and slow down operations that read references,
- and compressing those loose references into the "packed-refs" file. The
- "reftable" backend uses geometric compaction after every write, which
- amortizes costs and ensures that the backend is always in a
- well-maintained state.
- ** Operations that write multiple references at once are not atomic with the
- "files" backend. Consequently, Git may see in-between states when it reads
- references while a reference transaction is in the process of being
- committed to disk.
- ** Writing many references at once is slow with the "files" backend because
- every reference is created as a separate file. The "reftable" backend
- significantly outperforms the "files" backend by multiple orders of
- magnitude.
- ** The reftable backend uses a binary format with prefix compression for
- reference names. As a result, the format uses less space compared to the
- "packed-refs" file.
-+
-Users that get immediate benefit from the "reftable" backend could continue to
-opt-in to the "reftable" format manually by setting the "init.defaultRefFormat"
-config. But defaults matter, and we think that overall users will have a better
-experience with less platform-specific quirks when they use the new backend by
-default.
-+
-A prerequisite for this change is that the ecosystem is ready to support the
-"reftable" format. Most importantly, alternative implementations of Git like
-JGit, libgit2 and Gitoxide need to support it.
-
-* In new repositories, the default branch name will be `main`. We have been
- warning that the default name will change since 675704c74dd (init:
- provide useful advice about init.defaultBranch, 2020-12-11). The new name
- matches the default branch name used in new repositories by many of the
- big Git forges.
-
-* Git will require Rust as a mandatory part of the build process. While Git
- already started to adopt Rust in Git 2.49, all parts written in Rust are
- optional for the time being. This includes:
-+
- ** The Rust wrapper around libgit.a that is part of "contrib/" and which has
- been introduced in Git 2.49.
- ** Subsystems that have an alternative implementation in Rust to test
- interoperability between our C and Rust codebase.
- ** Newly written features that are not mission critical for a fully functional
- Git client.
-+
-These changes are meant as test balloons to allow distributors of Git to prepare
-for Rust becoming a mandatory part of the build process. There will be multiple
-milestones for the introduction of Rust:
-+
---
-1. Initially, with Git 2.52, support for Rust will be auto-detected by Meson and
- disabled in our Makefile so that the project can sort out the initial
- infrastructure.
-2. In Git 2.55, both build systems will default-enable support for Rust.
- Consequently, builds will break by default if Rust is not available on the
- build host. The use of Rust can still be explicitly disabled via build
- flags.
-3. In Git 3.0, the build options will be removed and support for Rust is
- mandatory.
---
-+
-You can explicitly ask both Meson and our Makefile-based system to enable Rust
-by saying `meson configure -Drust=enabled` and `make WITH_RUST=YesPlease`,
-respectively.
-+
-The Git project will declare the last version before Git 3.0 to be a long-term
-support release. This long-term release will receive important bug fixes for at
-least four release cycles and security fixes for six release cycles. The Git
-project will hand over maintainership of the long-term release to distributors
-in case they need to extend the life of that long-term release even further.
-Details of how this long-term release will be handed over to the community will
-be discussed once the Git project decides to stop officially supporting it.
-+
-We will evaluate the impact on downstream distributions before making Rust
-mandatory in Git 3.0. If we see that the impact on downstream distributions
-would be significant, we may decide to defer this change to a subsequent minor
-release. This evaluation will also take into account our own experience with
-how painful it is to keep Rust an optional component.
-
-* The default value of `safe.bareRepository` will change from `all` to
- `explicit`. It is all too easy for an attacker to trick a user into cloning a
- repository that contains an embedded bare repository with malicious hooks
- configured. If the user enters that subdirectory and runs any Git command, Git
- discovers the bare repository and the hooks fire. The user does not even need
- to run a Git command explicitly: many shell prompts run `git status` in the
- background to display branch and dirty state information, and `git status` in
- turn may invoke the fsmonitor hook if so configured, making the user
- vulnerable the moment they `cd` into the directory. The `safe.bareRepository`
- configuration variable was introduced in 8959555cee (setup_git_directory():
- add an owner check for the top-level directory, 2022-03-02) with a default of
- `all` to preserve backwards compatibility.
-+
-Changing the default to `explicit` means that Git will refuse to work with bare
-repositories that are discovered implicitly by walking up the directory tree.
-Bare repositories specified explicitly via the `--git-dir` command-line option
-or the `GIT_DIR` environment variable continue to work regardless of this
-setting. Repositories that look like a `.git` directory, a worktree, or a
-submodule directory are also unaffected.
-+
-Users who rely on implicit discovery of bare repositories can restore the
-previous behavior by setting `safe.bareRepository=all` in their global or
-system configuration.
-
-=== Removals
-
-* Support for grafting commits has long been superseded by git-replace(1).
- Grafts are inferior to replacement refs:
-+
- ** Grafts are a local-only mechanism and cannot be shared across
- repositories.
- ** Grafts can lead to hard-to-diagnose problems when transferring objects
- between repositories.
-+
-The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
-info/grafts as outdated, 2014-03-05) and will be removed.
-+
-Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
-
-* The git-pack-redundant(1) command can be used to remove redundant pack files.
- The subcommand is unusably slow and the reason why nobody reports it as a
- performance bug is suspected to be the absence of users. We have nominated
- the command for removal and have started to emit a user-visible warning in
- c3b58472be (pack-redundant: gauge the usage before proposing its removal,
- 2020-08-25) whenever the command is executed.
-+
-So far there was a single complaint about somebody still using the command, but
-that complaint did not cause us to reverse course. On the contrary, we have
-doubled down on the deprecation and starting with 4406522b76 (pack-redundant:
-escalate deprecation warning to an error, 2023-03-23), the command dies unless
-the user passes the `--i-still-use-this` option.
-+
-There have not been any subsequent complaints, so this command will finally be
-removed.
-+
-Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
- <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
- <20230323204047.GA9290@coredump.intra.peff.net>,
-
-* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
- and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
- the repository configuration.
-+
-The mechanism has originally been introduced in f170e4b39d ([PATCH] fetch/pull:
-short-hand notation for remote repositories., 2005-07-16) and was superseded by
-6687f8fea2 ([PATCH] Use .git/remote/origin, not .git/branches/origin.,
-2005-08-20), where we switched from ".git/branches/" to ".git/remotes/". That
-commit already mentions an upcoming deprecation of the ".git/branches/"
-directory, and starting with a1d4aa7424 (Add repository-layout document.,
-2005-09-01) we have also marked this layout as deprecated. Eventually we also
-started to migrate away from ".git/remotes/" in favor of config-based remotes,
-and we have marked the directory as legacy in 3d3d282146 (Documentation:
-Grammar correction, wording fixes and cleanup, 2011-08-23)
-+
-As our documentation mentions, these directories are unlikely to be used in
-modern repositories and most users aren't even aware of these mechanisms. They
-have been deprecated for almost 20 years and 14 years respectively, and we are
-not aware of any active users that have complained about this deprecation.
-Furthermore, the ".git/branches/" directory is nowadays misleadingly named and
-may cause confusion as "branches" are almost exclusively used in the context of
-references.
-+
-These features will be removed.
-
-* Support for "--stdin" option in the "name-rev" command was
- deprecated (and hidden from the documentation) in the Git 2.40
- timeframe, in preference to its synonym "--annotate-stdin". Git 3.0
- removes the support for "--stdin" altogether.
-
-* The git-whatchanged(1) command has outlived its usefulness more than
- 10 years ago, and takes more keystrokes to type than its rough
- equivalent `git log --raw`. We have nominated the command for
- removal, have changed the command to refuse to work unless the
- `--i-still-use-this` option is given, and asked the users to report
- when they do so.
-+
-The command will be removed.
-
-* Support for `core.commentString=auto` has been deprecated and will
- be removed in Git 3.0.
-+
-cf. <xmqqa59i45wc.fsf@gitster.g>
-
-* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
- removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
- out in favor of using plain files using the textual representation of
- symbolic refs.
-+
-Symbolic references were initially always stored as a symbolic link. This was
-changed in 9b143c6e15 (Teach update-ref about a symbolic ref stored in a
-textfile., 2005-09-25), where a new textual symref format was introduced to
-store those symbolic refs in a plain file. In 9f0bb90d16
-(core.prefersymlinkrefs: use symlinks for .git/HEAD, 2006-05-02), the Git
-project switched the default to use the textual symrefs in favor of symbolic
-links.
-+
-The migration away from symbolic links has happened almost 20 years ago by now,
-and there is no known reason why one should prefer them nowadays. Furthermore,
-symbolic links are not supported on some platforms.
-+
-Note that only the writing side for such symbolic links is deprecated. Reading
-such symbolic links is still supported for now.
-
-== Superseded features that will not be deprecated
-
-Some features have gained newer replacements that aim to improve the design in
-certain ways. The fact that there is a replacement does not automatically mean
-that the old way of doing things will eventually be removed. This section tracks
-those features with newer alternatives.
-
-* The features git-checkout(1) offers are covered by the pair of commands
- git-restore(1) and git-switch(1). Because the use of git-checkout(1) is still
- widespread, and it is not expected that this will change anytime soon, all
- three commands will stay.
-+
-This decision may get revisited in case we ever figure out that there are
-almost no users of any of the commands anymore.
-+
-Cf. <xmqqttjazwwa.fsf@gitster.g>,
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
-
-GIT
----
-Part of the linkgit:git[1] suite
+This document as been moved to linkgit:gitbreaking-changes[7].
diff --git a/Documentation/Makefile b/Documentation/Makefile
index f8dea4b3953..8b0390ac0fc 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -49,6 +49,7 @@ MAN5_TXT += gitprotocol-v2.adoc
MAN5_TXT += gitrepository-layout.adoc
MAN5_TXT += gitweb.conf.adoc
+MAN7_TXT += gitbreaking-changes.adoc
MAN7_TXT += gitcli.adoc
MAN7_TXT += gitcore-tutorial.adoc
MAN7_TXT += gitcredentials.adoc
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
new file mode 100644
index 00000000000..c6b974b6d8c
--- /dev/null
+++ b/Documentation/gitbreaking-changes.adoc
@@ -0,0 +1,378 @@
+gitbreaking-changes(7)
+======================
+
+NAME
+----
+gitbreaking-changes - Breaking changes for upcoming Git 3.0
+
+SYNOPSIS
+--------
+*
+
+DESCRIPTION
+-----------
+*
+
+== Introduction: Upcoming breaking changes
+
+The Git project aims to ensure backwards compatibility to the best extent
+possible. Minor releases will not break backwards compatibility unless there is
+a very strong reason to do so, like for example a security vulnerability.
+
+Regardless of that, due to the age of the Git project, it is only natural to
+accumulate a backlog of backwards-incompatible changes that will eventually be
+required to keep the project aligned with a changing world. These changes fall
+into several categories:
+
+* Changes to long established defaults.
+* Concepts that have been replaced with a superior design.
+* Concepts, commands, configuration or options that have been lacking in major
+ ways and that cannot be fixed and which will thus be removed without any
+ replacement.
+
+Explicitly not included in this list are fixes to minor bugs that may cause a
+change in user-visible behavior.
+
+The Git project irregularly releases breaking versions that deliberately break
+backwards compatibility with older versions. This is done to ensure that Git
+remains relevant, safe and maintainable going forward. The release cadence of
+breaking versions is typically measured in multiple years. We had the following
+major breaking releases in the past:
+
+* Git 1.6.0, released in August 2008.
+* Git 2.0, released in May 2014.
+
+We use <major>.<minor> release numbers these days, starting from Git 2.0. For
+future releases, our plan is to increment <major> in the release number when we
+make the next breaking release. Before Git 2.0, the release numbers were
+1.<major>.<minor> with the intention to increment <major> for "usual" breaking
+releases, reserving the jump to Git 2.0 for really large backward-compatibility
+breaking changes.
+
+The intent of this document is to track upcoming deprecations for future
+breaking releases. Furthermore, this document also tracks what will _not_ be
+deprecated. This is done such that the outcome of discussions document both
+when the discussion favors deprecation, but also when it rejects a deprecation.
+
+Items should have a clear summary of the reasons why we do or do not want to
+make the described change that can be easily understood without having to read
+the mailing list discussions. If there are alternatives to the changed feature,
+those alternatives should be pointed out to our users.
+
+All items should be accompanied by references to relevant mailing list threads
+where the deprecation was discussed. These references use message-IDs, which
+can visited via
+
+ https://lore.kernel.org/git/$message_id/
+
+to see the message and its surrounding discussion. Such a reference is there to
+make it easier for you to find how the project reached consensus on the
+described item back then.
+
+This is a living document as the environment surrounding the project changes
+over time. If circumstances change, an earlier decision to deprecate or change
+something may need to be revisited from time to time. So do not take items on
+this list to mean "it is settled, do not waste our time bringing it up again".
+
+== Procedure
+
+Discussing the desire to make breaking changes, declaring that breaking
+changes are made at a certain version boundary, and recording these
+decisions in this document, are necessary but not sufficient.
+Because such changes are expected to be numerous, and the design and
+implementation of them are expected to span over time, they have to
+be deployable trivially at such a version boundary, prepared over long
+time.
+
+The breaking changes MUST be guarded with the a compile-time switch,
+WITH_BREAKING_CHANGES, to help this process. When built with it,
+the resulting Git binary together with its documentation would
+behave as if these breaking changes slated for the next big version
+boundary are already in effect. We also have a CI job to exercise
+the work-in-progress version of Git with these breaking changes.
+
+
+== Git 3.0
+
+The following subsections document upcoming breaking changes for Git 3.0. There
+is no planned release date for this breaking version yet.
+
+Proposed changes and removals only include items which are "ready" to be done.
+In other words, this is not supposed to be a wishlist of features that should
+be changed to or replaced in case the alternative was implemented already.
+
+=== Changes
+
+* The default hash function for new repositories will be changed from "sha1"
+ to "sha256". SHA-1 has been deprecated by NIST in 2011 and is nowadays
+ recommended against in FIPS 140-2 and similar certifications. Furthermore,
+ there are practical attacks on SHA-1 that weaken its cryptographic properties:
++
+ ** The SHAppening (2015). The first demonstration of a practical attack
+ against SHA-1 with 2^57 operations.
+ ** SHAttered (2017). Generation of two valid PDF files with 2^63 operations.
+ ** Birthday-Near-Collision (2019). This attack allows for chosen prefix
+ attacks with 2^68 operations.
+ ** Shambles (2020). This attack allows for chosen prefix attacks with 2^63
+ operations.
++
+While we have protections in place against known attacks, it is expected
+that more attacks against SHA-1 will be found by future research. Paired
+with the ever-growing capability of hardware, it is only a matter of time
+before SHA-1 will be considered broken completely. We want to be prepared
+and will thus change the default hash algorithm to "sha256" for newly
+initialized repositories.
++
+An important requirement for this change is that the ecosystem is ready to
+support the "sha256" object format. This includes popular Git libraries,
+applications and forges.
++
+There is no plan to deprecate the "sha1" object format at this point in time.
++
+Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
+<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
+<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
+
+* The default storage format for references in newly created repositories will
+ be changed from "files" to "reftable". The "reftable" format provides
+ multiple advantages over the "files" format:
++
+ ** It is impossible to store two references that only differ in casing on
+ case-insensitive filesystems with the "files" format. This issue is common
+ on Windows and macOS platforms. As the "reftable" backend does not use
+ filesystem paths to encode reference names this problem goes away.
+ ** Similarly, macOS normalizes path names that contain unicode characters,
+ which has the consequence that you cannot store two names with unicode
+ characters that are encoded differently with the "files" backend. Again,
+ this is not an issue with the "reftable" backend.
+ ** Deleting references with the "files" backend requires Git to rewrite the
+ complete "packed-refs" file. In large repositories with many references
+ this file can easily be dozens of megabytes in size, in extreme cases it
+ may be gigabytes. The "reftable" backend uses tombstone markers for
+ deleted references and thus does not have to rewrite all of its data.
+ ** Repository housekeeping with the "files" backend typically performs
+ all-into-one repacks of references. This can be quite expensive, and
+ consequently housekeeping is a tradeoff between the number of loose
+ references that accumulate and slow down operations that read references,
+ and compressing those loose references into the "packed-refs" file. The
+ "reftable" backend uses geometric compaction after every write, which
+ amortizes costs and ensures that the backend is always in a
+ well-maintained state.
+ ** Operations that write multiple references at once are not atomic with the
+ "files" backend. Consequently, Git may see in-between states when it reads
+ references while a reference transaction is in the process of being
+ committed to disk.
+ ** Writing many references at once is slow with the "files" backend because
+ every reference is created as a separate file. The "reftable" backend
+ significantly outperforms the "files" backend by multiple orders of
+ magnitude.
+ ** The reftable backend uses a binary format with prefix compression for
+ reference names. As a result, the format uses less space compared to the
+ "packed-refs" file.
++
+Users that get immediate benefit from the "reftable" backend could continue to
+opt-in to the "reftable" format manually by setting the "init.defaultRefFormat"
+config. But defaults matter, and we think that overall users will have a better
+experience with less platform-specific quirks when they use the new backend by
+default.
++
+A prerequisite for this change is that the ecosystem is ready to support the
+"reftable" format. Most importantly, alternative implementations of Git like
+JGit, libgit2 and Gitoxide need to support it.
+
+* In new repositories, the default branch name will be `main`. We have been
+ warning that the default name will change since 675704c74dd (init:
+ provide useful advice about init.defaultBranch, 2020-12-11). The new name
+ matches the default branch name used in new repositories by many of the
+ big Git forges.
+
+* Git will require Rust as a mandatory part of the build process. While Git
+ already started to adopt Rust in Git 2.49, all parts written in Rust are
+ optional for the time being. This includes:
++
+ ** The Rust wrapper around libgit.a that is part of "contrib/" and which has
+ been introduced in Git 2.49.
+ ** Subsystems that have an alternative implementation in Rust to test
+ interoperability between our C and Rust codebase.
+ ** Newly written features that are not mission critical for a fully functional
+ Git client.
++
+These changes are meant as test balloons to allow distributors of Git to prepare
+for Rust becoming a mandatory part of the build process. There will be multiple
+milestones for the introduction of Rust:
++
+--
+1. Initially, with Git 2.52, support for Rust will be auto-detected by Meson and
+ disabled in our Makefile so that the project can sort out the initial
+ infrastructure.
+2. In Git 2.55, both build systems will default-enable support for Rust.
+ Consequently, builds will break by default if Rust is not available on the
+ build host. The use of Rust can still be explicitly disabled via build
+ flags.
+3. In Git 3.0, the build options will be removed and support for Rust is
+ mandatory.
+--
++
+You can explicitly ask both Meson and our Makefile-based system to enable Rust
+by saying `meson configure -Drust=enabled` and `make WITH_RUST=YesPlease`,
+respectively.
++
+The Git project will declare the last version before Git 3.0 to be a long-term
+support release. This long-term release will receive important bug fixes for at
+least four release cycles and security fixes for six release cycles. The Git
+project will hand over maintainership of the long-term release to distributors
+in case they need to extend the life of that long-term release even further.
+Details of how this long-term release will be handed over to the community will
+be discussed once the Git project decides to stop officially supporting it.
++
+We will evaluate the impact on downstream distributions before making Rust
+mandatory in Git 3.0. If we see that the impact on downstream distributions
+would be significant, we may decide to defer this change to a subsequent minor
+release. This evaluation will also take into account our own experience with
+how painful it is to keep Rust an optional component.
+
+* The default value of `safe.bareRepository` will change from `all` to
+ `explicit`. It is all too easy for an attacker to trick a user into cloning a
+ repository that contains an embedded bare repository with malicious hooks
+ configured. If the user enters that subdirectory and runs any Git command, Git
+ discovers the bare repository and the hooks fire. The user does not even need
+ to run a Git command explicitly: many shell prompts run `git status` in the
+ background to display branch and dirty state information, and `git status` in
+ turn may invoke the fsmonitor hook if so configured, making the user
+ vulnerable the moment they `cd` into the directory. The `safe.bareRepository`
+ configuration variable was introduced in 8959555cee (setup_git_directory():
+ add an owner check for the top-level directory, 2022-03-02) with a default of
+ `all` to preserve backwards compatibility.
++
+Changing the default to `explicit` means that Git will refuse to work with bare
+repositories that are discovered implicitly by walking up the directory tree.
+Bare repositories specified explicitly via the `--git-dir` command-line option
+or the `GIT_DIR` environment variable continue to work regardless of this
+setting. Repositories that look like a `.git` directory, a worktree, or a
+submodule directory are also unaffected.
++
+Users who rely on implicit discovery of bare repositories can restore the
+previous behavior by setting `safe.bareRepository=all` in their global or
+system configuration.
+
+=== Removals
+
+* Support for grafting commits has long been superseded by git-replace(1).
+ Grafts are inferior to replacement refs:
++
+ ** Grafts are a local-only mechanism and cannot be shared across
+ repositories.
+ ** Grafts can lead to hard-to-diagnose problems when transferring objects
+ between repositories.
++
+The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
+info/grafts as outdated, 2014-03-05) and will be removed.
++
+Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
+
+* The git-pack-redundant(1) command can be used to remove redundant pack files.
+ The subcommand is unusably slow and the reason why nobody reports it as a
+ performance bug is suspected to be the absence of users. We have nominated
+ the command for removal and have started to emit a user-visible warning in
+ c3b58472be (pack-redundant: gauge the usage before proposing its removal,
+ 2020-08-25) whenever the command is executed.
++
+So far there was a single complaint about somebody still using the command, but
+that complaint did not cause us to reverse course. On the contrary, we have
+doubled down on the deprecation and starting with 4406522b76 (pack-redundant:
+escalate deprecation warning to an error, 2023-03-23), the command dies unless
+the user passes the `--i-still-use-this` option.
++
+There have not been any subsequent complaints, so this command will finally be
+removed.
++
+Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
+ <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
+ <20230323204047.GA9290@coredump.intra.peff.net>,
+
+* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
+ and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
+ the repository configuration.
++
+The mechanism has originally been introduced in f170e4b39d ([PATCH] fetch/pull:
+short-hand notation for remote repositories., 2005-07-16) and was superseded by
+6687f8fea2 ([PATCH] Use .git/remote/origin, not .git/branches/origin.,
+2005-08-20), where we switched from ".git/branches/" to ".git/remotes/". That
+commit already mentions an upcoming deprecation of the ".git/branches/"
+directory, and starting with a1d4aa7424 (Add repository-layout document.,
+2005-09-01) we have also marked this layout as deprecated. Eventually we also
+started to migrate away from ".git/remotes/" in favor of config-based remotes,
+and we have marked the directory as legacy in 3d3d282146 (Documentation:
+Grammar correction, wording fixes and cleanup, 2011-08-23)
++
+As our documentation mentions, these directories are unlikely to be used in
+modern repositories and most users aren't even aware of these mechanisms. They
+have been deprecated for almost 20 years and 14 years respectively, and we are
+not aware of any active users that have complained about this deprecation.
+Furthermore, the ".git/branches/" directory is nowadays misleadingly named and
+may cause confusion as "branches" are almost exclusively used in the context of
+references.
++
+These features will be removed.
+
+* Support for "--stdin" option in the "name-rev" command was
+ deprecated (and hidden from the documentation) in the Git 2.40
+ timeframe, in preference to its synonym "--annotate-stdin". Git 3.0
+ removes the support for "--stdin" altogether.
+
+* The git-whatchanged(1) command has outlived its usefulness more than
+ 10 years ago, and takes more keystrokes to type than its rough
+ equivalent `git log --raw`. We have nominated the command for
+ removal, have changed the command to refuse to work unless the
+ `--i-still-use-this` option is given, and asked the users to report
+ when they do so.
++
+The command will be removed.
+
+* Support for `core.commentString=auto` has been deprecated and will
+ be removed in Git 3.0.
++
+cf. <xmqqa59i45wc.fsf@gitster.g>
+
+* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
+ removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
+ out in favor of using plain files using the textual representation of
+ symbolic refs.
++
+Symbolic references were initially always stored as a symbolic link. This was
+changed in 9b143c6e15 (Teach update-ref about a symbolic ref stored in a
+textfile., 2005-09-25), where a new textual symref format was introduced to
+store those symbolic refs in a plain file. In 9f0bb90d16
+(core.prefersymlinkrefs: use symlinks for .git/HEAD, 2006-05-02), the Git
+project switched the default to use the textual symrefs in favor of symbolic
+links.
++
+The migration away from symbolic links has happened almost 20 years ago by now,
+and there is no known reason why one should prefer them nowadays. Furthermore,
+symbolic links are not supported on some platforms.
++
+Note that only the writing side for such symbolic links is deprecated. Reading
+such symbolic links is still supported for now.
+
+== Superseded features that will not be deprecated
+
+Some features have gained newer replacements that aim to improve the design in
+certain ways. The fact that there is a replacement does not automatically mean
+that the old way of doing things will eventually be removed. This section tracks
+those features with newer alternatives.
+
+* The features git-checkout(1) offers are covered by the pair of commands
+ git-restore(1) and git-switch(1). Because the use of git-checkout(1) is still
+ widespread, and it is not expected that this will change anytime soon, all
+ three commands will stay.
++
+This decision may get revisited in case we ever figure out that there are
+almost no users of any of the commands anymore.
++
+Cf. <xmqqttjazwwa.fsf@gitster.g>,
+<xmqqleeubork.fsf@gitster.g>,
+<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/meson.build b/Documentation/meson.build
index f4854f802d4..af436b2d5e9 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -192,6 +192,7 @@ manpages = {
'gitweb.conf.adoc' : 5,
# Category 7.
+ 'gitbreaking-changes.adoc' : 7,
'gitcli.adoc' : 7,
'gitcore-tutorial.adoc' : 7,
'gitcredentials.adoc' : 7,
diff --git a/command-list.txt b/command-list.txt
index 63ae2a67c94..1b7236a62fd 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -213,6 +213,7 @@ git-whatchanged ancillaryinterrogators complete
git-worktree mainporcelain
git-write-tree plumbingmanipulators
gitattributes userinterfaces
+gitbreaking-changes guide
gitcli userinterfaces
gitcore-tutorial guide
gitcredentials guide
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 3/5] doc: gitbreaking-changes: replace msg-ids with URLs
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 1/5] doc: BreakingChanges: transform " kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 2/5] doc: gitbreaking-changes: create from BreakingChanges kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 4/5] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 5/5] doc: gitbreaking-changes: move new-items discussion to the end kristofferhaugsbakk
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
This document has used msg-ids to reference emails since its
inception.[1] This makes the text a bit more terse, and is perhaps
also convenient for people who can use msg-ids to link to messages
in their inbox. But we should consider how convenient this is for people
in general, now that this is a more public-facing page (see previous
commit). And I suspect that most people will be forced to paste the
msg-id according to the described URL template:
https://lore.kernel.org/git/$message_id/
Let’s instead replace all of the msg-ids with complete links. That way
everyone can jump right to the discussions.
† 1: 57ec9254 (docs: introduce document to announce breaking changes, 2024-06-14)
Note that we have to URL encode this msg-id:
CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com
Lore can handle it just fine, but asciidoctor(1) cannot.
Worse yet, this msg-id can be handled by asciidoctor(1) but not by
asciidoc:
CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com
URL encoding does not help. So compromise by linking to the only
second-level reply:
CACBZZX65Kbp8N9X9UtBfJca7U1T0m-VtKZeKM5q9mhyCR7dwGg@mail.gmail.com
Which properly quotes the first message. So no loss of fidelity in
my opinion.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Notes (series):
v2:
• Fix accidental introduction of two spaces[1]
🔗 1: https://lore.kernel.org/git/ar0OltAkeTiCx81c@pks.im/#t
• Fix two other unintended space changes. I don’t know why the URLs
after [1] are aligned like that. But it makes no difference to the
output. So leave them alone.
[1]: Cf. https://lore.kernel.org/git/2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com,
• Changing the linking scheme so that the links could use the
msg-ids as text was discussed. But technical difficulties and
other concerns lead to no changes on this front.[2]
† 2: <xmqqeceaa5h9.fsf@gitster.g>
• ... but, and bad news for my linking scheme: I found out that
asciidoc(1) (shakes fist) cannot seem to manage to render this URL
as a URL:
https://lore.kernel.org/git/CA%2BEOSBncr%3D4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE%2BDiUQ@mail.gmail.com/
And, well see the commit message.
Documentation/gitbreaking-changes.adoc | 33 +++++++++++++-------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index c6b974b6d8c..2bb9f877256 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -59,15 +59,14 @@ make the described change that can be easily understood without having to read
the mailing list discussions. If there are alternatives to the changed feature,
those alternatives should be pointed out to our users.
-All items should be accompanied by references to relevant mailing list threads
-where the deprecation was discussed. These references use message-IDs, which
-can visited via
+All items should be accompanied by links to relevant mailing list threads
+where the deprecation was discussed. These links use this format:
https://lore.kernel.org/git/$message_id/
-to see the message and its surrounding discussion. Such a reference is there to
-make it easier for you to find how the project reached consensus on the
-described item back then.
+I.e. they link to the `Message-ID` of the email on the mailing
+list. These references are there to make it easier for you to find how
+the project reached consensus on the described item back then.
This is a living document as the environment surrounding the project changes
over time. If circumstances change, an earlier decision to deprecate or change
@@ -129,9 +128,9 @@ applications and forges.
+
There is no plan to deprecate the "sha1" object format at this point in time.
+
-Cf. <2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com>,
-<20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain>,
-<CA+EOSBncr=4a4d8n9xS4FNehyebpmX8JiUwCsXD47EQDE+DiUQ@mail.gmail.com>.
+Cf. https://lore.kernel.org/git/2f5de416-04ba-c23d-1e0b-83bb655829a7@zombino.com,
+https://lore.kernel.org/git/20170223155046.e7nxivfwqqoprsqj@LykOS.localdomain,
+https://lore.kernel.org/git/CACBZZX65Kbp8N9X9UtBfJca7U1T0m-VtKZeKM5q9mhyCR7dwGg@mail.gmail.com.
* The default storage format for references in newly created repositories will
be changed from "files" to "reftable". The "reftable" format provides
@@ -268,7 +267,7 @@ system configuration.
The grafting mechanism has been marked as outdated since e650d0643b (docs: mark
info/grafts as outdated, 2014-03-05) and will be removed.
+
-Cf. <20140304174806.GA11561@sigill.intra.peff.net>.
+Cf. https://lore.kernel.org/git/20140304174806.GA11561@sigill.intra.peff.net.
* The git-pack-redundant(1) command can be used to remove redundant pack files.
The subcommand is unusably slow and the reason why nobody reports it as a
@@ -286,9 +285,9 @@ the user passes the `--i-still-use-this` option.
There have not been any subsequent complaints, so this command will finally be
removed.
+
-Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
- <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
- <20230323204047.GA9290@coredump.intra.peff.net>,
+Cf. https://lore.kernel.org/git/xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com,
+https://lore.kernel.org/git/CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ%3DKAKhtpDNTvHJFuX1NA%40mail.gmail.com,
+https://lore.kernel.org/git/20230323204047.GA9290@coredump.intra.peff.net,
* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
@@ -332,7 +331,7 @@ The command will be removed.
* Support for `core.commentString=auto` has been deprecated and will
be removed in Git 3.0.
+
-cf. <xmqqa59i45wc.fsf@gitster.g>
+cf. https://lore.kernel.org/git/xmqqa59i45wc.fsf@gitster.g
* Support for `core.preferSymlinkRefs=true` has been deprecated and will be
removed in Git 3.0. Writing symbolic refs as symbolic links will be phased
@@ -369,9 +368,9 @@ those features with newer alternatives.
This decision may get revisited in case we ever figure out that there are
almost no users of any of the commands anymore.
+
-Cf. <xmqqttjazwwa.fsf@gitster.g>,
-<xmqqleeubork.fsf@gitster.g>,
-<112b6568912a6de6672bf5592c3a718e@manjaro.org>.
+Cf. https://lore.kernel.org/git/xmqqttjazwwa.fsf@gitster.g,
+ https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
+ https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
GIT
---
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 4/5] doc: gitbreaking-changes: add note about living document
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
` (2 preceding siblings ...)
2026-10-08 19:27 ` [PATCH v2 3/5] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 5/5] doc: gitbreaking-changes: move new-items discussion to the end kristofferhaugsbakk
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
This document has always stated that it is a “living document”, subject
to change. With that in mind, we should be mindful of a potentially
larger readerbase now that this is a more public-facing page. One could
imagine that someone reads this document on a released version,
disagrees with a point there, and posts feedback to the project—but this
decision could have already been reverted in the live document.[1]
Let’s add a note (admonition) following the “live document” with such
a reminder. Let’s keep it short and simple though and not go into how
to fetch the source. They can figure that out themselves.
† 1: Let’s say that someone on Git for Debian Stable reads about the
breaking changes for Git 3.0. They don’t like something about it
so they post it to the mailing list. Then the mailing list informs
them that Git 3.0 was released two years ago and that the current
document is about Git 4.0.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Documentation/gitbreaking-changes.adoc | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index 2bb9f877256..b94759260d9 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -73,6 +73,16 @@ over time. If circumstances change, an earlier decision to deprecate or change
something may need to be revisited from time to time. So do not take items on
this list to mean "it is settled, do not waste our time bringing it up again".
+[NOTE]
+--
+In case you are reading this document from a released version: this
+being a _living document_ means that you might want to consult what
+the current, development version of the document looks like in case
+anything here motivates you to post some feedback to the project.
+Because specific details you read here might have been changed in the
+development version.
+--
+
== Procedure
Discussing the desire to make breaking changes, declaring that breaking
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 5/5] doc: gitbreaking-changes: move new-items discussion to the end
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
` (3 preceding siblings ...)
2026-10-08 19:27 ` [PATCH v2 4/5] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
@ 2026-10-08 19:27 ` kristofferhaugsbakk
4 siblings, 0 replies; 25+ messages in thread
From: kristofferhaugsbakk @ 2026-10-08 19:27 UTC (permalink / raw)
To: git; +Cc: Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
The target audience for this page is expanding. That means that this
discussion about how to add new entries will not be as relevant to the
average reader. Let’s move it to the end of the page.
Suggested-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
Notes (series):
v2:
• New: <ar0OltAkeTiCx81c@pks.im>
Documentation/gitbreaking-changes.adoc | 30 ++++++++++++++------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/Documentation/gitbreaking-changes.adoc b/Documentation/gitbreaking-changes.adoc
index b94759260d9..e984c2c8ca5 100644
--- a/Documentation/gitbreaking-changes.adoc
+++ b/Documentation/gitbreaking-changes.adoc
@@ -54,20 +54,6 @@ breaking releases. Furthermore, this document also tracks what will _not_ be
deprecated. This is done such that the outcome of discussions document both
when the discussion favors deprecation, but also when it rejects a deprecation.
-Items should have a clear summary of the reasons why we do or do not want to
-make the described change that can be easily understood without having to read
-the mailing list discussions. If there are alternatives to the changed feature,
-those alternatives should be pointed out to our users.
-
-All items should be accompanied by links to relevant mailing list threads
-where the deprecation was discussed. These links use this format:
-
- https://lore.kernel.org/git/$message_id/
-
-I.e. they link to the `Message-ID` of the email on the mailing
-list. These references are there to make it easier for you to find how
-the project reached consensus on the described item back then.
-
This is a living document as the environment surrounding the project changes
over time. If circumstances change, an earlier decision to deprecate or change
something may need to be revisited from time to time. So do not take items on
@@ -382,6 +368,22 @@ Cf. https://lore.kernel.org/git/xmqqttjazwwa.fsf@gitster.g,
https://lore.kernel.org/git/xmqqleeubork.fsf@gitster.g,
https://lore.kernel.org/git/112b6568912a6de6672bf5592c3a718e@manjaro.org.
+== Adding new items
+
+Items should have a clear summary of the reasons why we do or do not want to
+make the described change that can be easily understood without having to read
+the mailing list discussions. If there are alternatives to the changed feature,
+those alternatives should be pointed out to our users.
+
+All items should be accompanied by links to relevant mailing list threads
+where the deprecation was discussed. These links use this format:
+
+ https://lore.kernel.org/git/$message_id/
+
+I.e. they link to the `Message-ID` of the email on the mailing
+list. These references are there to make it easier for you to find how
+the project reached consensus on the described item back then.
+
GIT
---
Part of the linkgit:git[1] suite
--
2.55.0.793.gc667de3f2c5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH v2 1/5] doc: BreakingChanges: transform to a manpage
2026-10-08 19:27 ` [PATCH v2 1/5] doc: BreakingChanges: transform " kristofferhaugsbakk
@ 2026-10-08 19:46 ` D. Ben Knoble
2026-10-09 8:24 ` Kristoffer Haugsbakk
0 siblings, 1 reply; 25+ messages in thread
From: D. Ben Knoble @ 2026-10-08 19:46 UTC (permalink / raw)
To: kristofferhaugsbakk
Cc: git, Kristoffer Haugsbakk, Junio C Hamano, Patrick Steinhardt
On Thu, Oct 8, 2026 at 3:38 PM <kristofferhaugsbakk@fastmail.com> wrote:
>
> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>
> The breaking changes document is not a regular Git documentation page.
> That means that you cannot navigate to the doc with git(1), i.e. with:
>
> git help BreakingChanges
>
> You instead have to download the Git project source. Or go to
> git-scm.com.[1] Then you get this disclaimer:[2]
>
> This information is specific to the Git project
>
> Please note that this information is only relevant to you if you
> plan on contributing to the Git project itself. It is in no shape or
> form required reading for regular Git users.
>
> But this document is relevant to *all* Git users. Everyone should have
> as easy access to it as the other doc and guide pages.
Sorry for not mentioning this earlier, but you can (depending on your
distribution's package?) find the document under "git --html-path" for
example
I agree that's drastically less discoverable, though, and I welcome
making it a manual in the spirit of datamodel and others.
I don't think the message needs updated, so not worth a re-roll, just
something to point out for folks that like interesting corners of Git
;) (cf. https://github.com/benknoble/Dotfiles/blob/master/links/bin/git-doc
and accompanying completion
https://github.com/benknoble/Dotfiles/blob/master/links/zshfns/_git_doc).
--
D. Ben Knoble
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 1/5] doc: BreakingChanges: transform to a manpage
2026-10-08 19:46 ` D. Ben Knoble
@ 2026-10-09 8:24 ` Kristoffer Haugsbakk
0 siblings, 0 replies; 25+ messages in thread
From: Kristoffer Haugsbakk @ 2026-10-09 8:24 UTC (permalink / raw)
To: D. Ben Knoble; +Cc: git, Junio C Hamano, Patrick Steinhardt
On Thu, Oct 8, 2026, at 21:46, D. Ben Knoble wrote:
> On Thu, Oct 8, 2026 at 3:38 PM <kristofferhaugsbakk@fastmail.com> wrote:
>>
>> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
>>
>> The breaking changes document is not a regular Git documentation page.
>> That means that you cannot navigate to the doc with git(1), i.e. with:
>>
>> git help BreakingChanges
>>
>> You instead have to download the Git project source. Or go to
>> git-scm.com.[1] Then you get this disclaimer:[2]
>>
>> This information is specific to the Git project
>>
>> Please note that this information is only relevant to you if you
>> plan on contributing to the Git project itself. It is in no shape or
>> form required reading for regular Git users.
>>
>> But this document is relevant to *all* Git users. Everyone should have
>> as easy access to it as the other doc and guide pages.
>
> Sorry for not mentioning this earlier, but you can (depending on your
> distribution's package?) find the document under "git --html-path" for
> example
That’s handy. Thanks!
I wonder why `git help help` has nothing to say about “html-path” or
“html path”.
>[snip]
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2026-10-09 8:25 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-28 10:41 [RFC PATCH 0/4] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 1/4] doc: transform breaking changes doc " kristofferhaugsbakk
2026-09-30 13:28 ` Patrick Steinhardt
2026-09-30 14:17 ` Kristoffer Haugsbakk
2026-09-30 14:28 ` Patrick Steinhardt
2026-09-28 10:41 ` [RFC PATCH 2/4] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
2026-09-30 13:28 ` Patrick Steinhardt
2026-09-30 14:09 ` Kristoffer Haugsbakk
2026-09-30 19:45 ` Junio C Hamano
2026-10-01 6:27 ` Patrick Steinhardt
2026-10-03 11:52 ` Kristoffer Haugsbakk
2026-10-03 14:10 ` Kristoffer Haugsbakk
2026-10-04 2:31 ` Junio C Hamano
2026-10-06 16:38 ` Kristoffer Haugsbakk
2026-10-06 20:33 ` Junio C Hamano
2026-09-28 10:41 ` [RFC PATCH 3/4] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
2026-09-28 10:41 ` [RFC PATCH 4/4] doc: git: mention gitbreaking-changes(7) kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 0/5] doc: move BreakingChanges to a manpage kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 1/5] doc: BreakingChanges: transform " kristofferhaugsbakk
2026-10-08 19:46 ` D. Ben Knoble
2026-10-09 8:24 ` Kristoffer Haugsbakk
2026-10-08 19:27 ` [PATCH v2 2/5] doc: gitbreaking-changes: create from BreakingChanges kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 3/5] doc: gitbreaking-changes: replace msg-ids with URLs kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 4/5] doc: gitbreaking-changes: add note about living document kristofferhaugsbakk
2026-10-08 19:27 ` [PATCH v2 5/5] doc: gitbreaking-changes: move new-items discussion to the end kristofferhaugsbakk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox