根据当前路径使用不同的 .gitconfig

根据当前路径使用不同的 .gitconfig

在我的.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 修复了仍然受到影响的命令的新行为。

我认为有趣的解决方法是:

  • 根据需要与尽可能多的用户一起使用 gitsu命令行工具可以提供帮助)
  • 编写别名,例如alias gitcommit='git commit --author=$(git config user.email)' (丑陋的)
  • 将您的配置文件复制到您的 repo 本地配置中(任何配置修改都必须手动传播)
  • ~/.gitconfig通过HOME环境变量覆盖进行虚假查找。例如:HOME=~/.gitconfig/user-a/ git commit应为~/.gitconfig/user-a/.gitconfig (可能有其他副作用)

另外,如果您使用chpwdzsh 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

相关内容