在我的~/.gitconfig
中,我在[user]
下列出了我的个人电子邮件地址,因为这是我想用于Github存储库的内容。
但是,我最近也开始使用git工作。我公司的git repo允许我提交,但是当它发出新变更集的公告时,它说它们来自匿名,因为它无法识别我的.gitconfig
中的电子邮件地址 - 至少,这是我的理论。 / p>
是否可以在[user]
中指定多个.gitconfig
定义?或者是否有其他方法可以覆盖某个目录的默认.gitconfig
?在我的例子中,我查看~/worksrc/
中的所有工作代码 - 是否有办法仅为该目录(及其子目录)指定.gitconfig
?
答案 0 :(得分:857)
您可以将单个仓库配置为使用覆盖全局配置的特定用户/电子邮件地址。从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
答案 1 :(得分:300)
由于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
答案 2 :(得分:102)
或者您可以在本地.git/config
文件中添加以下信息
[user]
name = Your Name
email = your.email@gmail.com
答案 3 :(得分:38)
从Orr Sella's blog post获得灵感后,我写了一个预提交挂钩(驻留在~/.git/templates/hooks
),它会根据本地存储库中的信息设置特定的用户名和电子邮件地址。 s ./.git/config
:
您必须将模板目录的路径放入~/.gitconfig
:
[init]
templatedir = ~/.git/templates
然后,每个git init
或git clone
都会选择该挂钩并在下一个git commit
期间应用用户数据。如果您想将挂钩应用于已经存在的repos,那么只需在repo中运行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。
答案 4 :(得分:37)
一个命令github accounts switch
此解决方案采用单个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
add SSH key
github页面pbcopy < ~/.ssh/id_rsa_pro.pub
步骤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.请一个命令切换?!
使用单个无参数命令从默认帐户切换到指定帐户不是很好吗?这绝对是可能的。此命令将包含两个步骤:
我们已经有第二步的一个命令解决方案,但第一步更难。 一个命令远程主机更改
以下是另一个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)
将它们全部合并
我们现在只需将两个命令合并为一个,这很容易。看看我如何集成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\"
答案 5 :(得分:24)
如果您不想拥有默认电子邮件地址(email address links to a github user),则可以配置您想要的人。如何做到这一点取决于你使用的git版本,见下文。
(预期)缺点是您必须为每个存储库配置一次您的电子邮件地址(和您的名字)。所以,你不能忘记这样做。
[user]
name = Your name
email = "(none)"
丹·阿洛尼在Orr Sella's blog post的评论中所述的全球配置~/.gitconfig
中的。当尝试在存储库中进行第一次提交时,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)')
当在本地设置电子邮件地址时,该名称取自全局配置(该消息不完全准确)。
版本中的行为&lt; 2.7.0无意并以2.7.0修复。您仍然可以使用Orr Sella's blog post中所述的预提交挂钩。此解决方案也适用于其他版本,但其他解决方案不适用于此版本。
Dan Aloni added实现该行为的一种选择(参见release notes)。使用它:
[user]
useConfigOnly = true
要使其正常工作,您可能无法在全局配置中提供名称或电子邮件地址。然后,在第一次提交时,您会收到一条错误消息
fatal: user.useConfigOnly set but no name given
因此消息不是很有启发性,但是由于您明确设置了选项,因此您应该知道该怎么做。与版本的解决方案相反; 2.7.0,您必须手动设置名称和电子邮件。
答案 6 :(得分:17)
让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
存储库。通过这种方式,您可以轻松地在用户/名称之间切换,而无需修改任何(共享)配置。
答案 7 :(得分:12)
在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
的任何目录应用条件包含。
答案 8 :(得分:9)
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.useConfigOnly
设置为true
会强制git提醒您在每个新设置或手动设置它们克隆回购。
git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true
答案 9 :(得分: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'
答案 10 :(得分:7)
这个答案部分受到@Saucier发布的帖子的启发,但我一直在寻找一种自动方式,以每个回购为基础设置user.name
和user.email
,基于遥控器,这是一个比他开发的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
结帐后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使用不同的凭据,但上面代码中的那些引用可以使用您使用的任何服务进行替换或扩充。为了让post-checkout挂钩在结账后自动在本地为回购设置用户名和电子邮件,确保服务名称出现在远程URL中,将其添加到post-checkout
脚本中的services数组并创建.gitconfig
中包含您的用户名和该服务电子邮件的部分。
如果远程网址中没有显示任何服务名称,或者repo没有远程用户名,则不会在本地设置用户名和电子邮件。在这些情况下,user.useConfigOnly
设置将处于正常状态,在用户名和电子邮件设置为repo级别之前,将不允许您进行提交,并将提示用户配置该信息。
答案 11 :(得分:5)
2.13 r1665067
+本地GIT_AUTHOR_EMAIL
.bashrc
:不要跟踪此文件,只将其放在您的工作计算机上:
.bashrc_local
export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
:跟踪此文件,在工作和家庭计算机上使其相同:
.bashrc
我使用https://github.com/technicalpickles/homesick来同步我的点文件。
如果只有gitconfig接受环境变量:Shell variable expansion in git config
答案 12 :(得分:4)
Windows环境
如果您已将Git Extensions --> Settings --> Global Settings
安装在系统中,可以从{{1}}修改此附加内容。
右键单击Windows环境中的文件夹/目录以访问这些设置。
答案 13 :(得分:4)
在这里按照许多答案中的步骤操作后,我发现的是这里
如何为不同的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密钥
将每个存储库克隆到不同的文件夹
转到用户工作将在其中工作的文件夹并执行
$ 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”的内容
毕竟,您只需在这两个文件夹之间切换就可以提交您的个人和工作代码
答案 14 :(得分: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(Company Reverse),其中包含以下内容。
cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub
同样,使用以下内容再创建一个名为prev.sh(Personal Reverse)的内容。
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,请将其用于其中一个帐户。将它们作为个人复制并跳过生成个人密钥。
答案 15 :(得分:1)
我做了一个处理它的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'
答案 16 :(得分: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"
答案 17 :(得分:0)
类似于Rob W's answer,但允许使用不同的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
中的更改,至少不在我的更新中。
答案 18 :(得分:0)
尽管大多数问题都回答了OP,但我只需要自己经历一下,甚至不用谷歌搜索就能找到最快,最简单的解决方案。简单的步骤如下:
.gitconfg
.gitconfig
文件中的值,例如名称,电子邮件和用户名
[user]
name = John
email = john@email.net
username = john133
.gitignore
列表中,以确保您不将.gitconfig
文件提交到工作仓库答案 19 :(得分:0)
您还可以在要作为其他用户提交的回购中提交时使用git commit --author "Your Name <your@email.com>"
。
答案 20 :(得分:-1)
有多种方法可以做到这一点,但我是通过下面的 shell 函数来实现的。
function gitprofile() {
if [[ $1 == "private" ]]; then
if grep -q "tom@workmail.com" "/Users/tomtaylor/.gitconfig"; then
echo "Found in gitconfig. No action required."
else
echo "Found in 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" ]]; then
if grep -q "tom@gmail.com" "/Users/tomtaylor/.gitconfig"; then
echo "Found in gitconfig. No action required."
else
echo "Found in gitconfig1"
cp /Users/tomtaylor/.gitconfig /Users/tomtaylor/.gitconfig2
mv /Users/tomtaylor/.gitconfig1 /Users/tomtaylor/.gitconfig
mv /Users/tomtaylor/.gitconfig2 /Users/tomtaylor/.gitconfig1
fi
else
echo "Nothing matched. Have some good sleep!"
fi
}
调用它,
gitprofile "public" -> 这将切换到带有 tom@gmail.com
和
gitprofile "private" -> 这将切换到 tom@workmail.com
。
根据您当前的终端首选项,将此函数添加到您的 ~/.bash_profile 或 ~/.zshrc。重新启动终端或像
一样编译脚本 <块引用>。 ~/.bash_profile
使函数生效。希望能帮到你!
答案 21 :(得分:-1)
让我们重新定义规范——你只是希望能够在 git 中针对不同的组织使用多个身份——你只需要 2 个 oneliners:
# 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