可以有条件地设置gitconfig选项吗?

Mar*_*ols 18 git git-config

通过Github我在几台不同的计算机和服务器上使用相同的"点文件".在我直接控制的Mac和Linux机器上,我安装了Sublime Text 2并设置为我的git merge和commit编辑器.但是,在远程(即不在我的直接控制下)服务器上,我会选择使用vim.

我宁愿不.gitconfig为这些远程服务器创建和维护第二个.有没有办法做这样的事情:

[core]
    if [[ $IS_REMOTE -eq 1 ]]; then
        editor = "vim"
    else
        editor = "subl -n -w"
    fi
Run Code Online (Sandbox Code Playgroud)

我以某种方式根据主机名设置$ IS_REMOTE?

Joh*_*hee 32

您可以根据 Git 2.13 及更高版本中的 Git 目录或分支有条件地包含另一个 Git 配置文件。

像往常一样将默认配置放入文件中~/.gitconfig。最后,有条件地包含另一个配置文件:

[user]
    email = john@personal.com
    name = John McGehee

# All work Git repositories are in a subdirectory of ~/work.
# All other Git repositories are outside ~/work.
[includeIf "gitdir:~/work/"]
    path = .gitconfig.work
Run Code Online (Sandbox Code Playgroud)

然后,在使用位于或其任何子目录中的~/.gitconfig.work存储库时添加或覆盖您想要的配置值:~/work

[user]
    email = john@work.com
Run Code Online (Sandbox Code Playgroud)

~/work您可以通过更改到 下的 Git 目录并运行以下命令来观察差异:

git config user.email
Run Code Online (Sandbox Code Playgroud)

在不在 .git 目录下的 Git 目录中尝试相同的命令~/work

  • 请注意,“[includeIf]”部分必须位于您想要覆盖其值的任何部分(例如“[user]”)的“下方”。(除了我之外,这对每个人来说都是显而易见的,但是,因为它让我绊倒,所以我想我会分享。) (9认同)

Nev*_*nel 12

不,Git配置不支持检查或条件语句.但你的底层shell可能会这样做,所以你可以使用类似的东西:

[core]
    editor = "if [[ $IS_REMOTE -eq 1 ]]; then ED='vim'; else ED='subl -n -w'; fi; $ED"
Run Code Online (Sandbox Code Playgroud)


如果你需要做一些比这更复杂的事情,你可以把shell代码扔进脚本,当然,就像

[core]
    editor = "my_edi_script.sh"
Run Code Online (Sandbox Code Playgroud)

my_edit_script.sh含喜欢的东西:

#!/bin/bash
if [[ $IS_REMOTE -eq 1 ]]; then
    ED="vim"
else
    ED="subl -n -w"
fi

$ED some argument or other
Run Code Online (Sandbox Code Playgroud)

编辑:my_edit_script.sh必须在$ PATH,当然:)


Ant*_*ker 9

[include]git-config在v1.7.9中学到的部分可以帮助你完成大部分工作.

虽然它不允许您编写运行时条件,但它确实为您提供了一个框架,用于将您重构~/.gitconfig为几个部分:共享部分和特定env的部分.之后,您可以将类似于~/.gitconfig.local特定于env的配置文件进行符号链接,并包含~/.gitconfig.localfrom ~/.gitconfig.

符号链接部分可以编写脚本并作为dotfiles的init脚本的一部分自动完成.

从命令行,可以通过以下方式添加包含路径:

git config --global include.path '~/.gitconfig.local'
Run Code Online (Sandbox Code Playgroud)

我特意使用上面的引号来防止shell扩展~到绝对路径.

这将为您的以下部分添加~/.gitconfig:

[include]
    path = ~/.gitconfig.local
Run Code Online (Sandbox Code Playgroud)

这是git-scm书中的一个片段,显示了一般格式:

[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)


Mar*_*ols -1

由于不可能测试环境变量并以编程方式更改 .gitconfig,并且由于编写脚本创建两个 .gitconfig 文件感觉比我真正想要做的工作更多,所以我将创建两个 .gitconfig文件。在那些我可以将 Sublime Text 2 设置为编辑器并可以控制合并工具和 diff 工具的机器上,我将使用“主要”gitconfig 作为符号链接的目标。在那些没有 ST2 选项的机器上,我将使用“辅助”gitconfig 文件。

  • 这不应该被标记为最佳答案。它只是显示了你的偏好,它受到你对实际目标的放弃的影响。如果有人仍然想这样做,最好的答案是上述之一。 (2认同)