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

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

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


当前回答

在阅读了许多答案后,下面是完整的步骤

如何为不同的github帐户设置多个SSH密钥

您可能需要开始检查当前保存的密钥

$ ssh-add -l

如果您决定删除之前的所有缓存键(可选,请注意这一点)

$ ssh-add -D

然后,您可以创建一个ssh pub/priv密钥链接到您希望/需要使用的每个电子邮件/帐户

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

执行这些命令后,您将创建以下文件

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

确保身份验证代理程序正在运行

$ eval `ssh-agent -s`

添加生成的键,如下所示(从~/。ssh文件夹)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

现在您可以再次检查保存的密钥

$ ssh-add -l

现在您需要将生成的公钥添加到您的github/ bickbucket服务器访问密钥

克隆每个回购到不同的文件夹

转到用户work将要工作的文件夹并执行此操作

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

看看这是怎么做的检查"。git/config"的内容

转到用户pers将工作的文件夹并执行此操作

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

看看这是怎么做的检查"。git/config"的内容

完成这些之后,你就可以通过在这两个文件夹之间切换来提交你的个人代码和工作代码了

如果你正在使用Git Bash并且需要在Windows下生成ssh密钥,请遵循以下步骤:

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows

其他回答

Windows环境

另外,如果您在系统中安装了Git Extensions -> Settings -> Global Settings,则可以修改此选项。

gitextensions-latest-release

右键单击Windows环境中的文件夹/目录以访问这些设置。

更新:如何在2.49版本中切换/维护多个设置

通过Git 2.13中的条件包含,现在可以在一台机器上用很少的工作同时拥有多个用户/电子邮件。

用户。Gitconfig有我的个人姓名和电子邮件。work-user。Gitconfig有我的工作名称和电子邮件。两个文件都位于~ path。

所以我的个人姓名/电子邮件默认适用。对于c:/work/ dir,应用的是我的工作名称/电子邮件。c:/work/github/ dir,应用我的个人姓名/邮箱。这在应用最后一个设置时起作用。

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

Gitdir区分大小写,Gitdir /i不区分大小写。

"gitdir/i:github/"将对路径中包含github的任何目录应用条件包含。

从Orr Sella的博客文章中得到一些灵感后,我写了一个预提交钩子(驻留在~/.git/templates/hooks中),它会根据本地存储库的。/.git/config中的信息设置特定的用户名和电子邮件地址:

你必须把模板目录的路径放到~/.gitconfig中:

[init]
    templatedir = ~/.git/templates

然后,每个git init或git克隆都将获得该钩子,并在下一次git提交期间应用用户数据。如果你想将钩子应用到已经存在的repo上,那么只需在repo中运行git init来重新初始化它。

这是我想出的钩子(它仍然需要一些抛光-欢迎提出建议)。 另存为

~/.git/templates/hooks/pre_commit

or

~/.git/templates/hooks/post-checkout

并确保它是可执行的:chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

编辑:

因此,我将钩子重写为Python中的钩子和命令。此外,还可以将脚本作为Git命令(Git passport)调用。此外,还可以在configfile (~/.gitpassport)中定义任意数量的id,这些id可以在提示符中选择。你可以在github.com上找到这个项目:Git -passport -一个用Python编写的Git命令和钩子,用于管理多个Git帐户/用户身份。

一个命令github账户切换

这个解决方案采用一个git别名的形式。一旦执行,当前项目用户将附加到另一个帐户

生成ssh密钥

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

将它们链接到你的GitHub / Bitbucket帐户

复制默认公钥pbcopy < ~/.ssh/id_rsa.pub 登录到你的GitHub账户 粘贴密钥在添加SSH密钥github页面 复制其他公钥pbcopy < ~/.ssh/id_rsa_pro.pub 对其他帐户重复并调整步骤2至4

步骤1。ssh密钥自动切换。

我们可以将ssh配置为根据主机使用特定的加密密钥发送。好处是同一个主机名可以有多个别名。

请看这个例子~/。ssh /配置文件:

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

Git远程配置

现在可以在git远程中使用这些别名,方法是将git@github.com改为git@github_pro。

您可以更改现有的项目远程(使用类似git remote set-url origin git@github_pro:foo/bar.git之类的东西),或者在克隆它们时直接调整它们。

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

使用别名,它变成:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

步骤2。修改git user.email

Git配置设置可以是全局的,也可以是每个项目的。在本例中,我们需要一个每个项目的设置。更改它很容易:

git config user.email 'arnaud.rinquin@wopata.com'

虽然这很容易,但这让我们对开发者产生了渴望。我们可以为此编写一个非常简单的git别名。

我们将把它添加到~/。gitconfig文件。

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

然后,我们所要做的就是git setpromail来改变我们的电子邮件仅为这个项目。

步骤3。一个命令开关?!

从默认帐户切换到使用单一无参数命令的指定帐户不是很好吗?这绝对是可能的。这个命令有两个步骤:

将当前项目远程更改为所选别名 修改当前业务群组用户。邮件配置

对于第二步,我们已经有了一个命令解决方案,但第一步要困难得多。 一个命令远程主机更改

下面是另一个git别名命令的解决方案,可以添加到~/.gitconfig中:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

这允许将所有远程服务器从一个主机更改为另一个主机(别名)。请看例子:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

把它们结合起来

现在我们只需要把这两个命令合并成一个,这很简单。看看我是如何整合比特桶主机切换的。

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

来源链接-Github

源链接-教程

只需将此添加到~/。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"