66

我有一个 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目录移动到不同的位置,我必须更改路径。

4

3 回答 3

53

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

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

状态的文档--path

- 小路

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

术语“扩展”没有出现在任何不同的上下文中git-config(1)。那么,鉴于在任何地方都没有记录此类功能,您是怎么想到它应该的呢?

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

如果是关于点文件管理,那么做所有人都做的事情:把它们放在一个目录中,然后从你的$HOME.

于 2012-06-29T12:52:50.160 回答
30

我在配置中使用 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" 
于 2014-02-05T10:23:20.177 回答
9

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

请参阅Patrick Steinhardt ( ) 的提交 d8d7715提交 b9d147f提交 1ff21c0提交 b342ae6提交 ce81b1d(2021 年 1 月 12 日)和提交 b0812b6(2021 年 1 月 7 日。 请参阅Jeff King ( ) 的提交 f9dbb64提交 13c4495(2021 年 1 月 12 日(由Junio C Hamano 合并 -- --提交 294e949中,2021 年 1 月 25 日)pks-t
peff
gitster

config: 添加新的方式来传递配置--config-env

合着:Jeff King
署名:Patrick Steinhardt

虽然已经可以通过( man )传递运行时配置,但当值包含敏感信息时可能不希望使用它。 例如 ,如果一个人想要设置包含一个身份验证令牌,这样做会通过 eg 轻易泄露这些凭据,这通常也会显示命令参数。git -c <key>=<value>

http.extraHeader-cps(1)

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

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

git现在在其手册页中包含:

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

git现在在其手册页中包含:

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

就像-c <name>=<value>,给配置变量“ <name>”一个值,其中<envvar>是一个环境变量的名称,从中检索该值。

-c没有直接将值设置为空字符串的快捷方式不同,环境变量本身必须设置为空字符串。

如果<envvar>环境中不存在 则为错误。<envvar>可能不包含等号以避免与<name>包含一个的 s 产生歧义。

这对于您希望将临时配置选项传递给 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 cmdman被接受(仅--config-env=var=val被接受)。

请参阅Patrick Steinhardt ( ) 的提交 c331551提交 9152904(2021 年 4 月 29 日(由Junio C Hamano 合并 -- --提交 5f586f5中,2021 年 5 月 7 日)pks-t
gitster

git: 支持单独的 arg--config-env的值

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

虽然没有这样记录,但许多顶级选项都喜欢--git-dir--work-tree支持两种语法:它们接受选项及其值之间的等号,并且它们支持将选项和值作为两个单独的参数。
最近添加的--config-env选项仅支持带等号的语法。

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


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

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

签字人:Patrick Steinhardt

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

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

因此,此提交添加了一种通过环境添加配置条目的新方法,从而消除了此缺点。
如果用户传递GIT_CONFIG_COUNT=$n环境变量,Git 将解析环境变量对,GIT_CONFIG_KEY_$iGIT_CONFIG_VALUE_$ii.[0,n)

虽然使用( man )也可以实现相同的效果,但对于潜在的敏感信息可能不希望这样做。 例如 ,如果一个人想要设置包含一个身份验证令牌,这样做会通过 eg 轻易泄露这些凭据,这通常也会显示命令参数。git -c <name>=<value>

http.extraHeader-cps(1)

git config现在在其手册页中包含:

GIT_CONFIG_COUNT

GIT_CONFIG_KEY_<n>

GIT_CONFIG_VALUE_<n>

如果GIT_CONFIG_COUNT设置为正数,则所有环境对 GIT_CONFIG_KEY_<n>以及GIT_CONFIG_VALUE_<n>不超过该数字的所有环境对都将添加到进程的运行时配置中。

配置对是零索引的。
任何缺少的键或值都被视为错误。空GIT_CONFIG_COUNT的被视为与 相同GIT_CONFIG_COUNT=0,即不处理任何对。
这些环境变量将覆盖配置文件中的值,但会被通过git -c.

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

例如:

    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.*" 

将打印:

pair.one foo
pair.two bar
于 2021-01-30T01:05:34.003 回答