261
votes

I'd like to include a file in my .gitconfig that has my github settings - is this possible?

Can I do something like this:

[core]
    include = /path/to/file
4
"I don't want to include the github details in it, hence why I would like to include them from an external file somehow": that is precisely what the global config file is for. Is there any reason to not use it in your case?VonC
Yes, because I want to publish the .gitconfig in a git repository and I don't want someone to steal my github credentials.David Reynolds
I do not follow you: your regular gitconfig file will be published to github, but without any github settings. Why? Because those would be in your global config file (~/.gitconfig), i.e. not pushed to your github repo. When you type 'git config', what you see is the concatenation of the 3 config file (repo, global and system). Only the repo config file get pushed. The 2 other ones stay local.VonC
it looks like everyone missed the point of this question. David obviously wants to push up a repo of all his dot files (bashrc, gemrc, etc.) INCLUDING his .gitconfig so he can have all his settings on all his machines. A way to push parts of a .gitconfig file by including and ignoring private entries is what he (and I, for that matter) is afterBo Jeanes
@bjeanes: precisely! I've still not found a way to do it though.David Reynolds

4 Answers

326
votes

Git (1.7.10+) now supports this syntax in .gitconfig:

[include]
    path = /path/to/file

See here for a detailed description of the git change and its edge cases.

By the way, a couple of subtleties worth pointing out:

  1. Environment-variable expansion, e.g. $HOME, is not supported. (Expansion of ~ appeared in Git 1.7.10.2.)

  2. If a relative path is specified, then it is relative to the .gitconfig file that has the [include] statement. This works correctly even across chained includes -- e.g. ~/.gitconfig can have:

    [include]
        path = subdir/gitconfig
    

    and subdir/gitconfig can have:

    [include]
        path = nested_subdir/gitconfig
    

    ... which will cause subdir/nested_subdir/gitconfig to be loaded.

  3. If git can't find the target file, it silently ignores the error. This appears to be by design.

16
votes

Update 2012:

See Mike Morearty's answer:

Includes

You can include one config file from another by setting the special include.path variable to the name of the file to be included.
The included file is expanded immediately, as if its contents had been found at the location of the include directive.
If the value of the include.path variable is a relative path, the path is considered to be relative to the configuration file in which the include directive was found.
The value of include.path is subject to tilde expansion: ~/ is expanded to the value of $HOME, and ~user/ to the specified user's home directory.


I do not think so.

I would rather put that setting in the ~/.gitconfig file

User-specific configuration file. Also called "global" configuration file.

That way, it completes the .gitconfig project-specific file, without being published when pushed to GitHub. See also this SO answer for more on the global config file.
Git has 3 config files.


bjeanes adds in the comments:

it looks like everyone missed the point of this question.
David obviously wants to push up a repo of all his dot files (bashrc, gemrc, etc.) INCLUDING his .gitconfig so he can have all his settings on all his machines.
A way to push parts of a .gitconfig file by including and ignoring private entries is what he (and I, for that matter) is after.

A possible way would be to use a smudge/clean filter driver to decrypt/encrypt one file with private sensitive informations (see this thread), in order to complete a local file like ~/.gitconfig with the decrypted parts that are relevant to that file.

That way you can have a Git repo with all your dot files, plus one file with encrypted information meant to be decrypted and added to said dot files.

alt text

In .gitattributes (or .git/info/a..) use:

myPrivateInfosFile filter=gpg diff=gpg

In your repo .config file:

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

(a GPG-based solution means, off course, you have communicated your private/public keys by another mean onto the destination computer where you want to restore all your dot files by cloning this special repo)

Actually, in your case, the smudge script needs to be completed as it must, after decrypted that file, go on and add relevant parts to your global ~/.gitconfig file (unless you overwrite the global config file with another location) or other dot files for that matter.

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread (gpg inconveniences are discussed further in this thread) (this is different than having a full encrytped Git repo, as discussed here)

10
votes

You may load it from the command-line:

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

Use "$PWD"/.gitconfig instead, if you want to load the file from the current directory.

After running above command, the following lines are added into your .git/config file:

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

I believe you can accomplish this using defunkt's hub tool. This is a wrapper for the git command which among other things, allows you to have GITHUB_USER and GITHUB_TOKEN environment variables. Which will override the settings in the local .gitconfig file.

Then to make it seamless the user you pointed to aliased alias git=hub in his ZSH config. You should be able to then source a local file where you set your environment variables and push your repository to the public world with all of your private information in tact.

**NOTE for homebrew users on OSX, you can install the tool via brew install hub.