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

Re: git tag -h fatal error with global tag.sort config

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Sep 12, 2021, 13:27 UTC
Message-ID
<20210912132757.GC76263@szeder.dev>
In-Reply-To
<0daf6907-b472-a756-1240-4c78f8f4d37e@gmail.com>
On Sun, Sep 12, 2021 at 06:28:54PM +0700, Bagas Sanjaya wrote:
Show 23 quoted lines
> I stumbled on Debian bug report [1], and I can reproduce the bug.
> 
> In global config (~/.gitconfig), I set:
> 
> ```
> [tag]
> 	sort = creatordate
> ```
> 
> When I run `git tag -h` inside a Git repository (such as git.git), instead
> of usage summary, I got:
> 
> ```
> fatal: not a git repository, but the field 'creatordate' requires access to
> object data
> ```
> 
> But plain `git tag` works fine.
> 
> This bug occurs on v2.33.0 as well as version in the original bug report
> (v2.26.0-rc2) and v2.25.1.
> 
> [1]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=954811

Interesting. It bisects to 47bd3d0c14 (ref-filter: don't look for objects when outside of a repository, 2018-11-14), which, based on the error message, kind of makes sense, because 'git tag' uses the general ref-filter sorting facility. Now, even if 'git tag -h' is executed in a repository, since 99caeed05d (Let 'git <command> -h' show usage without a git dir, 2009-11-09) run_builtin() special-cases the '-h' option and does not call setup_git_directory(), so cmd_tag() and everything invoked from within will mistakenly think that there is no repository. And cmd_tag() parses the config before parsing the options (of course, otherwise command line options couldn't override the config), so it hits this die() before parse_options would get a change to act on the '-h' option.

Now, 'git branch' uses the same ref-filter sorting, but the equivalent 'git -c branch.sort=creatordate branch -h' command does show the usage as expected. The relevant difference between cmd_branch() and cmd_tag() is that the former special-cases the '-h' option as well just before it would call git_config(). Doing the same in cmd_tag() like in the patch below seems to fix this issue, but I'm not sure that this is the right fix.

  ---  >8  ---
diff --git a/builtin/tag.c b/builtin/tag.c
index 065b6bf093..31b8cc4600 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -485,6 +485,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 
 	setup_ref_filter_porcelain_msg();
 
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage_with_options(git_tag_usage, options);
+
 	git_config(git_tag_config, sorting_tail);
 
 	memset(&opt, 0, sizeof(opt));
Previous: Bagas SanjayaNext: Jeff King
Message 2 of 5 in “git tag -h fatal error with global tag.sort config”
  1. Bagas SanjayaSep 12, 2021
  2. SZEDER GáborSep 12, 2021
  3. Jeff KingSep 12, 2021
  4. Bagas SanjayaSep 13, 2021
  5. Bagas SanjayaOct 18, 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.