在我的 ~/.gitconfig
中,我在 [user]
下列出了我的个人电子邮件地址,因为这是我想要用于 Github 存储库的地址。
但是,我最近也开始在工作中使用 git。我公司的 git repo 允许我提交,但是当它发出新变更集的公告时,它说它们来自 Anonymous,因为它无法识别我的 .gitconfig
中的电子邮件地址 - 至少,这是我的理论。
是否可以在 .gitconfig
中指定多个 [user]
定义?或者是否有其他方法可以覆盖某个目录的默认 .gitconfig
?在我的例子中,我检查了 ~/worksrc/
中的所有工作代码 - 有没有办法只为那个目录(及其子目录)指定一个 .gitconfig
?
您可以将单个存储库配置为使用覆盖全局配置的特定用户/电子邮件地址。从 repo 的根目录运行
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
从 git 2.13 开始,可以使用新引入的 Conditional includes 解决此问题。
一个例子:
全局配置 ~/.gitconfig
[user]
name = John Doe
email = john@doe.tld
[includeIf "gitdir:~/work/"]
path = ~/work/.gitconfig
工作特定配置 ~/work/.gitconfig
[user]
email = john.doe@company.tld
请记住,[includeIf...]
应遵循顶部的默认 [user]
。
git config --list
来检查它是否以递归方式工作。在包含 git 存储库的 ~/work/
的子目录中,includeIf
生效。请注意,在不包含 git 存储库的 ~/work/
的子目录中,不会执行 includeIf
。
git config user.email
以查看它是否有效。
或者您可以在本地 .git/config
文件中添加以下信息
[user]
name = Your Name
email = your.email@gmail.com
一命令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
以根据 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@github.com
更改为 git@github_pro
在 git 遥控器中使用这些别名。
您可以更改现有项目的遥控器(使用 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 别名命令的形式出现在您的 ~/.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)
将它们全部结合起来
我们现在只需要将两个命令合二为一,这很容易。看看我是如何集成 bitbucket 主机切换的。
[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
代替(我还有其他设置别名来设置不同的电子邮件地址)。有用!
useConfigOnly = true
结合使用会更好。
从 Orr Sella's blog post 获得一些灵感后,我编写了一个预提交挂钩(位于 ~/.git/templates/hooks
中),它将根据本地存储库的 ./.git/config
中的信息设置特定的用户名和电子邮件地址:
您必须将模板目录的路径放入您的 ~/.gitconfig
:
[init]
templatedir = ~/.git/templates
然后每个 git init
或 git 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 - A Git command and hook written in Python to manage multiple Git accounts / user identities。
chmod +x post-checkout
,2. git_remotes
值是整个主机名,例如 git@github.com
、3. local_id
值应由用户编辑为各自的名称和电子邮件地址。
git init
来自 IDE 的新项目,例如 eclipse
(无法处理交互式预提交触发器),那么使用默认身份支持远程存储库是有意义的
借助 Git 2.13 中的 conditional includes,现在可以让多个用户/电子邮件共存于一台机器上,而且工作量很少。
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
的任何目录应用条件包含。
gitdir/i
帮助我的地方(他的回答没有提到)。
如果您不想拥有默认电子邮件地址 (email address links to a github user),您可以配置您希望被询问。如何做到这一点取决于您使用的 git 版本,见下文。
(预期的)缺点是您必须为每个存储库配置一次电子邮件地址(和您的姓名)。所以,你不能忘记去做。
版本 < 2.7.0
[user]
name = Your name
email = "(none)"
在您的全局配置 ~/.gitconfig
中,如 Dan Aloni 在 Orr Sella's blog post 中的评论中所述。当尝试在存储库中进行第一次提交时,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's blog post 中所述的预提交挂钩。此解决方案也适用于其他版本,但其他解决方案不适用于此版本。
版本≥2.8.0
Dan Aloni added 实现该行为的选项(请参阅 release notes)。使用它:
[user]
useConfigOnly = true
为了使其正常工作,您不得在全局配置中提供姓名或电子邮件地址。然后,在第一次提交时,您会收到一条错误消息
fatal: user.useConfigOnly set but no name given
因此该消息不是很有指导意义,但是由于您明确设置了该选项,因此您应该知道该怎么做。与 < 2.7.0 版本的解决方案相比,您始终必须手动设置名称和电子邮件
$ git config user.name "Your Name"
$ git config user.email "your@email.com"
仅在当前存储库中设置您的姓名和电子邮件。
git bisect
发现提交 19ce497c... 引入了这种行为。但是,独立于版本(2.5 - 2.7),我可以在配置中使用 email =
(不带参数),它在旧版本中显示与 email = "(none)"
相同的行为。你能证实这一点吗?如果是这样,我将编辑我的答案。我只是持怀疑态度,因为它看起来很明显,而且我以前没有使用过它。
email =
,Git 仍然根据用户名和主机名猜测电子邮件地址。我现在在 Sella 的博客中使用 pre-commit
方法。我还通知了在 Sella 的帖子中提出 "(none)"
想法的 Dan Aloni,他提交了一个补丁以正式将其作为一项功能实现:permalink.gmane.org/gmane.comp.version-control.git/285301
让 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
存储库。通过这种方式,您可以轻松地在用户/名称之间切换,而无需修改任何(共享)配置。
以下是在此处阅读许多答案后的完整步骤
如何为不同的 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/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/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows
git 别名(和 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 --global user.github.name "your github username"
git config --global user.github.email your@github.email
在新的或克隆的 repo 中,您可以运行以下命令:
git identity github
此解决方案不是自动的,但在全局 ~/.gitconfig
中取消设置用户和电子邮件并将 user.useConfigOnly
设置为 true
会强制 git 提醒您在每个新的或克隆的 repo 中手动设置它们。
git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true
这个答案的部分灵感来自@Saucier 的帖子,但我一直在寻找一种基于遥控器在每个 repo 基础上设置 user.name
和 user.email
的自动化方法,它比 git 轻一点-他开发的护照包。对于 useConfigOnly 设置,也向@John 发送 h/t。这是我的解决方案:
.gitconfig
变化:
[github]
name = <github username>
email = <github email>
[gitlab]
name = <gitlab username>
email = <gitlab email>
[init]
templatedir = ~/.git-templates
[user]
useConfigOnly = true
结帐后 hook 应保存到以下路径:~/.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
脚本中的服务数组并创建一个部分在您的 .gitconfig
中包含该服务的用户名和电子邮件。
如果远程 url 中没有出现任何服务名称,或者 repo 没有远程,则不会在本地设置用户名和电子邮件。在这些情况下,user.useConfigOnly
设置将发挥作用,在用户名和电子邮件设置在存储库级别之前不允许您进行提交,并将提示用户配置该信息。
chmod 755
挂钩脚本。否则,它将被复制但从不执行。
阅读所有答案后,这就是我的解决方案:
设想:
本地操作系统:Linux (bash)
GitHub 上的两个帐户(工作/个人)
使用不同密钥的 ssh 访问
我的工作帐户将是“主要”帐户(因此不需要自定义配置)
配置:
设置一个“假”主机,它允许我选择正确的 SSH 密钥对。在 ~/.ssh/config: # Personal GitHub account Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes “告诉” git 它应该在给定的目录子树中使用自定义配置:在 ~/ .gitconfig: # 我的个人项目 [includeIf "gitdir/i:~/REPOS/PERSONAL/"] path = ~/REPOS/PERSONAL/personal.gitconfig 最后,我的配置在 ~/REPOS/PERSONAL/personal.gitconfig: # gitconfig对于个人项目 [user] email = personalemail@example.com [url "git@github-personal"] insteadOf = git@github.com
一旦上述三个都到位,我可以像这样克隆一个个人仓库:
user@host:~/REPOS/PERSONAL$ git clone git@github.com:jmnavarrol/python-multigit.git
Cloning in 'python-multigit'...
(...)
user@host:~/REPOS/PERSONAL$ cd python-multigit && git remote -v
origin git@github-personal:jmnavarrol/python-multigit.git (fetch)
origin git@github-personal:jmnavarrol/python-multigit.git (push)
user@host:~/REPOS/PERSONAL/python-multigit$
在 ~/REPOS/PERSONAL/personal.gitconfig
处添加 url 重写...
[url "git@github-personal"]
insteadOf = git@github.com
...是允许我仅通过脚本中的 "standard" URL 引用回购,子回购(即 python-multigit itself 的情况 - 是的,有点自我推销的蹩脚尝试)冒着使用“错误” URL 的风险,因此,错误的身份验证。
我的两分钱。
Host github.com
而不是唯一标识符将允许您使用 git@github.com
就好了
有一个简单的解决方案似乎可以很好地避免错误。
只需从 ~/.gitconfig
中删除 [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'
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 会接受环境变量:Shell variable expansion in git config
视窗环境
另外,如果您已将其安装在系统中,则可以从 Git Extensions --> Settings --> Global Settings
对其进行修改。
https://i.stack.imgur.com/mdgMc.png
https://i.stack.imgur.com/SGyzn.png
也许这是一个简单的 hack,但它很有用。只需生成 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,请将其用于其中一个帐户。将它们复制为个人并跳过个人密钥的生成。
在执行以下步骤之前,您必须拥有多个 ssh 密钥。这些可以使用 here 命令生成
脚步
转到 c:\users\Your User\.ssh touch config 为每个域配置 ssh 密钥
https://i.stack.imgur.com/naJg2.png
使用 gitbash 转到 git repo。为每个 repo 配置用户名和名称 "git config user.email="abc@gmail.com" 为每个 repo 配置名称 git config user.name="Mo Sh" 执行 git 命令。它会自动选择 SSH 密钥。
虽然大多数问题都回答了 OP,但我只需要自己经历这个,甚至不用谷歌搜索,我就能找到最快和最简单的解决方案。以下是简单的步骤:
从您的其他仓库复制现有的 .gitconfg
粘贴到您新添加的存储库中
更改 .gitconfig 文件中的值,例如名称、电子邮件和用户名 [用户] 名称 = John 电子邮件 = john@email.net 用户名 = john133
将文件名添加到 .gitignore 列表,以确保您不会将 .gitconfig 文件提交到您的工作仓库
您还可以在您希望以其他用户身份提交的存储库中进行提交时使用 git commit --author "Your Name <your@email.com>"
。
我制作了一个 bash 函数来处理它。 Here is the Github repo。
备案:
# 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'
类似于 Rob W's answer 的东西,但允许不同的 ssh 密钥,并且适用于较旧的 git 版本(例如没有 core.sshCommand 配置)。
我在 PATH 中创建了具有可执行权限的文件 ~/bin/git_poweruser
:
#!/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
,至少在我的目录中不需要。
只需将其添加到您的 ~/.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"
让我们重新定义规范——你只是希望能够在 git 中使用多个身份来对抗不同的组织——你只需要 2 个 oneliner:
# generate a new private public key pair for org1
email=me@org1.eu;ssh-keygen -t rsa -b 4096 -C $email -f $HOME/.ssh/id_rsa.$email
# use org1 auth in THIS shell session - Ctrl + R, type org1 in new one
email=me@org1.eu;export GIT_SSH_COMMAND="ssh -p 22 -i ~/.ssh/id_rsa.$email"
为什么我知道这是迄今为止最简单的解决方案:
# me using 9 different orgs with separate git auths dynamically
find $HOME/.ssh/id_rsa.*@* | wc -l
18
可以有多种方法来做到这一点,但我通过下面的 shell 函数来实现这一点。
函数 gitprofile() { if [[ $1 == "private" ]];那么如果 grep -q "tom@workmail.com" "/Users/tomtaylor/.gitconfig";然后回显“在 gitconfig 中找到。无需操作。”否则回显“在 gitconfig1 中找到” cp /Users/tomtaylor/.gitconfig /Users/tomtaylor/.gitconfig2 mv /Users/tomtaylor/.gitconfig1 /Users/tomtaylor/.gitconfig mv /Users/tomtaylor/.gitconfig2 /Users/tomtaylor/ .gitconfig1 fi elif [[ $1 == "public" ]];然后如果 grep -q "tom@gmail.com" "/Users/tomtaylor/.gitconfig";然后回显“在 gitconfig 中找到。无需操作。”否则回显“在 gitconfig1 中找到” cp /Users/tomtaylor/.gitconfig /Users/tomtaylor/.gitconfig2 mv /Users/tomtaylor/.gitconfig1 /Users/tomtaylor/.gitconfig mv /Users/tomtaylor/.gitconfig2 /Users/tomtaylor/ .gitconfig1 文件 }
像调用它一样,
gitprofile“公共”->这将切换到带有 tom@gmail.com
的配置文件,并且
gitprofile“私人”->这将切换到 tom@workmail.com
。
根据您当前的终端偏好,将此函数添加到您的 ~/.bash_profile 或 ~/.zshrc 中。重新启动终端或只编译脚本
~/.bash_profile
使功能有效。希望能帮助到你 !
.git/config
文件中查看这些设置的效果git config --edit
和git config --global --edit
手动编辑这些配置文件。如果您错过了 Abizern 的 comment,存储库的配置文件位于<repo-root>/.git/config
。Git 2.13
的更多最新解决方案,请参阅 this answer below。