如何告诉git为给定项目使用正确的身份(名称和电子邮件)?


117

我将个人笔记本电脑用于工作和个人项目,我想将工作电子邮件地址用于工作提交(gitolite),将个人电子邮件地址用于其余工作(github)。

我了解了以下所有全局或临时解决方案:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • 设置的一个GIT_AUTHOR_EMAILGIT_COMMITTER_EMAILEMAIL环境变量

一种解决方案是手动运行将我的环境设置为工作个人的shell函数,但是我可以肯定,我经常会忘记切换到正确的身份,从而导致使用错误的身份进行提交。

是否可以将某个存储库,项目名称等绑定到身份(名称,电子邮件)?人们在做什么?


1
我要求您接受答案之一。我希望其中之一一定能帮助您解决问题。
RBT

Answers:


134

git config user.email "bob@example.com"

在存储库中执行该操作将在该存储库(而不是全局)上设置配置。

似乎这就是您所追求的,除非我误读了您。


我想应该这样做。我希望同一项目有多个本地存储库,尤其是为了更轻松地在分支之间切换而不必重新编译所有内容。也许这只是一个坏的svn习惯。谢谢。
马丁·詹邦

1
@Martin-我没有真正使用git太久了,但是我的感觉是使用多个本地存储库对于git是不寻常的工作流程。即便如此,您只需要在该存储库的一个实例上运行一次,并且它是针对该存储库的生命周期设置的,所以还不错。
丹·雷,

@DanRay实际上,如果像Martin一样,本地存储库中有本地未提交的文件,则这是一种常见的设置。从一个分支切换到另一个分支不会自动重建文件。如果避免“重新编译所有内容”是目标,那么使用多个本地存储库是正确的方法。
2012年

1
git config --global user.email“ bob@example.com”添加--global使其可以在所有存储库中使用。来源:help.github.com/articles/setting-your-username-in-git
SashiOno

1
这是一项手动任务,可能会被忘记。@ dragon788和我建议自动解决方案
naitsirch '19

47

您需要使用以下本地设置命令:

本地集

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

本地获取

git config --get user.email
git config --get user.name

本地配置文件位于项目目录中.git/config

全局集

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

全球获得

git config --global --get user.email
git config --global --get user.name

全局配置文件位于主目录中~/.gitconfig

记住要用空格等引用,例如:'FirstName LastName'


23

使用“ .git”文件夹编辑配置文件,以保持不同的用户名,电子邮件取决于存储库

  • 转到您的存储库
  • 显示隐藏的文件并转到“ .git”文件夹
  • 找到“配置”文件
  • 在EOF处添加以下行

[用户]

名字=鲍勃

电子邮件= bob@example.com

以下命令显示了为该存储库设置的用户名和电子邮件。

git config-获取用户名

git config --get user.email

示例:针对我在D:\ workspace \ eclipse \ ipchat \ .git \ config中的配置文件

ipchat是我的回购名称


16

如果使用git config user.email "foo@example.com"它将绑定到您所在的当前项目。

那就是我为我的项目所做的。克隆/初始化存储库时,我设置了适当的标识。它不是万无一失的(如果您忘记并在发现软管之前先将其推开),但是它几乎可以说得很好git config --global user.email 'ILLEGAL_VALUE'

实际上,您可以设定非法价值。设置你的git config --global user.name $(perl -e 'print "x"x968;')

然后,如果您忘记设置非全局值,则会收到错误消息。

[编辑]在另一个系统上,我不得不将x的数量增加到968,以使其失败,并显示“致命:不可能长的个人标识符”。相同版本的git。奇怪。


这听起来像是个绝招,但对我却无效。提交和推送到远程gitolite均成功。
马丁·詹邦

@马丁·贾邦:奇怪。我使用的是git版本1.7.4.5-
赛斯·罗伯森,

@Martin Jambon:您也可以尝试将全局用户名/电子邮件地址设置为“ x”。某些旧版本的git拒绝太小的值。如果这不起作用,请报告您拥有的git版本/操作系统。
塞斯·罗伯逊

@Martin Jambon:尝试968“ x”,看看是否对您更好。
塞斯·罗伯逊

8

如果不使用该--global参数,它将仅设置当前项目的变量。


8

从Git 2.13开始,您可以使用 includeIf在gitconfig中以根据运行git命令的存储库的路径包括具有不同配置的文件。

由于Ubuntu 18.04随附了足够多的新Git,所以我一直~/.gitconfig很开心地使用它。

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

要使用Git 2.13,您将需要添加PPA(早于18.04 / Debian的Ubuntu)或下载二进制文件并进行安装(Windows /其他Linux)。


非常有帮助,正是我想要的。与git config core.sshCommand多个私钥结合使用,可提供完整的无缝git身份管理。
topr

0

一种解决方案是手动运行将我的环境设置为工作或个人环境的shell函数,但是我可以肯定,我经常会忘记切换到正确的身份,从而导致使用错误的身份进行提交。

那正是我的问题。我写了一个钩子脚本来警告您,如果您有任何github遥控器而不是定义的本地用户名。

设置方法如下:

  1. 创建一个目录来保存全局钩子

    mkdir -p ~/.git-templates/hooks

  2. 运行git initclone时,告诉git将所有内容复制~/.git-templates到每个项目.git目录中

    git config --global init.templatedir '~/.git-templates'

  3. 现在,~/.git-templates/hooks/pre-commit将以下行复制到并使文件可执行(不要忘记此操作,否则git不会执行它!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

如果将其他主机用于私有存储库,则必须github.com根据需要进行替换。

现在每次执行a git initgit clonegit都会将此脚本复制到存储库并在完成任何提交之前执行它。如果您尚未设置本地用户名,它将输出警告,并且不允许您提交。


0

我非常喜欢Micah Henning在有关该主题的文章中的方式(请参阅设置Git身份)。他对每个已创建/克隆的存储库应用并强制使用该身份这一事实是一个不错的方法,不要忘记每次都进行设置。

基本的git配置

在git中取消设置当前用户配置:

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

在每个新的本地存储库上强制配置身份:

$ git config --global user.useConfigOnly true

identity命令创建Git别名,我们将在以后使用:

$ git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; git config user.signingkey "$(git config user.$1.signingkey)"; :'

身份创建

使用GPG创建一个标识(使用gpggpg2取决于您在系统上获得的内容)。对您要使用的每个身份重复以下步骤。

注意:[keyid]这是创建的密钥的标识符。这里的例子:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

8A5C011E4CE081A5后面的部分sec rsa4096/是密钥的标识符

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

复制公共密钥块并将其作为GPG密钥添加到GitHub / GitProviderOfChoice设置中。

向Git配置添加身份。对要添加的每个标识也重复此操作:

注:这里我使用gitlab的名字我的身份,但是从你的问题它可以是任何东西,例如:gitolite或者githubwork等等。

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

存储库的设置标识

如果新的回购没有关联的身份,则提交时将出现错误,提示您进行设置。

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

在新的存储库上指定所需的标识:

$ git identity gitlab

您现在可以使用gitlab身份提交了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.