覆盖已配置的用户以进行单个git提交

154

我正试图从我的工作笔记本电脑上提交项目至github.com。该笔记本已经配置为公司的git服务器。有没有一种方法可以指定不同的作者凭据进行提交,可能使用不同的配置文件或其他命令行开关?

我尝试过使用:

--author="My Name <MyNameEmail@email.com>" 

我收到了消息:

 Committer: unknown <WorkEmail@workemail.net>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

但是它仍然没有更新我在 github.com 项目中的用户名。我还有什么其他尝试的方法吗?这是否可能?


2
Git区分作者提交者。要为一个命令临时设置提交者,请使用-c user.name=Me user.email=me@example.com。要使用自定义全局配置,请参见此问题,或使用包含-c选项的shell别名。但在这种情况下,这两个选项都可能不是正确的做法 - 您需要一个每个存储库的配置。 - Robin Green
在 Git 2.22(2019 年第二季度)中,您将拥有专用设置 {author,committer}.{name,email}请参见我下面的答案 - VonC
6个回答

294

首先,作者不一定与提交者相同。Git跟踪两者。

要设置仅针对此存储库使用的姓名,您可以执行以下操作:

git config user.name "Your Name"
git config user.email "Your email"

请注意没有 --global 选项。这将仅在此存储库中设置配置。

或者,您可以仅针对单个命令执行此操作,使用 -c 选项:

git -c "user.name=Your Name" -c "user.email=Your email" commit ...

但我认为最好只使用上述的配置选项。


16
这正是我所需要的,因为我需要从共享账户(devel 服务器上的 root)提交到属于我的 Git 仓库中,而我不想让其他人看到我的姓名/电子邮件。 - andrej

77

尝试在您的git命令前添加以下内容:

git -c user.email=email@domain.fr -c user.name='Your Name'

这对于一次性操作来说是可以的,但你可能更喜欢将其保存在从git克隆的本地repo的.git/config文件中。可以通过运行git config(不带--global或--system以使其“本地化到repo”)或编辑.git/config(与~/.gitconfig相同的语法)来完成此操作。


3
谢谢!我正在与多人共享服务器,不想设定默认用户。太完美了! - horriblyUnpythonic
1
@horriblyUnpythonic 不客气 :) 你也可以在.bash_aliases中创建一个别名,或者设置一个pre-commit hook,在用户未定义时拒绝提交。 - Asenar
请注意,在相关的git命令(例如“log”或“commit”)之前,应直接在“git”后插入“-c <name>=<value>”选项。例如:“git -c log.showSignature=false log”运行“git log”,但不显示提交签名信息(有时即使您指定“--one-line”选项期望强制“git”仅输出单行,额外的签名文本行也可能是一个问题)。 - baltakatei

39

您还可以在每个Shell甚至每个命令的基础上设置环境变量GIT_COMMITTER_NAMEGIT_COMMITTER_EMAILGIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL


非常好,由于这将主要用于共享计算机环境中,因此每个会话自动清理是完美的。 - kmac
1
对我没用。在执行 git commit --amend 后,作者仍然保持不变。只有提交者改变了。 - Ondra Žižka
2
我也是这样做的 git commit --amend --author="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" - KCD
3
git commit --amend 的设计目的是不更改作者,正如 manpage 所述。解决方案是:git commit --amend --reset-author - kubanczyk

8

根据Jesse Glick在此处的回答,这里提供一个扩展实现,因为我认为他的建议是解决这个问题的最佳方法。

将以下内容添加到您的.bash_profile文件中。第一次在活动shell中运行任何git命令时,它会提示您输入用户名。然后,它将记住该用户以供所有后续运行使用。

(显然要交叉参考输入用户值以确切地获得所需的名称和电子邮件地址,用于情况语句中的各种git作者/名称值,并根据需要更新分配)

git() {
  echo "Running BETTER git..."
  if [ -z "$GIT_COMMITTER_NAME" ]; then
    while true; do
      read -p "Git User: " UNAME
      case $UNAME in
          user1 ) break;;
          user2 ) break;;
          * ) echo "Invalid User";;
      esac
    done
    GIT_COMMITTER_NAME=$UNAME
    export GIT_COMMITTER_NAME
    GIT_COMMITTER_EMAIL=$UNAME@domain.com
    export GIT_COMMITTER_EMAIL
    GIT_AUTHOR_NAME=$GIT_COMMITTER_NAME
    export GIT_AUTHOR_NAME
    GIT_AUTHOR_EMAIL=$GIT_COMMITTER_EMAIL
    export GIT_AUTHOR_EMAIL
  fi
  echo "  using git user: $GIT_AUTHOR_NAME / $GIT_AUTHOR_EMAIL"
  /usr/bin/git "$@"
}

8

我相信您能运行以下命令:

git config user.name "Your Name"
git config user.email you@example.com

针对Git的不同部分,尝试打开正在进行存储库工作的文件夹并将其连接到GitHub服务器。确保在该工作文件夹中看到.git文件夹。现在在终端/控制台/命令提示符中打开该文件夹,并通过运行我指定的命令仅更改该文件夹的用户名和电子邮件。通过更改该信息,您可能现在能够访问GitHub服务器。
请参见此处: https://help.github.com/articles/setting-your-username-in-git 另外,我相信有一种方法可以使用您的GitHub用户名和密码在命令本身中推送到远程repo,但我没有引述它,因为它对我来说无效。

5
您还可以在每个Shell或甚至每个命令的基础上设置环境变量GIT_COMMITTER_NAMEGIT_COMMITTER_EMAILGIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL
实际上,自Git 2.22(2019年第二季度)以来,您有一个新选项:引入了四个新的配置变量{author,committer}.{name,email},以在更具体的情况下覆盖user.{name,email}

查看提交 39ab4d0(2019年2月4日)由William Hubbs(``)完成。
(由Junio C Hamano -- gitster --提交4e021dc中合并,2019年3月7日)

config: 允许分别设置作者和提交者身份

author.emailauthor.namecommitter.emailcommitter.name 设置类似于 GIT_AUTHOR_*GIT_COMMITTER_* 环境变量,但用于 git config 系统。
这使得它们可以针对每个存储库单独设置。

Git 支持使用环境变量设置不同的作者和提交者信息。但是,环境变量是在 shell 中设置的,因此如果需要为不同的存储库设置不同的作者和提交者信息,则需要外部工具。

这将支持 git config 的 author.emailauthor.namecommitter.emailcommitter.name 设置,以便可以为每个存储库设置此信息。


看起来你需要设置所有6个变量,以避免Git要求你配置或用户名(使用Git 2.25.1)。 - Supernormal
@Supernormal 6?另外两个是什么?user.name和user.email吗? - VonC
GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_USER_NAME, GIT_USER_EMAIL, GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL - Supernormal
@Supernormal 哦,好的。我不知道当你使用作者和提交者名称时需要用户名。 - VonC
自己注意:这个死灵法师徽章是我获得的第10000个徽章。 - VonC

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