我知道可以设置覆盖用户级配置的每个repo配置(即/path/to/my/repo/.gitconfig覆盖~/.gitconfig).是否可以设置git配置覆盖给定文件夹的所有子文件夹的用户级设置?即,我有
|--topLevelFolder1
|--\
| ---.gitconfig_override
|--\
| ---childFolder1
| \---[...]
|--\
| ---childFolder2
| \---[...]
Run Code Online (Sandbox Code Playgroud)
我希望定义的设置.gitconfig_override适用于childFolder1和childFolder2.
我的动机如下:我有一台工作笔记本电脑,我也在业余时间用于个人项目.我的所有工作代码都嵌套在一个文件夹中.当我推动工作git repos时,我需要用我的工作角色 - 工作登录而不是名字,以及工作电子邮件.当我推送到我自己的个人(github)回购时,我想用我的真实姓名和个人电子邮件这样做.
我想到的其他可能的解决方案(和问题):
我检查了这个问题,它似乎只包含单个回购的解决方案,而不是多个.希望有人会看到错过那个问题的这个问题!
Ayu*_*lin 41
正如NateEag的编辑所提到的,git的Conditional Includes是完美的.由于那个答案是git <2.13上的人的答案,这里有一个适用于那些拥有更新版本的人.
首先,使用要在子文件夹中生效的设置在某处创建一个新的配置文件 - 使用原始问题的文件夹,让我们说它在 ~/topLevelFolder1/.gitconfig_include
在~/.git/config,添加:
[includeIf "gitdir:~/toplevelFolder1/"]
path = ~/topLevelFolder1/.gitconfig_include
Run Code Online (Sandbox Code Playgroud)
任何子文件夹~/topLevelFolder1现在都包含配置~/toplevelFolder1/.gitconfig_include- 不需要手动更改.git/config每个子文件夹的repo.(这不会覆盖子文件夹配置中的任何内容 - 它只是添加到它,因为"include"意味着.)
Nat*_*Eag 25
编辑:Git 2.13引入了条件包含,旨在解决这个确切的问题.
我的原始答案保留在下面,为了历史的缘故(用户坚持使用旧版本的git).
====================================
根据阅读gitconfig联机帮助页,不支持您所需的确切行为.
但是,从git 1.7.12开始,Git从四个不同的源读取配置数据,其中两个源是用户特定的:
$XDG_CONFIG_HOME/git/config和~/.gitconfig.参赛作品中~/.gitconfig的覆盖项$XDG_CONFIG_HOME/git/config.
这意味着您可以存储您的个人gitconfig $XDG_CONFIG_HOME/git/config并将特定于机器的覆盖存储在其中~/.gitconfig.就像是
[user]
email = username@example.com
Run Code Online (Sandbox Code Playgroud)
在~/.gitconfig应包括您的电子邮件的情况.
请注意,如果未设置$ XDG_CONFIG_HOME,git将查找~/.config/git/config.
这对我很有用,因为我在工作机器上只有两个个人回购(我的emacs配置和我的dotfiles).如果您经常将个人回购添加到工作机器中,这对您来说可能不够好.
在这种情况下,定制包装git init,git clone将是你最好的选择.
$ PATH上名称与'git-*'匹配的任何二进制文件都可以作为git命令调用,因此您只需要一对shell脚本,使用所有传递的args调用原始命令,然后将正确的配置文件复制到.git/config.
Aja*_*y M 12
您可以使用direnv命令设置适用于所有子文件夹的环境变量.您可以在该目录层次结构中的任何位置.如果您尝试设置的git设置可以由环境变量控制,那么您很幸运.
阅读direnv基本页面http://direnv.net/为shell设置它.对于zsh来说,只需将此行粘贴在我的底部.zshrc并重新启动shell即可.
eval "$(direnv hook zsh)"
Run Code Online (Sandbox Code Playgroud)
检查您想要的git设置是否可以由环境变量控制.您似乎想要控制author.email特定的目录树,该目录树由设置控制GIT_AUTHOR_EMAIL.环境变量优先于config.这里有一个完整的环境变量git读取列表:https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables
正如,direnv的页面指定.envrc的那样,在您的情况下,在层次结构的根目录下创建一个文件topLevelFolder1
例如:
echo export GIT_AUTHOR_EMAIL=myotheremail@esp.com > .envrc
Run Code Online (Sandbox Code Playgroud)
"允许"envrc:direnv allow .就是这样!
每次跳转到层次结构时,direnv都会找到所述.envrc文件并加载它.
$ cd ~/topLevelFolder1/childFolder1/project_name
direnv: loading ../../../.envrc
direnv: export +GIT_AUTHOR_EMAIL
$ echo ${GIT_AUTHOR_EMAIL}
myotheremail@esp.com
Run Code Online (Sandbox Code Playgroud)
跳出目录结构并direnv卸载这些变量
cd ~
direnv: unloading
Run Code Online (Sandbox Code Playgroud)
将[include]在混帐配置(部分.git/config,~/.gitconfig...)是你在找什么.
[include]
path = /path/to/foo.inc ; include by absolute path
path = foo ; expand "foo" relative to the current file
path = ~/foo ; expand "foo" in your $HOME directory
Run Code Online (Sandbox Code Playgroud)
查看详细解答的问题:是否可以在.gitconfig中包含一个文件
请参阅git-config文档:http://git-scm.com/docs/git-config#_includes
编辑
加入childFolder1/.git/config并childFolder2/.git/config:
[include]
path = ../.gitconfig_override
Run Code Online (Sandbox Code Playgroud)