133

我将我的个人笔记本电脑用于工作和个人项目,我想将我的工作电子邮件地址用于我在工作中的提交(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_EMAIL,GIT_COMMITTER_EMAILEMAIL环境变量之一

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

有没有办法将某个存储库、项目名称等绑定到一个身份(名称、电子邮件)?人们做什么?

4

8 回答 8

146

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

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

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

于 2011-05-24T20:40:40.637 回答
60

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

本地集

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'

于 2015-10-08T19:40:07.330 回答
25

在“.git”文件夹中编辑配置文件以维护不同的用户名和电子邮件,具体取决于存储库

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

[用户]

名字=鲍勃

电子邮件 = bob@example.com

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

git config --get 用户名

git config --get user.email

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

这里 ipchat 是我的仓库名称

于 2011-06-06T09:40:21.917 回答
17

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

这就是我为我的项目所做的。我在克隆/初始化 repo 时设置了适当的标识。它不是万无一失的(如果您在弄明白之前忘记并推动了它),但它与您无法说的一样好git config --global user.email 'ILLEGAL_VALUE'

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

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

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

于 2011-05-24T20:39:45.333 回答
10

从 Git 2.13 开始,您可以includeIf在 gitconfig 中使用 git 来包含具有不同配置的文件,具体取决于您运行 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(Ubuntu 早于 18.04/Debian)或下载二进制文件并安装(Windows/其他 Linux)。

于 2017-07-14T23:09:05.563 回答
9

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

于 2011-05-24T20:40:17.003 回答
1

我非常喜欢 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

为命令创建 Git 别名identity,我们稍后会用到:

$ 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/是key的标识符

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

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

将身份添加到 Git 配置。还要对您要添加的每个身份重复此操作:

注意:这里我gitlab用来命名我的身份,但从你的问题来看,它可以是任何东西,例如:gitolitegithubwork等。

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

为存储库设置身份

如果一个新的 repo 没有关联身份,提交时会出现错误,提醒您设置它。

*** Please tell me who you are.

## parts of message skipped ##

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

在新存储库上指定您想要的身份:

$ git identity gitlab

您现在已准备好使用gitlab身份提交。

于 2020-06-13T17:21:14.430 回答
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根据需要进行替换。

现在每次你做 agit initgit clonegit 都会将此脚本复制到存储库并在任何提交完成之前执行它。如果您没有设置本地用户名,它将输出警告并且不会让您提交。

于 2019-03-19T13:58:33.720 回答