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

我使用我的个人笔记本电脑进行工作和个人项目,我想使用我的工作电子邮件地址提交我的工作(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 函数,将环境设置为 工作私事,但是我非常肯定,我经常忘记切换到正确的标识,导致在错误的标识下提交。

有没有一种方法可以将某个存储库、项目名等绑定到一个标识(名称、电子邮件) ?人们都做些什么?

143719 次浏览

如果您使用 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 一个版本。奇怪。

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

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

在回购中执行该操作将设置该回购的配置,而不是全局配置。

看起来这就是你想要的,除非我误解你了。

使用“ . git”文件夹编辑配置文件,以根据存储库维护不同的用户名和电子邮件

  • 去你的仓库
  • 显示隐藏文件并转到“ . git”文件夹
  • 找到“ config”文件
  • 在 EOF 处添加以下行

[使用者]

Name = Bob

电子邮件 = bob@example.com

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

Git config ——获取 user.name

Git config ——获取 user.email

示例: 用于挖掘 D 中的那个配置文件: workspace eclipse ipchat. git config

在这里 ipchat 是我的回购名称

你需要使用下面的 本地片场命令:

本地片场

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’

从 Git 2.13开始,您可以在 gitconfig 中使用 includeIf,根据运行 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)。

一个解决方案是手动运行一个 shell 函数,它可以将我的环境设置为工作或个人,但是我非常肯定,我经常会忘记切换到正确的标识,导致在错误的标识下提交。

那正是我的问题所在。我写了一个钩子脚本,如果你有任何 github 远程和 没有定义了一个本地用户名,它会提醒你。

下面是如何设置:

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

    mkdir -p ~/.git-templates/hooks

  2. 告诉 git 在运行 走吧或 < em > clone 时,将 ~/.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

现在,每次执行 git initgit clone时,git 都会将这个脚本复制到存储库,并在提交之前执行它。如果您没有设置本地用户名,它将输出一个警告,并且不允许您提交。

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

sec rsa4096/之后的 8A5C011E4CE081A5部分是关键的 标识符

$ 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身份提交了。