如何为不同的git远程仓库指定多个user.name和user.email?

11
我在本地机器上有一个代码仓库,该仓库有两个git远程仓库,分别为A和B。
  • 远程仓库A需要使用user.name Xuser.email Y
  • 远程仓库B需要使用user.name Zuser.email W
是否可以在git中实现这一要求?如果可以,如何操作?

2
为两个远程仓库创建两个存储库。在每个存储库中使用 git config --local 配置 user.nameuser.emailuser.nameuser.email 与远程无关。 - ElpieKay
如果您在Bitbucket和GitHub上使用不同的用户名和电子邮件地址,那该怎么办呢?您不能同时将它们作为远程存储库使用吗? - Abel Callejo
3
user.nameuser.email与远程无关,它们仅用于将提交者的姓名/电子邮件放入提交中。如果您想为不同的远程主机设置不同的授权,可以创建不同的SSH密钥,并配置SSH使用每个密钥连接到不同的远程主机。 - phd
这个回答解决了你的问题吗?如何使用不同的用户名将代码推送到GitHub? - miken32
请参见 https://dev59.com/I2855IYBdhLWcg3wpmLw。 - miken32
4个回答

2
使用Git 2.13,现在你可以有条件地包含git config,但它仅基于存储库的文件系统路径。
因此,您仍需要两个相同存储库的不同副本。您可以通过使用git worktree(一个克隆,多个工作树)来实现这一点。
然后,您可以修改您的全局配置规范,以包括特定的user.name/user.email设置的本地配置,具体取决于您当前的文件夹。
请参见pltvs(Alex Pliutau)的 "使用不同的Git电子邮件"

1

让我向大家介绍一个典型的场景:

Bob 是一名开发者,拥有一个与个人电子邮件地址相关联的个人 github 用户。Bob 在 github.com 上托管了一个私有的 dotfiles 代码库。Bob 获得 Acme 公司的工作机会,并希望与同事分享他的 dotfiles。Bob 使用雇主提供的用户名和电子邮件创建了一个公共的 dotfiles 仓库,在仅限于 Acme Corp 的企业 GitLab 服务器上托管,只能从公司网络中访问。

在这种情况下,与这些代码库交互的正确方法是在您的工作计算机上配置全局 git 配置,以使用您的工作 user.name 和 user.email:

  • git config --global user.name <工作用户名>
  • git config --global user.email <工作邮箱>
  • 在工作机器上创建一个新的密钥,用于访问您的公共Github:
    • ssh-keygen -t ed25519 -C "your-github-username:GITHUB" -f ~/.ssh/your-github-username*
  • 在浏览器中登录到公共Github帐户,并将新创建的公共密钥添加到您的帐户(位于~/.ssh/your-github-username.pub
  • 从工作机器运行:
    • git clone git@github.com:your-github-username/private-repo.git
  • 进行一个多余的测试提交,当您在浏览器中检查存储库时,您会看到提交是由您的工作user.name和user.email编写的,但成功推送到了您的存储库。
  • 登录到其他/企业Github/Gitlab帐户(可能在私有服务器上,但不总是),并创建一个没有自述文件的新空存储库。
  • 运行git remote add work git@domain.tld:work-username/repo.git
  • 使用git push -u work将其推送到您的工作存储库

现在您可以从工作仓库和个人仓库进行推送/拉取操作。不用担心提交时的用户名/电子邮件不匹配 - 实际上这并不重要。

您可以像这样重命名远程:

git remote rename origin home

git remote rename work employer

您应该定期将home合并到work,将work合并到home以协调任何差异,因为您不应该从家庭机器访问工作私有网络。

*这会向密钥添加注释,以便您记住它的用途,并允许您设置易于记忆的名称,例如您的GitHub用户名。


-1

我认为你可以通过使用--local而不是--global来实现这样的操作

A git config user.email Y git config user.name "X"

B git config user.email W git config user.name "Z"

存储在.git/config中的值是特定仓库的配置文件,而不是全局配置文件。


这是否意味着如果我要推送到远程仓库 A,我必须执行 git config,然后在推送到远程仓库 B 之前再执行另一个 git config - Abel Callejo
是的,@AbelCallejo,这不是最优解决方案。 - Charles D Pantoga

-1

假设您在gitlab中有一个帐户,用户名为usergitlab,电子邮件为email@1email@2等。同时,在github中也有一个帐户,用户名为usergithub,电子邮件为email@2email@3等。

如果您的存储库具有两个不同的URL的远程,一个用于github:org/repo,另一个用于gitlab:org/repo,并且您的本地git电子邮件是email@2,那么提交作者的名称取决于gitlabgithub中用户的名称,即分别为usergitlabusergithub


这不是一个好的答案。一个人拥有个人仓库,例如dotfiles仓库,并将其推送到公共git{lab,hub},同时还为企业git{lab,hub}服务器设置了远程连接是非常普遍的。在这种情况下,您不想将您的工作电子邮件附加到您的个人github帐户上,也不能将您的个人电子邮件帐户附加到您的工作帐户上,因为存在安全策略。在这种情况下,每个远程都有不同的用户名和电子邮件,因为您的雇主为您创建了工作用户名和电子邮件。 - Charles D Pantoga

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