如何设置与版本相关的Git全局配置标志

3
为了让我的所有配置文件保持同步,我在Github存储库中保存了所有设置。虽然在大多数情况下这很有效,但有些应用在不同的机器上有不同的版本。
所以现在我在想...是否有任何方法可以设置Git全局配置设置,就像这个(在我的笔记本电脑上会导致警告),而不会在旧版Git上引起错误?
一种选择可能是包装git push命令以在支持时添加标志,但这似乎是一种hack方法。

为了澄清我的理解,如果在不同的机器上都有一个 ~/.gitconfig 文件会有什么问题?当然要根据不同的机器进行定制。 - mockinterface
@mockinterface: 由于我将配置存储在 git 存储库中,更改一个设备上的配置后(当然要提交和推送),所有设备上的配置都会相应地更改。 - Wolph
3个回答

1

为不同的机器分离配置文件

为不同的机器创建不同的配置文件,然后在每台机器上将其中一个作为真正的配置文件进行符号链接。符号链接本身不会被跟踪,在.gitignore中添加它。

符号链接可以在post-checkout钩子中完成。您需要确定当前主机(例如uname -n),并拥有包含钩子适当设置的文件。

这种解决方案的缺点是它不是动态的。一旦在主机上安装了新版本的Git,你必须检查适当的配置是否能够工作。

不可能的事情

如果你想要检查一个值是否被支持,并使用另一个值作为回退选项,那么你必须解析手册,并依赖于它们的内容。Git没有类似的实现。您无法检查一个值是否被支持,也无法编写一个动态选择值的配置文件。

动态生成的配置

然而,动态生成配置文件是可能的。类似于将普通文件替换为符号链接以选择多个静态文件,您可以将其替换为连接到生成配置的守护进程的命名管道
在守护进程中,您可以检查git --version并基于此选择配置选项的值。虽然这是一个聪明的解决方案,充分利用了Unix文件系统的功能,但它是一个相当hacky的解决方案。您必须保持守护进程运行,如果它停止,Git将无法读取配置并会挂起。

我已经考虑过了,只是感觉不太好,因为这当然不是一种动态的解决方案...我认为这可能是解决方案,但我还是希望有更好的方法。 - Wolph
虽然我仍然认为符号链接和多个配置文件选项是最好的选择,但我想到了一个完全动态的选项。但请注意,从我的角度来看,这真的很疯狂。请参见我的编辑。免责声明:我从未编写过守护程序,尽管我在shell中看到过一个简单的守护程序,并且我从未直接从我的代码中使用过命名管道。我只知道它们的工作原理。但是,如果您需要帮助,我将很乐意学习如何使用命名管道以及如何编写守护程序。 - Palec
太棒了,解决方案很巧妙,但实际执行起来有些hacky,但我仍然喜欢这种创意 :) 如果守护进程冻结了我的shell,我的登录可能会变得有些困难(我通过这种方式获取所有个人配置)。感谢您的想法,确实是一个不错的解决方案。让我们看看是否可以想出一个可以安全使用它的问题 ;) - Wolph
@Wolph 我发现使用命名管道+守护进程的方法可以通过~/.signature向电子邮件添加不同的签名。http://unix.stackexchange.com/a/101248/50602 我想我从一个朋友那里听说过同样的用法,他在签名中发送编程相关的引用和笑话。 - Palec
太酷了 :) 听起来像是我应该努力跟上的东西 ;) - Wolph

1
隐藏目录中有一个特制的git porcelain脚本,你需要将其检入到你所工作的每个仓库中。(或者是一个单独的实用程序仓库,你可以通过清单和repo命令行实用程序来检出。) 你的脚本将根据git版本调用push,独立于你所在的机器,并使用任何必要的标志。

0

虽然不是全面的解决方案,但我用的一个技巧是将 1.7.12+选项(例如push.default=simple)放在~/.config/git/config中,较旧的 Git 不会读取。

我将所有适用于所有Git版本的配置都设置在~/.gitconfig中。


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