【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
在~/.gitconfig
,我在[user]
我的个人电子邮件地址,因为这是我要用于Github存储库的地址。
但是,我最近也开始使用git进行工作。 我公司的git repo允许我提交,但是当它发布新变更集的公告时,它说它们来自匿名用户,因为它无法识别我的.gitconfig
的电子邮件地址-至少,这是我的理论。
是否可以在.gitconfig
指定多个[user]
定义? 还是有其他方法可以覆盖某个目录的默认.gitconfig
? 就我而言,我在~/worksrc/
签出所有工作代码-有没有一种方法可以仅为该目录(及其子目录)指定.gitconfig
?
#1楼
或者,您可以在本地.git/config
文件中添加以下信息
[user]
name = Your Name
email = your.email@gmail.com
#2楼
从Orr Sella的博客文章中获得一些启发后,我编写了一个预提交钩子(位于~/.git/templates/hooks
),该~/.git/templates/hooks
将根据本地存储库./.git/config
的信息设置特定的用户名和电子邮件地址。 ./.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
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帐户/用户身份 。
#3楼
Windows环境
如果已在系统中安装了它,则可以从Git Extensions --> Settings --> Global Settings
进行修改。
右键单击Windows环境中的文件夹/目录以访问这些设置。
#4楼
另一个选项,以获取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
除了别名,您还可以在$PATH
放置一个自定义git
可执行文件。
#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"
这些方法优于特定于存储库的.git/config
的优点是,当自定义git
程序处于活动状态时,它适用于每个git
存储库。 这样,您可以轻松地在用户/名称之间切换,而无需修改任何(共享)配置。
#5楼
如果您不想使用默认电子邮件地址( 电子邮件地址链接到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的解决方案相比,您始终必须手动设置名称和电子邮件。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3146766