Search code examples
gitdirectoryrepositorygit-config

Git config with directory scope, containing multiple repositories


The situation is as follows:

  • I have multiple domains in which I write code, e.g. professional and free time. Those are represented by different directories on my computer.
  • Each of those domains contains multiple Git repositories, in a hierarchical directory structure inside one of the domain directories.

Per domain, I want to use a different email address as part of author/committer information. That is, I want my private address to be listed in my free-time projects and my company address in my professional ones.

git config knows 3 scopes: repository, global and system-wide. What I basically need is a 4th scope between repository and global, representing a group of repositories (or simply a directory in the file system).

It seems like git config doesn't allow that. Of course I could set the email address per repository, but I want to avoid this manual step every time I set up or clone a repository. One option would be to write a script that wraps git init/clone and git config, are there other ideas?


Solution

  • Based on https://stackoverflow.com/a/44036640/2377961 I think I found a way how it could work.

    First, you create different config files for your "custom-scopes" (e.g. professional, freetime, ect.) and add your desired user-config for each scope

    # ~/all-projects.gitconfig
    [user]
        name = TheOperator
    
    # ~/professional.gitconfig
    [user]
        email = yourname@yourwork.com
    
    # ~/freetime.gitconfig
    [user]
        email = yourname@private-email.com
    

    than you add lines like this in your standard gitconfig:

    # ~/.gitconfig
    [include]
        path = all-projects.gitconfig
    [includeIf "gitdir/i:c:/work/"]
        path = professional.gitconfig
    [includeIf "gitdir/i:c:/freetime/"]
        path = freetime.gitconfig 
    

    The directories after gitdir/i should match the parents directory of your project groups. In my example you should store your git-repos for freetime-domains e.g. c:/freetime/my-freetime.domain/.git