在我的.zshrc
档案里我有一个chpwd
功能设置GIT_CONFIG
根据当前路径的环境变量。
像这样:
update_gitconfig() {
if [[ "$(pwd | grep -Poe '^/home/user/repositories/user-A(/|$)')" != "" ]]
then
export GIT_CONFIG="$HOME/.gitconfig-A"
return
fi
if [[ "$(pwd | grep -Poe '^/home/user/repositories/user-B(/|$)')" != "" ]]
then
export GIT_CONFIG="$HOME/.gitconfig-B"
return
fi
export GIT_CONFIG="$HOME/.gitconfig-default"
}
update_gitconfig
chpwd_functions+=(update_gitconfig)
如果我运行git config --list
,它会在每个目录下显示预期的配置:
- 下面
$HOME/repositories/user-A
显示的是 的设置$HOME/.gitconfig-A
。 - 下面
$HOME/repositories/user-B
显示的是 的设置$HOME/.gitconfig-B
。 - 在其他地方,它显示来自的设置
$HOME/.gitconfig-default
。
当我运行的时候问题就开始了git commit
;它似乎没有得到设置:
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
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 'user@host.(none)')
因此,问题是:
有什么方法可以强制git commit
从文件中获取信息吗$GIT_CONFIG
?
注意:我知道我可以git config
在钩子中运行命令chpwd
来自动将本地设置应用于每个存储库,但我正在寻找一种更“优雅”的方式。
答案1
Gitv1.6.0 发布说明包含一条线索:
GIT_CONFIG, which was only documented as affecting "git config", but
actually affected all git commands, now only affects "git config".
git clone
并且 git v1.8.2 修复了仍然受到影响的命令的新行为。
我认为有趣的解决方法是:
- 根据需要与尽可能多的用户一起使用 git(
su
命令行工具可以提供帮助)。 - 编写别名,例如
alias gitcommit='git commit --author=$(git config user.email)'
(丑陋的)。 - 将您的配置文件复制到您的 repo 本地配置中(任何配置修改都必须手动传播)。
~/.gitconfig
通过HOME
环境变量覆盖进行虚假查找。例如:HOME=~/.gitconfig/user-a/ git commit
应为~/.gitconfig/user-a/.gitconfig
(可能有其他副作用)。
另外,如果您使用chpwd
zsh hook,请注意支持在多个存储库中运行的多个 zsh。
答案2
〜/ .gitconfig:
[includeIf "gitdir:~/Projects/"]
path = ~/.gitconfig_personal
[includeIf "gitdir:~/Projects/work/"]
path = ~/.gitconfig_work
〜/ gitconfig_personal:
[user]
email = [email protected]
name = User Name
〜/ gitconfig_工作:
[user]
email = [email protected]
name = User Name