git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 0/4] Add helpful advice about init.defaultBranch

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Nov 24, 2020, 15:07 UTC
Message-ID
<pull.921.v3.git.git.1606230450.gitgitgadget@gmail.com>
In-Reply-To
<pull.921.v2.git.git.1606173607.gitgitgadget@gmail.com>

It is our designated intention [https://sfconservancy.org/news/2020/jun/23/gitbranchname/] to "to explore changing the name of the first branch created automatically for new repositories away from ‘master’". Further, we promised that we "will minimize disruption for Git's users and will include appropriate deprecation periods".

To that end, we first clarify git init's documentation (a lightly edited version of Junio's patch [https://lore.kernel.org/git/xmqqd00a36wc.fsf@gitster.c.googlers.com]), and then introduce a message giving advice to users running git init that the fall-back for init.defaultBranch is subject to change, and how to override Git's fall-back manually.

The beauty of this patch series, if I may say so, is that it does not commit us to any concrete plan, but opens the door for all options regarding the default branch name.

Changes since v2:
 * git branch -m <initial> <renamed> now works, too
 * The config setting advice.defaultBranchName was introduced to allow
   suppressing this warning specifically
 * The advice now first talks about the current default branch name, then
   how to suppress the advice, and only then explains how to override the
   default branch name (and that that will also prevent the message from
   being shown)
Changes since v1:
 * Grammar fix
 * Reworded advice and commit messages
 * test_create_repo already respected GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME,
   but now does so more obviously
 * Allowed git branch -m <name> to rename unborn branches, so that the
   advice actually works
Johannes Schindelin (4):
  init: document `init.defaultBranch` better
  branch -m: allow renaming a yet-unborn branch
  get_default_branch_name(): prepare for showing some advice
  init: provide useful advice about init.defaultBranch
 Documentation/git-init.txt | 11 +++++++----
 advice.c                   |  1 +
 advice.h                   |  1 +
 builtin/branch.c           |  4 +++-
 builtin/clone.c            |  2 +-
 builtin/init-db.c          |  8 +++++---
 refs.c                     | 29 +++++++++++++++++++++++++----
 refs.h                     |  4 ++--
 remote.c                   |  5 +++--
 t/t0001-init.sh            | 17 ++++++++++++++++-
 t/t1510-repo-setup.sh      |  2 +-
 t/test-lib-functions.sh    |  3 ++-
 12 files changed, 67 insertions(+), 20 deletions(-)
base-commit: faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-921%2Fdscho%2Finit.defaultBranch-advice-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-921/dscho/init.defaultBranch-advice-v3
Pull-Request: https://github.com/git/git/pull/921
Range-diff vs v2:
 1:  483e490349 = 1:  483e490349 init: document `init.defaultBranch` better
 2:  8de0c0eb22 ! 2:  6cbd6692c6 branch -m: allow renaming a yet-unborn branch
     @@ builtin/branch.c: static void copy_or_rename_branch(const char *oldname, const c
       			    oldref.buf, newref.buf);
       
      -	if (!copy && rename_ref(oldref.buf, newref.buf, logmsg.buf))
     -+	if (!copy && (oldname != head || !is_null_oid(&head_oid)) &&
     ++	if (!copy &&
     ++	    (!head || strcmp(oldname, head) || !is_null_oid(&head_oid)) &&
      +	    rename_ref(oldref.buf, newref.buf, logmsg.buf))
       		die(_("Branch rename failed"));
       	if (copy && copy_existing_ref(oldref.buf, newref.buf, logmsg.buf))
     @@ t/t0001-init.sh: test_expect_success 'invalid default branch name' '
       '
       
      +test_expect_success 'branch -m with the initial branch' '
     -+	git init rename-initial-branch &&
     -+	git -C rename-initial-branch branch -m renamed &&
     -+	test renamed = $(git -C rename-initial-branch symbolic-ref --short HEAD)
     ++	git init rename-initial &&
     ++	git -C rename-initial branch -m renamed &&
     ++	test renamed = $(git -C rename-initial symbolic-ref --short HEAD) &&
     ++	git -C rename-initial branch -m renamed again &&
     ++	test again = $(git -C rename-initial symbolic-ref --short HEAD)
      +'
      +
       test_done
 3:  03314f7ac6 = 3:  5fc15f7b9a get_default_branch_name(): prepare for showing some advice
 4:  bccef95391 ! 4:  87c9306877 init: provide useful advice about init.defaultBranch
     @@ Commit message
          `git init` when that value is not set.
      
          Note: two test cases in Git's test suite want to verify that the
     -    `stderr` output of `git init` is empty. With this patch, that is only
     -    true if `init.defaultBranch` is configured, so let's do exactly that in
     -    those test cases. The same reasoning applies to `test_create_repo()`.
     +    `stderr` output of `git init` is empty. It is now necessary to suppress
     +    the advice using the newly-added `advice.defaultBranchName` setting.
     +    While not strictly necessary, we also set this to `false` in
     +    `test_create_repo()`.
      
          Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
      
     + ## advice.c ##
     +@@ advice.c: static struct {
     + 	[ADVICE_AM_WORK_DIR] 				= { "amWorkDir", 1 },
     + 	[ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME] 	= { "checkoutAmbiguousRemoteBranchName", 1 },
     + 	[ADVICE_COMMIT_BEFORE_MERGE]			= { "commitBeforeMerge", 1 },
     ++	[ADVICE_DEFAULT_BRANCH_NAME]			= { "defaultBranchName", 1 },
     + 	[ADVICE_DETACHED_HEAD]				= { "detachedHead", 1 },
     + 	[ADVICE_FETCH_SHOW_FORCED_UPDATES]		= { "fetchShowForcedUpdates", 1 },
     + 	[ADVICE_GRAFT_FILE_DEPRECATED]			= { "graftFileDeprecated", 1 },
     +
     + ## advice.h ##
     +@@ advice.h: extern int advice_add_empty_pathspec;
     + 	ADVICE_AM_WORK_DIR,
     + 	ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME,
     + 	ADVICE_COMMIT_BEFORE_MERGE,
     ++	ADVICE_DEFAULT_BRANCH_NAME,
     + 	ADVICE_DETACHED_HEAD,
     + 	ADVICE_FETCH_SHOW_FORCED_UPDATES,
     + 	ADVICE_GRAFT_FILE_DEPRECATED,
     +
       ## refs.c ##
     +@@
     + #include "strvec.h"
     + #include "repository.h"
     + #include "sigchain.h"
     ++#include "advice.h"
     + 
     + /*
     +  * List of all available backends
      @@ refs.c: void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
       		strvec_pushf(prefixes, *p, len, prefix);
       }
       
      +static const char default_branch_name_advice[] = N_(
      +"Using '%s' as the name for the initial branch. This default branch name\n"
     -+"is subject to change. To configure the initial branch name to use in all\n"
     -+"of your new repositories, run:\n"
     ++"is subject to change. To suppress this warning, run:\n"
     ++"\n"
     ++"\tgit config --global advice.defaultBranchName false\n"
     ++"\n"
     ++"Alternatively, you can configure the initial branch name to use in all\n"
     ++"of your new repositories, which will also suppress this warning:\n"
      +"\n"
      +"\tgit config --global init.defaultBranch <name>\n"
      +"\n"
     -+"Common names are 'main', 'trunk' and 'development'. If you merely wish\n"
     -+"to suppress this warning, you can also use the current default branch\n"
     -+"name. The current branch can be renamed via this command:\n"
     ++"Common names are 'main', 'trunk' and 'development'. The initial branch\n"
     ++"that was created can be renamed via this command:\n"
      +"\n"
      +"\tgit branch -m <name>\n"
      +);
     @@ refs.c: char *repo_default_branch_name(struct repository *r, int quiet)
      -	if (!ret)
      +	if (!ret) {
       		ret = xstrdup("master");
     -+		if (!quiet)
     ++		if (!quiet && advice_enabled(ADVICE_DEFAULT_BRANCH_NAME))
      +			advise(_(default_branch_name_advice), ret);
      +	}
       
     @@ t/t0001-init.sh: test_expect_success 'reinit' '
       		mkdir again &&
       		cd again &&
      -		git init >out1 2>err1 &&
     -+		git -c init.defaultBranch=initial init >out1 2>err1 &&
     ++		git -c advice.defaultBranchName=false init >out1 2>err1 &&
       		git init >out2 2>err2
       	) &&
       	test_i18ngrep "Initialized empty" again/out1 &&
     @@ t/t1510-repo-setup.sh: setup_repo () {
       	sane_unset GIT_DIR GIT_WORK_TREE &&
       
      -	git init "$name" &&
     -+	git -c init.defaultBranch=repo init "$name" &&
     ++	git -c advice.defaultBranchName=false init "$name" &&
       	maybe_config "$name/.git/config" core.worktree "$worktreecfg" &&
       	maybe_config "$name/.git/config" core.bare "$barecfg" &&
       	mkdir -p "$name/sub/sub" &&
     @@ t/test-lib-functions.sh: test_create_repo () {
       		cd "$repo" || error "Cannot setup test environment"
      -		"${GIT_TEST_INSTALLED:-$GIT_EXEC_PATH}/git$X" init \
      +		"${GIT_TEST_INSTALLED:-$GIT_EXEC_PATH}/git$X" \
     -+			-c init.defaultBranch=${GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME-master} init \
     ++			-c advice.defaultBranchName=false init \
       			"--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 ||
       		error "cannot run git init -- have you built things yet?"
       		mv .git/hooks .git/hooks-disabled
-- 
gitgitgadget
Previous: Felipe ContrerasNext: Johannes Schindelin via GitGitGadget
Message 32 of 57 in “Add helpful advice about init.defaultBranch”
  1. 0/3 Add helpful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 22, 2020
  2. 2/3 get_default_branch_name(): prepare for showing some adviceJohannes Schindelin via GitGitGadget, Nov 22, 2020
  3. 1/3 init: document `init.defaultBranch` betterJohannes Schindelin via GitGitGadget, Nov 22, 2020
  4. Junio C HamanoNov 22, 2020
  5. Johannes SchindelinNov 23, 2020
  6. 3/3 init: provide useful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 22, 2020
  7. Junio C HamanoNov 22, 2020
  8. Junio C HamanoNov 23, 2020
  9. Johannes SchindelinNov 23, 2020
  10. Junio C HamanoNov 23, 2020
  11. Johannes SchindelinNov 23, 2020
  12. Junio C HamanoNov 23, 2020
  13. Johannes SchindelinNov 23, 2020
  14. Philip OakleyNov 23, 2020
  15. Johannes SchindelinNov 23, 2020
  16. 0/4 Add helpful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 23, 2020
  17. 1/4 init: document `init.defaultBranch` betterJohannes Schindelin via GitGitGadget, Nov 23, 2020
  18. 3/4 get_default_branch_name(): prepare for showing some adviceJohannes Schindelin via GitGitGadget, Nov 23, 2020
  19. 2/4 branch -m: allow renaming a yet-unborn branchJohannes Schindelin via GitGitGadget, Nov 23, 2020
  20. Junio C HamanoNov 23, 2020
  21. Johannes SchindelinNov 24, 2020
  22. Junio C HamanoNov 24, 2020
  23. 4/4 init: provide useful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 23, 2020
  24. Junio C HamanoNov 23, 2020
  25. Johannes SchindelinNov 24, 2020
  26. Junio C HamanoNov 24, 2020
  27. Johannes SchindelinDec 9, 2020
  28. Junio C HamanoDec 9, 2020
  29. Johannes SchindelinDec 10, 2020
  30. Junio C HamanoDec 10, 2020
  31. Felipe ContrerasDec 10, 2020
  32. 0/4 Add helpful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 24, 2020
  33. 1/4 init: document `init.defaultBranch` betterJohannes Schindelin via GitGitGadget, Nov 24, 2020
  34. 4/4 init: provide useful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Nov 24, 2020
  35. 2/4 branch -m: allow renaming a yet-unborn branchJohannes Schindelin via GitGitGadget, Nov 24, 2020
  36. 3/4 get_default_branch_name(): prepare for showing some adviceJohannes Schindelin via GitGitGadget, Nov 24, 2020
  37. 0/4 Add helpful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Dec 10, 2020
  38. 4/4 init: provide useful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Dec 10, 2020
  39. Felipe ContrerasDec 11, 2020
  40. Junio C HamanoDec 11, 2020
  41. Felipe ContrerasDec 11, 2020
  42. Johannes SchindelinDec 11, 2020
  43. 2/4 branch -m: allow renaming a yet-unborn branchJohannes Schindelin via GitGitGadget, Dec 10, 2020
  44. 1/4 init: document `init.defaultBranch` betterJohannes Schindelin via GitGitGadget, Dec 10, 2020
  45. Felipe ContrerasDec 11, 2020
  46. Junio C HamanoDec 11, 2020
  47. Felipe ContrerasDec 11, 2020
  48. Junio C HamanoDec 11, 2020
  49. 3/4 get_default_branch_name(): prepare for showing some adviceJohannes Schindelin via GitGitGadget, Dec 10, 2020
  50. 0/4 Add helpful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Dec 11, 2020
  51. 2/4 branch -m: allow renaming a yet-unborn branchJohannes Schindelin via GitGitGadget, Dec 11, 2020
  52. 1/4 init: document `init.defaultBranch` betterJohannes Schindelin via GitGitGadget, Dec 11, 2020
  53. 3/4 get_default_branch_name(): prepare for showing some adviceJohannes Schindelin via GitGitGadget, Dec 11, 2020
  54. 4/4 init: provide useful advice about init.defaultBranchJohannes Schindelin via GitGitGadget, Dec 11, 2020
  55. SZEDER GáborFeb 2, 2021
  56. Junio C HamanoFeb 2, 2021
  57. SZEDER GáborFeb 3, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.