在git config中进行Shell变量扩展

时间:2012-06-29 12:44:02

标签: git shell

我有一个shell变量,指向我所有配置文件所在的目录。假设变量是用export RC=$HOME/rc创建的。我在配置目录中有一个全局忽略文件:~/rc/globalgitignore

我的问题是,如何在RC文件中展开.gitconfig变量?

我已经尝试了以下内容:

  • excludesfile = $RC/globalgitignore

  • excludesfile = !$RC/globalgitignore

  • excludesfile = !echo $RC/globalgitignore

  • excludesfile = !$(echo $RC/globalgitignore)

这些解决方案都不起作用。

如果我输入完整路径,这是唯一的方法:excludesfile = ~/rc/globalgitignore,但是如果将我的rc目录移动到其他位置,我必须更改路径。

3 个答案:

答案 0 :(得分:37)

你做不到。 git-config(1)不支持环境变量扩展,只支持有限的类型转换和路径扩展:

  

类型说明符可以是--int或--bool,以使git config确保变量属于给定类型并将值转换为规范形式(int的简单十进制数,a“ bool的true“或”false“字符串,或--path,执行一些路径扩展(请参阅下面的--path)。如果没有类型说明符,则对该值执行无检查或转换

--path州的文档:

  

- 路径

     

git-config将将leading~展开为$ HOME的值,将~user扩展为指定用户的主目录。设置值时此选项无效(但您可以使用命令行中的git config bla~ /让shell进行扩展)。

“{扩展”一词并未出现在git-config(1)中的任何不同背景中。那么你怎么能得到它应该的想法,因为在任何地方都没有记录这样的特征?

为了扩展环境变量,您必须自己预处理Git配置文件,即创建模板文件,然后在将文件复制到$HOME目录之前使用脚本扩展变量。

如果是关于dotfile管理,那就做所有人做的事情:把它们放在一个目录中,然后从你的$HOME添加符号链接到这个目录。

答案 1 :(得分:22)

我在配置中使用bash脚本来启用变量扩展。只需在.bashrc中导出所需的变量并在脚本中使用它:

在我的〜/ .bashrc中:

export TESTVARIABLE="hello"

在我的〜/ .gitconfig中:

[alias]
    test = !bash -c '"echo \"Value: $TESTVARIABLE\";"'

在我的bash提示符下:

bash> git test
    Value: hello 

另一种方法是在shell的rc中添加一个git config命令。我举例说明我的.bashrc:

git config --global user.name "$USER@$HOSTNAME"

我在所有机器上都有相同的配置,通过添加它我可以区分来自不同机器的提交。你可以这样做并添加到你的shell rc:

export RC="$HOME/rc"
git config --global core.excludesfile "$RC/globalgitignore" 

答案 2 :(得分:2)

在 Git 2.31(2021 年第一季度)中,您可能会考虑通过环境变量使用配置变量-值对(并且它调整了 GIT_CONFIG_PARAMETERS 编码变量/值对的方式,使其也更加健壮)。

参见 commit d8d7715commit b9d147fcommit 1ff21c0commit b342ae6commit ce81b1d(2021 年 1 月 12 日)和 commit b0812b6(2021 年 1 月 7 日)来自Patrick Steinhardt (pks-t)
请参阅 commit f9dbb64commit 13c4495(2021 年 1 月 12 日)的Jeff King (peff)
(于 2021 年 1 月 25 日在 Junio C Hamano -- gitster --commit 294e949 合并)

<块引用>

config:添加通过 --config-env

传递配置的新方法

合著者:Jeff King
签字人:Patrick Steinhardt

<块引用>

虽然已经可以通过 git -c <key>=<value>(man) 传递运行时配置,但当值包含敏感信息时可能不希望使用它。
例如
如果想要将 http.extraHeader 设置为包含身份验证令牌,那么通过 -c 这样做会通过例如ps(1),通常也显示命令参数。

为了在不泄露凭据的情况下启用此用例,此提交引入了一个新开关 --config-env=<key>=<envvar>

它不是直接为给定的键传递值,而是允许用户指定环境变量的名称。
然后该变量的值将用作键的值。

git 现在包含在其 man page 中:

<块引用>

[--super-prefix=<path>] [--config-env <name>=<envvar>]

git 现在包含在其 man page 中:

<块引用>

--config-env=<name>=<envvar>

-c <name>=<value>一样,给出配置变量 '<name>' 一个值,其中 <envvar> 是一个 从中检索值的环境变量。

不一样 -c 没有直接将值设置为 空字符串,而不是环境变量本身必须是 设置为空字符串。

如果<envvar>不存在则报错 在环境中。 <envvar> 不能包含等号 避免与包含 1 的 <name> 产生歧义。

这对于您想暂时通过的情况很有用 git 的配置选项,但在操作系统上这样做 其他进程可能能够读取您的 cmdline (例如 /proc/self/cmdline),但不是您的环境 (例如/proc/self/environ)。
这种行为是默认的 Linux,但可能不在您的系统上。

请注意,这可能会增加变量的安全性,例如 http.extraHeader 其中敏感信息属于 值,但不是例如url.<base>.insteadOf 其中 敏感信息可以是密钥的一部分。

在你的情况下,测试一下:

git --config-env=core.excludesfile=RC config core.excludesfile
# or (Git 2.32+ only)
git --config-env core.excludesfile=RC config core.excludesfile

core.excludesfile 的值应该是 $RC(它应该引用完整的文件路径,而不仅仅是它的父文件夹)


注意:在 Git 2.32(2021 年第二季度)之前,接受“git --config-env var=val cmd(man)(仅 {{1} } 是)。

commit c331551commit 9152904(2021 年 4 月 29 日),作者 Patrick Steinhardt (pks-t)
(由 Junio C Hamano -- gitster --commit 5f586f5 合并,2021 年 5 月 7 日)

<块引用>

git:支持 --config-env=var=val 的值的单独参数

签字人:Patrick Steinhardt
审核人:Jeff King

<块引用>

虽然没有记录在案,但许多顶级选项(如 --config-env--git-dir)支持两种语法:它们接受选项与其值之间的等号,并且它们确实支持选项和值作为两个单独的参数。
最近添加的 --work-tree 选项仅支持带等号的语法。

通过接受这两种语法并添加测试来验证这两种语法来缓解这种不一致。


但是还有更多,仍然是 Git 2.31:

<块引用>

config:允许通过 envvar 对指定配置条目

签字人:Patrick Steinhardt

<块引用>

虽然我们目前有 --config-env 环境变量可用于将运行时配置数据传递给 git 进程,但它是一个内部实现细节,不应由最终用户使用。

除了仅供内部使用之外,这种传递配置条目的方式还有一个主要缺点:需要解析配置键,因为它们在单个变量中同时包含键和值。
因此,用户可以对值中的任何潜在有害字符进行转义,如果值由第三方控制,则很难做到这一点。

这个提交因此添加了一种通过环境添加配置条目的新方法,摆脱了这个缺点。
如果用户传递了 GIT_CONFIG_PARAMETERS 环境变量,Git 将为 GIT_CONFIG_COUNT=$n 中的每个 GIT_CONFIG_KEY_$i 解析环境变量对 GIT_CONFIG_VALUE_$ii

虽然使用 git -c <name>=<value>(man) 也能达到同样的效果,但对于潜在的敏感信息,人们可能不希望这样做。
例如
如果想要将 [0,n) 设置为包含身份验证令牌,那么通过 http.extraHeader 这样做会通过例如-c,通常也显示命令参数。

ps(1) 现在包含在其 man page 中:

<块引用>

git config

GIT_CONFIG_COUNT

GIT_CONFIG_KEY_<n>

如果 GIT_CONFIG_VALUE_<n> 设置为正数,则所有环境对 GIT_CONFIG_COUNTGIT_CONFIG_KEY_<n> 到那个数字将是 添加到进程的运行时配置。

配置对是零索引的。
任何丢失的键或值都被视为错误。 空的 GIT_CONFIG_VALUE_<n> 被视为与 GIT_CONFIG_COUNT 相同,即没有 对被处理。
这些环境变量将覆盖值 在配置文件中,但会被任何显式选项覆盖 通过 GIT_CONFIG_COUNT=0 传递。

这对于您想要生成多个 git 命令的情况很有用 具有通用配置但不能依赖于配置文件, 例如在编写脚本时。

例如:

git -c

将打印:

    GIT_CONFIG_COUNT=2 \
        GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
        GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
        git config --get-regexp "pair.*"