在我的~/。gitconfig,我列出我的个人电子邮件地址下[用户],因为这是我想用于Github回购。

但是,我最近也开始在工作中使用git。我公司的git回购允许我提交,但是当它发出新的变更集通知时,它说它们来自匿名,因为它不识别我的.gitconfig中的电子邮件地址——至少,这是我的理论。

是否可以在.gitconfig中指定多个[用户]定义?或者是否有其他方法覆盖特定目录的默认.gitconfig ?在我的情况下,我检查了~/worksrc/中的所有工作代码-是否有一种方法只为该目录(及其子目录)指定.gitconfig ?


当前回答

这个答案部分是受到@Saucier的帖子的启发,但我正在寻找一种自动设置user.name和user的方法。基于远程的,每回购一次的电子邮件,这比他开发的git-passport包要轻一些。也h/t @John为useConfigOnly设置。以下是我的解决方案:

.gitconfig变化:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

Post-checkout钩子应该保存到以下路径:~/.git-templates/hooks/ Post-checkout:

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

我对github和gitlab使用不同的凭据,但上面代码中的那些引用可以用你使用的任何服务替换或增强。为了让签出后钩子自动在本地为签出后的回购设置用户名和电子邮件,确保服务名称出现在远程url中,将其添加到签出后脚本中的services数组中,并在.gitconfig中为它创建一个包含该服务的用户名和电子邮件的部分。

如果远程url中没有出现任何服务名称,或者repo没有远程用户名和电子邮件将不会在本地设置。在这些情况下,用户。useConfigOnly设置将在发挥,将不允许您提交,直到用户名和电子邮件设置为回购级别,并将提示用户配置该信息。

其他回答

您可以将单个回购配置为使用覆盖全局配置的特定用户/电子邮件地址。从回购的根目录运行

git config user.name "Your Name Here"
git config user.email your@email.com

而缺省用户/电子邮件是在~/.gitconfig中配置的

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

有一个简单的解决方案似乎可以很好地避免错误。

只需从~/中删除[user]部分。如果不为每个存储库设置user.name,就不能进行任何提交。

在你的~/。Bashrc,为用户和电子邮件添加一些简单的别名:

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

在执行以下步骤之前,您必须有多个ssh密钥。这些可以使用here命令生成

步骤

转到c:\users\Your User\.ssh 触控配置 配置每个域的ssh密钥

使用gitbash去git repo。 配置用户名和名称每个回购"git config user.email="abc@gmail.com" 配置每个回购的名称。git config user.name="Mo Sh" 执行git命令。它会自动选择SSH密钥。

或者您可以在本地的.git/config文件中添加以下信息

[user]  
    name = Your Name
    email = your.email@gmail.com

只需将此添加到~/。Bash_profile在github.com的默认键之间切换

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"