是否可以在.gitconfig中包含文件


245

我想在.gitconfig文件中包含一个具有github设置的文件-这可能吗?

我可以做这样的事情:

[core]
    include = /path/to/file

3
“我不想在其中包含github详细信息,因此为什么我想以某种方式从外部文件中包含它们”:这正是全局配置文件的用途。有没有理由在您的情况下不使用它?
VonC

11
是的,因为我想将.gitconfig发布到git存储库中,并且我不希望有人窃取我的github凭据。
David Reynolds,2009年

我没有关注您:您的常规gitconfig文件将发布到github,但没有任何github设置。为什么?因为这些将在您的全局配置文件(~/.gitconfig)中,即不会被推送到您的github存储库中。键入' git config'时,您会看到3配置文件(存储库,全局文件和系统文件)的串联。仅回购配置文件被推送。另外2个位于本地。
VonC

90
似乎每个人都错过了这个问题的重点。David显然想推动其所有点文件(bashrc,gemrc等)的回购,包括他的.gitconfig,这样他就可以在所有计算机上进行所有设置。通过包括和忽略私人条目推的.gitconfig文件的各个部分的一种方法是,他(和我,对于这个问题)是以后有什么
博Jeanes

5
@bjeanes:准确!我仍然没有找到一种方法来做到这一点。
David Reynolds,2009年

Answers:


302

Git(1.7.10+)现在支持以下语法.gitconfig

[include]
    path = /path/to/file

看到这里对git change及其边缘情况的详细描述。

顺便说一句,一些细微之处值得指出:

  1. $HOME不支持环境变量扩展,例如。(扩展~出现在Git 1.7.10.2中。)

  2. 如果指定了相对路径,则它相对于具有该[include]语句的.gitconfig文件是相对的。即使跨链包含,这也可以正常工作-例如~/.gitconfig可以具有:

    [include]
        path = subdir/gitconfig
    

    subdir/gitconfig可以具有:

    [include]
        path = nested_subdir/gitconfig
    

    ...这将导致subdir/nested_subdir/gitconfig加载。

  3. 如果git找不到目标文件,它会静默忽略该错误。这似乎是设计使然。


7
实际上你不需要~。这是因为你的.gitconfig文件仍然居住在~/.gitconfig在配置将意味着一个相对路径~...
粗壮

2
~/ $HOME扩展实际上是作为git describe --contains 4c0a89fc- > v1.7.10.2~12^2(即v1.7.10.2或更高版本),显着的,因为它似乎的Debian 7和Ubuntu量子理论将与释放v1.7.10.4
FauxFaux 2012年

1
这是否支持glob?例如path =〜/ gitconfig.d / *?
Bret 2015年

1
@Bret不,这不支持glob。
Mike Morearty 2015年

8
请注意,配置包含在给出一个特定的文件这样将不会显示(即用--global--local--file),除非有明确告知--includes(像git config --global --includes --list)。
富兰克林·于

16

2012年更新:

参见Mike Morearty答案

包括

您可以通过将特殊include.path变量设置为要包含的文件名来包含一个配置文件。
被包含的文件将立即展开,就像在include伪指令的位置找到了它的内容一样。
如果include.path变量的值是相对路径,则该路径被认为是相对于在其中找到include指令的配置文件而言的。
的值include.path受波浪符号扩展的影响:~/被扩展为的值$HOME,并扩展为~user/指定用户的主目录。


我不这么认为。

我宁愿将该设置放在~/.gitconfig文件中

用户特定的配置文件。也称为“全局”配置文件。

这样,它将完成.gitconfig项目特定的文件,而不会在推送到GitHub时发布。另请参阅此SO答案以获取有关全局配置文件的更多信息。
Git有3个配置文件


bjeanes在评论中添加:

似乎每个人都错过了这个问题的重点。
大卫显然想推他的所有点文件的回购(bashrcgemrc包括他等),.gitconfig所以他可以有他所有的对他的所有机器设置。他(和我,就此而言)所追求的是
一种.gitconfig通过包含和忽略私有条目来推送文件各部分的方法。

一种可能的方法是使用污迹/清理过滤器驱动程序对具有私有敏感信息的文件进行解密/加密(请参见此线程),以便使用与该文件相关的解密部分来完成一个本地文件,例如〜/ .gitconfig。文件。

这样,您可以拥有一个包含所有点文件的Git存储库,以及一个带有加密信息的文件,该文件应被解密并添加到所述点文件中。

替代文字

.gitattributes(或.git/info/a..)中使用:

myPrivateInfosFile filter=gpg diff=gpg

在您的repo .config文件中:

[filter "gpg"]
smudge = gpg -d -q --batch --no-tty
clean = gpg -ea -q --batch --no-tty -r C920A124
[diff "gpg"]
textconv = decrypt

(基于GPG的解决方案当然意味着您已经通过另一种方式将您的私钥/公钥传达到了您要通过克隆此特殊存储库来还原所有点文件的目标计算机上)

实际上,就您而言,涂抹脚本需要完成,因为解密该文件之后,必须继续并将相关部分添加到全局~/.gitconfig文件中(除非您用其他位置覆盖全局配置文件)或其他点文件物。

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread(gpg的 不便之处将在此线程中进一步讨论)(这与拥有完整的加密Git存储库不同,如此处所述


5
我想将我的基本.gitconfig文件发布到git存储库中,但是我不想在其中包含github详细信息,因此为什么我想以某种方式从外部文件中包含它们。
David Reynolds

10

您可以从命令行加载它:

$ git config --local include.path "/path/to/.gitconfig"

"$PWD"/.gitconfig如果要从当前目录加载文件,请改用。

运行上述命令后,以下行将添加到您的.git/config文件中:

[include]
        path = /path/to/.gitconfig

2

我相信您可以使用defunkt的hub工具来完成此 任务。这是git的命令,除其他事项外,可以让你有一个包装GITHUB_USERGITHUB_TOKEN环境变量。它将覆盖本地.gitconfig文件中的设置。

然后使其无缝,您指向的用户alias git=hub在其ZSH配置中使用别名。然后,您应该能够获取一个本地文件,您可以在其中设置环境变量,并将您的存储库推向公共世界,同时保留所有私人信息。

**注意OSX上的自制用户,您可以通过来安装该工具brew install hub

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.