展示Git所使用的有效/实际作者和提交者

3

是否有Git命令可以显示作者和提交者,该命令将基于应用的所有配置源用于下一个提交?

提出这个问题的原因之一是我无法在任何文件中找到 username(如下面示例中报告的提交者):

grep -r obsdev .git/config ~/.gitconfig /etc/gitconfig
# no output

显然,还有另一个配置来源。

关键是我不想了解任何可能现在或未来存在的配置来源,也不想知道它们应用的顺序和如何覆盖彼此。相反,我想让 Git 找出并显示最终/有效的作者 / 提交者值。

例子

在某些条件下(比如命令行选项 --author),Git 会在提交信息的编辑器中显示被注释掉的 Author:Committer: 字段:

# Please enter the commit message for your changes. Lines starting              
# with '#' will be ignored, and an empty message aborts the commit.             
#                                                                               
# Author:    First Last <first.last@example.com>                               
# Committer: username <username@localhost.localdomain>                              
#   
...

有没有一种方法可以在不尝试提交的情况下显示这些字段?
或者,是否可以强制Git在提交消息编辑器中提供包含“作者:”和“提交者:”字段的注释,在任何情况下都不需要使用命令行选项,即使使用默认值(而不覆盖默认值)?

您可以使用 --dry-run 标志来防止实际提交。如果不是为了提交,那您需要这个信息用来做什么? - knittl
(1) @knittl,选项--dry-run不显示作者/提交者。 (2) 的确,最终我需要确保我实际进行的提交使用正确的作者/提交者。 但是,我不想等到那时(我可能会忘记)。 我现在想确保配置正确无误。 (3) 此外,如果默认情况下使用git commit(例如,没有使用--author选项),则通常不会在提交消息编辑器中显示作者。 换句话说,大多数情况下您都不知道使用了哪个作者/提交者! 任何(新的)配置错误的主机都是问题。 - uvsmtid
1
git使用配置文件中的值(您可以通过 git config user.namegit config user.email 检索它),或者从 $GIT_{COMMITTER,AUTHOR}_{NAME,EMAIL} 环境变量中获取,如果设置了环境变量,则环境变量优先于配置值。 - knittl
@knittl,是的,它清楚地表明了另一个可能的配置源以及它是最后一个会覆盖的(就像许多其他*nix命令一样按照惯例)- 投票支持。然而,我实际上想要的是能够通过Git命令“显示”作者/提交者或者强制Git在提交编辑器中始终显示他们。 - uvsmtid
2个回答

4
您可以使用 git var 命令:
# show the author (sed is there to strip the timestamp)
git var GIT_AUTHOR_IDENT | sed -r 's/( [^ ]+){2}$//'
# and the committer
git var GIT_COMMITTER_IDENT | sed -r 's/( [^ ]+){2}$//'

但是如果您还没有配置您的姓名和电子邮件,它将打印一个警告而不是给出一个值。解决方法如下:

# show the author
git var -l | grep -E '^GIT_AUTHOR_IDENT=' | sed -r 's/^[^=]+=//;s/( [^ ]+){2}$//'
# and the committer
git var -l | grep -E '^GIT_COMMITTER_IDENT=' | sed -r 's/^[^=]+=//;s/( [^ ]+){2}$//'

谢谢 git var!它是Git数据的强大来源。 - 我从来没有听说过这个命令。而且它还可以正确地处理 GIT_{COMMITTER,AUTHOR}_{NAME,EMAIL} 环境变量。不幸的是,我只能接受一个答案。 - uvsmtid
@uvsmtid:如果有更好的答案回答了你的问题,你可以随时取消接受一个答案并重新接受另一个较晚的帖子。 - knittl
这应该是被接受的答案,除了它简单、短小和美丽之外 ;) - Richard

1
我不知道Git中有任何内置的方法来实现这一点。Git使用配置值user.nameuser.email,可以通过环境变量$GIT_{COMMITTER,AUTHOR}_{NAME,EMAIL}覆盖。
一个简单的shell脚本应该能够获取您想要的信息:
NAME=$(git config user.name)
EMAIL=$(git config user.email)

echo "Author:    ${GIT_AUTHOR_NAME:-$NAME} <${GIT_AUTHOR_EMAIL:-$EMAIL}>
echo "Committer: ${GIT_COMMITTER_NAME:-$NAME} <${GIT_COMMITTER_EMAIL:-$EMAIL}>"

另请参见git whoami


1
我在想,git config 命令难道不是我一直在寻找的吗?嗯,是的,它没有报告 NAME <EMAIL> 的组合值,因为它在提交中使用。如果环境变量覆盖配置文件中的值,则也是错误的。然而,它解决了我特定的问题,即确保文件中的值被正确地配置。有太多的情况是提交来自未配置的机器 - 重写历史以修复它们只是太麻烦了。感谢您坚持提供有价值的答案! - uvsmtid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接