29

通过 Github,我在几台不同的计算机和服务器上使用同一组“点文件”。在我直接控制的 Mac 和 Linux 机器上,我安装了 Sublime Text 2 并将其设置为我选择的 git 合并和提交编辑器。但是,在远程(即不受我直接控制的)服务器上,我会选择使用 vim。

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

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

我在哪里根据主机名设置了 $IS_REMOTE?

4

7 回答 7

19

不,Git config 不支持检查或条件语句。但是您的底层外壳可能会这样做,因此您可以使用以下内容:

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

于 2013-02-07T15:41:00.747 回答
11

[include]git-config 在v1.7.9中学到的部分可以帮助您了解大部分情况。

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

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

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

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

我专门使用上面的引号来防止 shell 扩展~到绝对路径。

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

[include]
    path = ~/.gitconfig.local

这是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
于 2014-12-11T03:03:05.457 回答
6

您可以根据 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

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

[user]
    email = john@work.com

您可以通过切换到 下的 Git 目录来观察差异~/work,然后运行:

git config user.email

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

于 2019-12-04T20:34:12.740 回答
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'参数传递给它,它会生成一些其他配置。

于 2013-02-07T15:38:33.647 回答
1

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

于 2013-02-08T04:43:49.380 回答
1

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

有关详细信息,请参阅 http://git-scm.com/docs/git-config

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

^ 将只为本地主机“远程”切换 ssl 验证

于 2015-07-22T13:41:53.363 回答
1

从 Git v2.31 开始,您还可以在您的.bashrc或其他任何内容中设置环境变量,例如在 WSL2 上,我使用以下内容将 git 配置为使用来自 Windows 的缓存 git https 凭据:

export GIT_CONFIG_COUNT=2 \
GIT_CONFIG_KEY_0="credential.helper" GIT_CONFIG_VALUE_0="/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe" \
GIT_CONFIG_KEY_1="credential.https://dev.azure.com.usehttppath" GIT_CONFIG_VALUE_1="true"

感谢 VonC 指出这一点https://stackoverflow.com/a/65963666/9189668

于 2022-01-14T13:16:28.130 回答