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

时间:2013-02-07 15:26:37

标签: 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

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

6 个答案:

答案 0 :(得分:10)

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

[core]
    editor = "if [[ $IS_REMOTE -eq 1 ]]; then ED='vim'; else ED='subl -n -w'; fi; $ED"


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

[core]
    editor = "my_edi_script.sh"

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

修改my_edit_script.sh必须在$ PATH中,当然:)

答案 1 :(得分:7)

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

虽然它不允许您编写运行时条件,但它 为您提供了一个框架,用于将~/.gitconfig重构为几个部分: shared 部分和 env特定的部分。之后,您可以将~/.gitconfig.local之类的内容符号链接到相关的特定于env的配置文件,并在~/.gitconfig.local中添加~/.gitconfig

符号链接部分可以编写脚本并作为点文件的一部分自动完成。 init脚本。

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

git config --global include.path '~/.gitconfig.local'

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

这会将以下部分添加到您的~/.gitconfig

[include]
    path = ~/.gitconfig.local

以下是git-scm book显示常规格式的片段:

[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

答案 2 :(得分:2)

我认为你不能这样做,但不是维护你的.gitconfig文件,而是维护一个生成.gitconfig文件的脚本怎么样?这样你就可以做任何你想做的事情,不仅基于变量,还基于命令的输出和任何......

像:

#!/bin/sh
if [ "$#" -eq 0 ]
then
    IS_REMOTE=
else
    case "$1" in
        remote)
            IS_REMOTE=1
            ;;
        local)
            IS_REMOTE=
            ;;
        *)
            echo "value $1 not supported" >&2
            ;;
    esac
fi

# config for both remote and local
git config --global color.ui true
git config --global alias.top '!pwd -L'

# config for remote
if [ "$IS_REMOTE" ]
then
    git config --global core.editor vim
    ...
else
    git config --global core.editor 'subl -n -w'
    ...
fi

因此,如果您调用没有参数的脚本或使用'local'参数,它将为您的.gitconfig文件生成一些配置,而如果您将'remote'参数传递给它,它将生成其他一些人。

答案 3 :(得分:1)

不完全是您的问题的答案,但相关用例很有趣: 因为git 1.8.5你可以使用urlmatch语法

http://git-scm.com/docs/git-config 详情

关于遥控器的配置条目是唯一可以有条件地定义的条目 [http "https://localhost" ] sslVerify = false

^将切换本地主机的ssl验证"遥控器"仅

答案 4 :(得分:0)

您可以根据自己的Git目录或Git 2.13及更高版本中的分支有条件地包含另一个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

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

[user]
    email = john@work.com

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

git config user.email

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

答案 5 :(得分:-1)

由于无法测试环境变量并以编程方式更改.gitconfig,并且由于脚本创建两个.gitconfig文件感觉就像我想要提出的工作更多,我只是要创建两个.gitconfig文件。在那些我可以将Sublime Text 2设置为编辑器并控制合并工具和diff工具的机器上,我将使用“primary”gitconfig作为我的符号链接的目标。在那些我没有选择ST2的机器上,我将使用“辅助”gitconfig文件。