特定存储库的Git全局配置?

3
意思是,有一个像[repo_url]这样的特定存储库部分,它可以覆盖全局(不针对特定存储库)选项。
[core]
    filemode = false
    editor = notepad
[repo "example.com/repo1.git"]
    [core]
        filemode = true
        # editor = notepad
[repo "example.com/repo2.git"]
    [core]
        editor = vim
        # filemode = false

在git中是否可能实现这个功能?

注意:我正在克隆(git clone)许多仓库,我希望能够在全局配置中指定。


我不认为有一种方法可以从全局配置文件中完成这个操作,但是每个仓库都有自己的配置文件(.git/config)。您可以手动编辑该文件,或者在运行git config时使用--local标志。 - undefined
1
将仓库分组放置在目录中,并使用条件包含。示例:https://dev59.com/xVkS5IYBdhLWcg3wKzqq#49154229,https://stackoverflow.com/a/48018125/7976758 - undefined
@phd,谢谢。我之前不知道includeIf这个功能。这真是一个相当随机的特性! - undefined
3个回答

5
从Git 2.36(2022年第二季度)开始,您将有另一个选项来替代依赖于本地文件夹:使用“[includeIf <condition>]”的配置文件的条件包含机制学习基于与存储库交互的远程存储库的URL来做出决策。

查看 提交 399b198, 提交 ed69e11 (2022年1月18日) 由 Jonathan Tan (jhowtan) 完成。
(由 Junio C Hamano -- gitster -- 合并在 提交 13ce8f9 中,2022年2月9日)

config:如果远程URL匹配glob,则包含文件

署名:Jonathan Tan
确认者:Elijah Newren

这是一项支持配置文件包含的功能,条件是仓库是否有与通配符匹配的URL远程。类似于我之前关于remote-suggested hooks的工作,主要目的是允许远程仓库管理员以更易于消费的方式提供推荐配置(例如通过包管理器安装的软件包 - 它可以包含一个要有条件地包含的文件和一个后安装脚本,将包含指令添加到系统范围的配置文件中)。为此,Git在注意到第一个URL条件包含时重新运行配置解析机制,以查找所有远程URL,并使用这些远程URL来确定是否执行第一个和所有后续包含。
不允许在任何URL条件包含的文件中配置远程URL。

config现在在其man page中包括:

hasconfig:remote.*.url:

该关键字后面的数据被视为具有标准globbing通配符和两个额外的通配符**//**的模式,可以匹配多个组件。
第一次看到此关键字时,将扫描其余配置文件以查找远程URL(不应用任何值)。
如果存在至少一个与此模式匹配的远程URL,则满足包含条件。

通过此选项(直接或间接)包含的文件不允许包含远程URL。

请注意,与其他includeIf条件不同,解析此条件依赖于在读取条件时尚未知的信息。

典型用例是此选项作为系统级别或全局级别配置出现,而远程URL位于本地级别配置中;因此需要在解析此条件时进行预先扫描。

为了避免可能包含的文件影响是否可能包含这些文件的循环问题,Git通过禁止这些文件影响这些条件的解决方法来打破循环(因此,禁止它们声明远程URL)。

至于此关键字的命名,它是为了向前兼容支持更多基于变量的包含条件的命名方案,但当前Git仅支持上述确切关键字。

config现在在其手册页面中包括:

; include only if a remote with the given URL exists (note
; that such a URL may be provided later in a file or in a
; file read after this file is read, as seen in this example)
[includeIf "hasconfig:remote.*.url:https://example.com/**"]
path = foo.inc
[remote "origin"]
url = https://example.com/git

3
对于SSH连接,您需要使用ssh协议: git remote set-url origin ssh://git@gitlab.com/your/repo.git 并在您的配置文件中添加 [includeIf "hasconfig:remote.*.url:ssh://git@gitlab.com/**"] - undefined
@KévinBerthommier 好主意。那也应该行得通。 - undefined
6
@KévinBerthommier 您可以通过在配置文件中使用[includeIf“hasconfig:remote.*.url:git@gitlab.com:*/**”]来匹配GitLab的默认SSH URL格式,从而避免编辑存储库的源。 - undefined

1
解决方案: includeIf (非常感谢@phd)
全局配置
[core]
  filemode = false
  editor = notepad
[includeIf "gitdir/i:repo1/"]
  path = path_to_repo1_git_config  
[includeIf "gitdir/i:repo2/"]
  path = path_to_repo2_git_config  

repo1_git_config

[core]
  filemode = true

repo2_git_config

[core]
  editor = vim

那样,任何以repo1/repo2为父目录(非直接)的存储库都将包含相应的配置。请注意每个`includeIf (read docs)`末尾的斜杠。

0

本地和条件配置将适用于您的标题问题,但没有基于存储库远程网址的条件。考虑到本地克隆,这个想法立即开始变得脆弱和令人困惑。

也许根据某个提交是否存在于存储库中来设置条件更有意义,但是根据您的问题,我们无法确定动机是什么。如果您解释一下您遇到的情况,这个问题可能会获得更有帮助的答案。


明显对于"repo"和(我不得不猜测)源URL之间的混淆使问题变得不够清晰,我选择在我的回答中解决明显的基于URL的配置需求,对此的答案是你不能这样做,这不是一个好主意,但你可以接近实现,正如评论所说。这是对给出答案的一种很好的释义。所以我不同意。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接