为所有子文件夹设置git配置值

scu*_*bbo 50 git

我知道可以设置覆盖用户级配置的每个repo配置(即/path/to/my/repo/.gitconfig覆盖~/.gitconfig).是否可以设置git配置覆盖给定文件夹的所有子文件夹的用户级设置?即,我有

|--topLevelFolder1
|--\
|   ---.gitconfig_override
|--\
|   ---childFolder1
|       \---[...]
|--\
|   ---childFolder2
|       \---[...]
Run Code Online (Sandbox Code Playgroud)

我希望定义的设置.gitconfig_override适用于childFolder1childFolder2.

我的动机如下:我有一台工作笔记本电脑,我也在业余时间用于个人项目.我的所有工作代码都嵌套在一个文件夹中.当我推动工作git repos时,我需要用我的工作角色 - 工作登录而不是名字,以及工作电子邮件.当我推送到我自己的个人(github)回购时,我想用我的真实姓名和个人电子邮件这样做.

我想到的其他可能的解决方案(和问题):

  • 为"工作"和"播放"创建单独的用户,适当地设置他们的用户级设置,并在切换上下文时以适当的用户身份登录(麻烦,加上我很容易忘记切换)
  • 创建一个脚本,在"workFolder"中搜索git repos,并添加/更新他们的.gitconfig文件以保存相应的详细信息(如果我创建一个repo并忘记在推送之前运行脚本,我将推送错误的人)
  • "hack"git,这样每次创建一个repo时,它都会检查文件路径,并在适当的情况下更新.gitconfig文件(复杂,混乱,几乎可以肯定是错误的方法 - 加上,我不会第一个线索如何去做!)

我检查了这个问题,它似乎只包含单个回购的解决方案,而不是多个.希望有人会看到错过那个问题的这个问题!

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"意味着.)

  • gitdir`条件下的斜杠(`/`)很重要。 (5认同)
  • *这* 应标记为该问题的正确答案。感谢提到“includeIf”(以及一点点试验和错误),我现在已经在我的工作 PC 上配置了一个特定的文件夹树,其中每个 Git 操作都将我标识为我的个人帐户并使用我的个人 SSH 密钥,我的个人电脑上还有一个类似的工作文件夹。同时,每个系统的其余部分在两台计算机上使用适当的电子邮件、名称和 SSH 密钥。我只希望我不止一次地赞成这个答案..(: (2认同)
  • 如果 git 只做了逻辑上的事情并在树中查找每个父目录中的“.git”目录...... (2认同)
  • @OliverPearmain 目标不是包含该文件(如果存在),而是包含该文件(如果您位于给定路径下的存储库中)。 (2认同)

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)


bar*_*hel 7

[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/configchildFolder2/.git/config:

[include]
    path = ../.gitconfig_override
Run Code Online (Sandbox Code Playgroud)

  • 好的 - 所以这解决了只在一个地方(在`../.gitconfig_override`中)定义`user.name`和`user.email`的问题,但我认为它实际上并没有回答原始问题?如果`childFolder1` 和`childFolder2` 是`parentFolder` 的子级,我正在寻找一种方法来设置`parentFolder` 中的配置值,该值可以过滤到以子文件夹为根的任何存储库。 (2认同)