我可以在.gitconfig中为自己指定多个用户吗?


753

在我的中~/.gitconfig,我在下列出了我的个人电子邮件地址[user],因为这就是我要用于Github回购协议的地址。

但是,我最近也开始使用git进行工作。我公司的git repo允许我提交,但是当它发布新变更集的公告时,它说它们来自匿名用户,因为它无法识别我的电子邮件地址.gitconfig-至少,这是我的理论。

是否可以在中指定多个[user]定义.gitconfig?还是有其他方法可以覆盖.gitconfig某个目录的默认设置?就我而言,我签入所有工作代码~/worksrc/-是否有一种方法.gitconfig只能为该目录(及其子目录)指定a ?



1
我很惊讶您的公司服务器会做到这一点-它必须更改您的承诺才能发挥作用。如果您提交本地结帐,您会看到什么用户名?
亚历克斯·布朗

1
@Alex:忘记了重要的地方-它很可能只是电子邮件通知中的名字,而实际上没有更改提交内容。
卡斯卡贝尔

1
您可以使用git-hook自动执行此重复工作:github.com/DrVanScott/git-clone-init
Henning

1
请接受以下答案:stackoverflow.com/a/43654115/482899。这是自git 2.13以来的最佳解决方案。
northtree '17

Answers:


1015

您可以将单个存储库配置为使用覆盖全局配置的特定用户/电子邮件地址。从仓库的根开始,运行

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

83
您可以在.git/config文件中看到这些设置的效果
Abizern 2010年

21
您可以使用git config --edit和手动编辑这些配置文件git config --global --edit。如果您错过了Abizern的评论,则存储库的配置文件位于<repo-root>/.git/config
罗里·奥肯

13
您还应该取消设置GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL(和* _NAME),因为它们将覆盖本地设置
ACyclic

6
有没有办法针对给定文件夹中的所有存储库而不是单个存储库执行此操作?看到这里,我的问题:stackoverflow.com/questions/21307793/...
scubbo

6
有关今天发布的更多最新解决方案,请参见下面答案Git 2.13
tejasbubane

489

从git 2.13开始,可以使用新引入的条件包含解决这个问题。

一个例子:

全局配置〜/ .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

工作特定的配置〜/ work / .gitconfig

[user]
    email = john.doe@company.tld

48
鉴于git 2.13已发布,这是最好的答案。
tejasbubane

1
假设它们没有自己的.gitconfig文件,此解决方案是否可用于包含语句中指定的子目录中的所有子目录?我会这么认为,但是到目前为止,测试还没有证明这一点。
加里

2
@Gary是的,根据我的经验和文档:“如果模式以/结尾,则会自动添加**。例如,模式foo /变为foo / **。换句话说,它以递归方式匹配“ foo”及其内部的所有内容。包括用于$ HOME /到/组内所有存储库[includeIf “gitdir:〜/到/组/”]”
托马什Janoušek

6
gitdir应包括最后的“/”。
克里斯·严

5
您可以通过git config --list在不同目录中运行来检查它是否可以递归运行。在~/work/包含git存储库的子目录中,该设置includeIf生效。请注意,在~/work/不包含git信息库的子目录中,includeIf不会执行。
NZD


55

一个命令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帐户

  1. 复制默认公钥 pbcopy < ~/.ssh/id_rsa.pub
  2. 登录到您的GitHub帐户
  3. 将密钥粘贴到add SSH keygithub页面中
  4. 复制其他公钥 pbcopy < ~/.ssh/id_rsa_pro.pub
  5. 对其他每个帐户重复并调整步骤2至4

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

我们可以根据进行配置,ssh以发送使用特定的加密密钥host。令人高兴的是,您可以为同一名称具有多个别名hostname

请参阅以下示例~/.ssh/config文件:

# 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.请一个命令开关?

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

  • 将当前项目遥控器更改为所选别名
  • 更改当前项目user.email配置

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

这是另一个添加到您的git alias命令形式的解决方案~/.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\"

源链接-教程


太好了,谢谢。我在每封电子邮件中使用一堆回购协议,所以我的setpromail别名config --global代替了(我还有其他用于设置不同电子邮件地址的别名)。有用!
michel-slm

1
对于这两个不同的帐户,我该如何使用不同的gpg密钥进行签名?我有2个github帐户的2个gpg密钥,并希望以不同的方式签名。“ git config --global user.signingkey xxxx”
hakkican

这个答案很棒。我几乎没有读过它,因为我以为我从其他答案中找到了什么。绝对值得更多投票。PS。与useConfigOnly = true其他答案结合使用时效果会更好。
steinybot

不是IdentifyFile,而是IdenfityFile。
基督教

40

Orr Sella的博客文章中获得启发后,我编写了一个预提交钩子(驻留在中~/.git/templates/hooks),该钩子将根据本地存储库中的信息来设置特定的用户名和电子邮件地址./.git/config

您必须将模板目录的路径放入您的中~/.gitconfig

[init]
    templatedir = ~/.git/templates

然后,每个git initgit clone将选择该钩子,并在下一个期间应用用户数据git commit。如果要将钩子应用于已经存在的存储库,则只需在存储库git init内部运行即可重新初始化它。

这是我想出的钩子(仍然需要打磨-欢迎提出建议)。另存为

~/.git/templates/hooks/pre_commit

要么

~/.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)调用。也可以在配置文件(~/.gitpassport)中定义任意数量的ID,这些ID 可在提示符下选择。您可以在github.com上找到该项目:git-passport-一个Git命令并用Python编写的钩子来管理多个Git帐户/用户身份


1
这个工作整齐。但是,通过使它成为签出后(而不是提交后)钩子,对我来说效果更好。我对改善此答案的建议是:1.将代码段保存为〜/ .git / templates / hooks / post-checkout并获得权限chmod +x post-checkout,2. git_remotes值是整个主机名的开头,例如git@github.com, 3. local_id值应由用户编辑为各自的名称和电子邮件地址。
Shantanu Kumar 2014年

@ShantanuKumar感谢您的评论。我按照您的建议调整了答案。也许我会很快用Python重写脚本。
Saucier 2014年

增加了对正则表达式和不带遥控器的存储库的支持。为了方便下载,所有合并在这里。正则表达式可区分同一服务上不同项目的标识。如果您git init从IDE中新建项目eclipse(例如,它不能处理交互式预提交触发器),则使用默认身份支持具有默认身份的
无源仓库很有意义-cfi

25

如果您不想使用默认电子邮件地址(指向github用户的电子邮件地址链接),则可以配置要询问的地址。如何做到这一点取决于您使用的git版本,请参见下文。

(预期的)缺点是您必须为每个存储库配置一次电子邮件地址(和名称)。因此,您不能忘记这样做。

版本<2.7.0

[user]
    name = Your name
    email = "(none)"

在您的全局配置中,~/.gitconfig如Dan Aloni在Orr Sella的博客文章中的评论中所述。尝试在存储库中进行第一次提交时,git失败,并显示一条漂亮消息:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

当电子邮件地址在本地设置时,该名称是从全局配置中获取的(消息不是很准确)。

2.7.0≤版本<2.8.0

版本低于2.7.0的行为不是预期的,并已用2.7.0修复。您仍然可以按照Orr Sella的博客文章中所述使用预提交挂钩。此解决方案也适用于其他版本,但其他解决方案不适用于该版本。

版本≥2.8.0

Dan Aloni添加了实现该行为的选项(请参阅发行说明)。结合使用:

[user]
    useConfigOnly = true

为了使其正常工作,您可能无法在全局配置中提供名称或电子邮件地址。然后,在第一次提交时,您会收到一条错误消息

fatal: user.useConfigOnly set but no name given

因此,该消息不是很有启发性,但是由于您显式设置了该选项,因此您应该知道该怎么做。与版本低于2.7.0的解决方案相比,您始终必须手动设置名称和电子邮件。


我使用这种方法几个月了,效果很好。我有多个电子邮件地址(个人,工作),并且我不想在全局gitconfig中配置一个“默认”地址。带有特殊值“(none)”的git会在每次启动新存储库时提示我提供一个有效的地址,而不是根据用户名和主机名猜测一个(这很烦人,我需要对其进行修改)。但是,最近使用Git的升级版本(2.7.0,可能更早),我发现特殊值“(无)”不再触发致命错误。相反,它将按原样使用“ John Doe <(none)>”
Zhuoyun Wei

@wzyboy:哦,你是对的。我曾经git bisect发现commit 19ce497c ...引入了这种行为。但是,与版本(2.5-2.7)无关,我可以email =在配置中使用(不带参数),它表现出与email = "(none)"旧版本相同的行为。你能确认吗?如果是这样,我将编辑答案。我只是怀疑,因为它是如此明显,而且我以前从未使用过。
约翰

email =在2.7.0中尝试过,Git仍然根据用户名和主机名猜测电子邮件地址。我现在pre-commit在Sella的博客中使用方法。我还通知谁与上前丹阿洛尼"(none)"在塞拉的帖子想法,他提出了一个补丁正式实施这是一个特点:permalink.gmane.org/gmane.comp.version-control.git/285301
倬云伟

3
从git-2.8开始:“ user.useConfigOnly”配置变量可用于强制用户始终设置user.email和user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0。 txt
rofrol

@rofrol感谢您的信息。我相应地更新了我的答案。
约翰

24

通过Git 2.13中的条件包含,现在可以在几乎不需要任何工作的情况下在一台计算机上共存多个用户/电子邮件。

user.gitconfig有我的名字和电子邮件。work-user.gitconfig有我的工作名称和电子邮件。这两个文件都在~路径中。

因此,默认情况下,我的个人名称/电子邮件适用。对于c:/work/目录,将应用我的工作名称/电子邮件。对于c:/work/github/目录,将使用我的个人名称/电子邮件。这适用于最后一次应用设置的情况。

# ~/.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其路径中的任何目录。


虽然您的回答得到了赞赏,但好的TomášJanoušek还是比您晚了20天。请考虑删除此答案。
树篱

5
@Hedge是的,我赞成他的回答,但是花了我一些时间才能在Windows上进行配置,而这正是gitdir/i帮助我的地方(他的回答没有提及)。
嬉皮

@hIpPy实现此问题的特殊方式直接适用于我的用例,并且比Tomas的回答要容易得多。我都赞成。
艾萨克·亚当斯

18

git使用多个名称/电子邮件的 另一种选择是通过git使用别名并使用该-c标志来覆盖全局和特定于存储库的配置。

例如,通过定义别名:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

要查看其是否有效,只需键入git config user.email

$ git config user.email
name@example.com

除了别名,您还可以在中放置自定义git可执行文件$PATH

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

这些方法相对于特定于存储库的优点.git/config是,git当自定义git程序处于活动状态时,它适用于每个存储库。这样,您可以轻松地在用户/名称之间切换,而无需修改任何(共享)配置。


14

git别名(以及git configs中的部分)可以解救!

添加别名(从命令行):

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 --global user.github.name "your github username"
git config --global user.github.email your@github.email

在新的或克隆的仓库中,您可以运行以下命令:

git identity github

该解决方案不是自动的,但是在全局范围内取消设置用户和电子邮件~/.gitconfig并将其设置user.useConfigOnlytrue会迫使git提醒您在每个新的或克隆的存储库中手动设置它们。

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
我喜欢您的解决方案;但是,当我取消全局设置时,它只是使用计算机的主机名进行提交,而不是让git提醒我在任何给定的存储库中设置它们:(
ENG618

12

这是在阅读许多答案之后的完整步骤

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

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

$ ssh-add -l

如果您决定在之前删除所有缓存的键(可选,请谨慎操作

$ ssh-add -D

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

$ 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 / bickbuket服务器中Acces Keys

将每个存储库克隆到不同的文件夹

转到用户工作所在的文件夹并执行此操作

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

只是看看这能检查“ .git / config”的内容

进入该文件夹,其中用户个人将工作和执行这个

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

只是看看这能检查“ .git / config”的内容

完成所有这些之后,您只需在这两个文件夹之间切换就可以提交您的个人和工作代码

如果您使用的是Git Bash,并且需要在Windows下生成ssh密钥,请按照以下步骤操作:

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


9

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

只需[user]从中删除该部分~/.gitconfig,这将防止您在未设置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'

不是很大的原因,因为您将在每个git repo中重复配置
令人生畏的

9

这个答案部分地受到@Saucier的帖子的启发,但我一直在寻找一种基于远程的自动设置user.nameuser.email基于每个回购的方式,这种方式比他开发的git-passport包轻得多。 。还可以对@John进行useConfigOnly设置。这是我的解决方案:

.gitconfig 变化:

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

结帐后挂钩,应将其保存到以下路径~/.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中,将其添加到post-checkout脚本中的services数组中,并在其中创建一个部分。您.gitconfig的用户名包含该服务的用户名和电子邮件。

如果任何服务名称都没有出现在远程URL中,或者存储库中没有远程,则不会在本地设置用户名和电子邮件。在这些情况下,该user.useConfigOnly设置将起作用,直到您在回购级别设置了用户名和电子邮件后,您才能进行提交,并提示用户配置该信息。


1
很好的解决方案。不要忘记chmod 755钩子脚本。否则,它将被复制但从未执行。
onekiloparsec

5

GIT_AUTHOR_EMAIL +本地 .bashrc

.bashrc_local:请勿跟踪此文件,仅将其放在您的工作计算机上:

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc:跟踪此文件,使其在工作计算机和家用计算机上都相同:

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

我正在使用https://github.com/technicalpickles/homesick同步我的点文件。

如果只有gitconfig会接受环境变量:git config中的Shell变量扩展


5

Windows环境

Git Extensions --> Settings --> Global Settings如果已将其安装在系统中,则可以从进行其他修改。

gitextensions-最新发布

右键单击Windows环境中的文件夹/目录以访问这些设置。 在此处输入图片说明

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


如何解决多个用户,而不仅仅是编辑他们?

@D_N更新了新的屏幕截图,其中包含用于切换设置的选项。
阿披耶特(Abhijeet)

打开本地存储库文件夹,然后从导航菜单中选择git-config,然后单击本地存储库选项卡,内容将被应用到$ local_repo_path / .git / config,如上所示。
maxwu

3

也许这是一个简单的技巧,但它很有用。只需生成2个ssh密钥,如下所示。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

同样的方法可以为个人创建一个。因此,您有2个SSH密钥,工作和公司。将work.pub,work,personal.pub,personal复制到〜/ .ssh /目录。

然后,使用以下各行创建一个shell脚本,并将其命名为crev.sh(公司反向),其内容如下。

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

同样,使用以下内容创建另一个称为prev.sh(个人反向)的对象。

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

在〜/ .bashrc中为这些脚本添加别名,如下所示

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

每当您想使用公司时,请执行crev,如果您要使用个人,请执行prev :-p。

将这些ssh密钥添加到您的GitHub帐户中。确保您之前没有生成id_rsa,因为这些脚本将覆盖id_rsa。如果您已经生成了id_rsa,请将其用于其中一个帐户。将它们复制为个人,并跳过个人密钥的生成。


1

我做了一个bash函数来处理这个问题。这是Github仓库

记录:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

只需将其添加到您的〜/ .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"

1

您也可以git commit --author "Your Name <your@email.com>"在要以其他用户身份提交的回购中提交时使用。


0

类似Rob W的答案,但是允许使用不同的ssh键,并且可以与较旧的git版本(例如,没有core.sshCommand配置)一起使用。

~/bin/git_poweruser在PATH中创建了具有可执行权限的文件:

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

每当我想以“高级用户”身份提交或推送内容时,我都会使用git_poweruser代替git。它应该可以在任何目录下工作,并且不需要在.gitconfig或中进行更改.ssh/config,至少不需要在我的目录中进行更改。


0

尽管大多数问题都回答了OP,但我只需要亲自完成此过程,甚至不用谷歌搜索就能找到最快,最简单的解决方案。简单的步骤如下:

  • 复制.gitconfg其他仓库中的现有仓库
  • 粘贴到您新添加的仓库中
  • 更改.gitconfig文件中的值,例如名称,电子邮件和用户名 [user] name = John email = john@email.net username = john133
  • 将文件名添加到.gitignore列表中,以确保您不将.gitconfig文件提交到工作仓库
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.