Git配置列表只有部分名称

时间:2015-02-22 05:54:25

标签: git-config

我正在开发一个项目,在多个命名部分中定义一些自定义配置设置。作为其中的一部分,我希望能够列出所有部分名称。我知道这可以通过列出所有配置设置并减少列表来完成,但有没有办法直接列出部分名称?

2 个答案:

答案 0 :(得分:0)

在不处理git config -l的输出的情况下,这是不可能的。

请注意,添加--name-only选项后,所述输出很快就会更容易处理。

commit a92330dcommit f225987commit 9f1429dJeff King (peff)(2015年8月20日)。{
请参阅commit ebca2d4(2015年8月20日)和commit 905f203commit 578625f(2015年8月10日)SZEDER Gábor (szeder)(由Junio C Hamano -- gitster --合并于commit fc9dfda,2015年8月31日)

  

config:添加' --name-only'选项仅列出变量名称

     

' git config'只能显示值或名称 - 值对,所以如果是shell   脚本需要它必须运行的设置配置变量的名称' git config --list'或者' --get-regexp'并解析输出以从其值中分离配置变量名称   但是,这种解析不能处理多行值。

     

通过介绍帮助完成脚本和shell脚本   ' --name-only'修改' --list'的输出的选项和   ' --get-regexp'仅列出配置变量的名称,因此他们不会   必须执行容易出错的后处理来分隔变量名称   从他们的价值观。

答案 1 :(得分:0)

这是一个旧线程,但我发现它有一个当前的问题,我浏览了一些相关的问题,发现了一些简单的魔法。一种巧妙的方法是使用 pcregrep (它在 Mac 上可用,但我相信它可以用于 LINUX)。我不仅需要打印部分标题,还需要出于非常具体的原因解析它们 - 我想获取项目中主模块下所有子模块的名称。我以为我可以使用一些 git config 操作来干净利落地做到这一点,但正如上面的一位回答者所说,你不能。但是配置文件并不神奇。它们只是格式化的文本文件,格式化的文本文件喜欢被 grepped,当它是这样的只读操作(查询文件以获取节头信息)时,使用任何你想要的非破坏性工具都是非常安全的 - grepsed 浮现在脑海中。有一些优雅的 sed 解决方案,我将提供参考,但我喜欢 pcregrep 解决方案,因为它调用约定简单。 git 文档会告诉您所有这些文件的位置,具体取决于您查看的是本地配置、用户配置还是全局配置。就我而言,我正在查看一个非常具体的配置文件 - .gitmodules,它通常通过特定的 git submodule 调用或通过 git config -f .gitmodules ... 进行查询。这个技巧适用于任何 git 使用的类型的配置文件,并且 git 风格与许多其他风格没有什么不同。

pcregrep 是 grep 的一种风格,它使用受 PERL 启发的正则表达式,并且对于某些任务(例如这个),它比普通 grep 更强大。首先让我们看看我们可以用普通的 grep 做什么。如果我打电话...

grep -E '^\s*\[\s*\w+\s+\"\w+\"\s*\]' .gitmodules

我会接近我想要的。上面的正则表达式有点偏执,可能可以简化,但这是有原因的,所以请耐心等待。此 grep 调用将列出所有类型的所有部分以及所有实例名称,并将它们打印出来,方括号等等。对空白的引用只是因为我不确定配置文件的容忍度或变体的程度,所以我只想接受以 [<sectiontype> "<instance name>"] 开头的任何行,而不管制表符或空格或其他什么。但就我而言,我只想要类型为 submodule 的部分,因此我的表达式可以缩小为 ...

grep -E '^\s*\[\s*submodule\s+\"\w+\"\s*\]' .gitmodules

很可能,提问者也只想要一些部分标题类型,因此您可以了解如何使其更加具体。但是我想要的真正的最终结果是一个很好的 bash 列表,其中仅包含名称。这就是解析的用武之地(我敢打赌提问者也想要其中的一些)。

pcregrep -o1 '^\s*\[\s*submodule\s+\"\(w+)\"\s*\]' .gitmodules

上面的方法可以解决问题。 pcregrep 调用看起来很熟悉,但请注意,我将我感兴趣的信息放在括号中的替换组中。 -o1 表示“输出匹配表达式的行的第一个替换组,没有别的”。而已。这就是提问者想要的。我想要的是在列表中迭代的所有内容,所以我的脚本中的行是...

declare -r all_submodules=( $(pcregrep -o1 '^\s*\[\s*submodule\s+\"([^"]+)\"\s*\]' .gitmodules) )

现在我有一个所有子模块名称的不可变列表。现在你可能会问为什么我不做这样的事情,

declare -r all_submodules=( $(git submodule foreach --quiet 'echo $name') )

答案是,对于我的应用程序,我需要知道可以为此项目初始化的所有子模块,而 git submodule foreach 仅列出“当前”的模块,即已初始化的模块.整个项目使用子模块作为可选组件,因此在任何时候,只有一些是活动和初始化的。

所有关于 pcregrep 的智慧都不是来自我。它和其他一些涉及 sed 的完美解决方案在 this UNIX stackexchange 页面上找到,该页面回答了如何仅从 grep 调用打印替换组的一般问题。就像这里一样,答案是“你不能”,但后续有这些巧妙的解决方案和其他一些可能更适合您的问题的解决方案。这是一个值得隐藏在您脑海中的解决方案系列,也是一个非常重要的文本解析技巧。

相关问题