Can I specify multiple users for myself in .gitconfig?

后端 未结 20 2355
无人及你
无人及你 2020-11-22 06:33

In my ~/.gitconfig, I list my personal email address under [user], since that\'s what I want to use for Github repos.

But, I\'ve recently s

20条回答
  •  粉色の甜心
    2020-11-22 06:49

    After getting some inspiration from Orr Sella's blog post I wrote a pre-commit hook (resides in ~/.git/templates/hooks) which would set specific usernames and e-mail addresses based on the information inside a local repositorie's ./.git/config:

    You have to place the path to the template directory into your ~/.gitconfig:

    [init]
        templatedir = ~/.git/templates
    

    Then each git init or git clone will pick up that hook and will apply the user data during the next git commit. If you want to apply the hook to already exisiting repos then just run a git init inside the repo in order to reinitialize it.

    Here is the hook I came up with (it still needs some polishing - suggestions are welcome). Save it either as

    ~/.git/templates/hooks/pre_commit
    

    or

    ~/.git/templates/hooks/post-checkout
    

    and make sure it is executable: chmod +x ./post-checkout || chmod +x ./pre_commit

    #!/usr/bin/env bash
    
    # -------- USER CONFIG
    # Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
    git_remotes[0]="Github"
    git_remotes[1]="Gitlab"
    
    # Adjust names and e-mail addresses
    local_id_0[0]="my_name_0"
    local_id_0[1]="my_email_0"
    
    local_id_1[0]="my_name_1"
    local_id_1[1]="my_email_1"
    
    local_fallback_id[0]="${local_id_0[0]}"
    local_fallback_id[1]="${local_id_0[1]}"
    
    
    # -------- FUNCTIONS
    setIdentity()
    {
        local current_id local_id
    
        current_id[0]="$(git config --get --local user.name)"
        current_id[1]="$(git config --get --local user.email)"
    
        local_id=("$@")
    
        if [[ "${current_id[0]}" == "${local_id[0]}" &&
              "${current_id[1]}" == "${local_id[1]}" ]]; then
            printf " Local identity is:\n"
            printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
        else
            printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
            git config --local user.name "${local_id[0]}"
            git config --local user.email "${local_id[1]}"
        fi
    
        return 0
    }
    
    # -------- IMPLEMENTATION
    current_remote_url="$(git config --get --local remote.origin.url)"
    
    if [[ "$current_remote_url" ]]; then
    
        for service in "${git_remotes[@]}"; do
    
            # Disable case sensitivity for regex matching
            shopt -s nocasematch
    
            if [[ "$current_remote_url" =~ $service ]]; then
                case "$service" in
    
                    "${git_remotes[0]}" )
                        printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                        setIdentity "${local_id_0[@]}"
                        exit 0
                        ;;
    
                    "${git_remotes[1]}" )
                        printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                        setIdentity "${local_id_1[@]}"
                        exit 0
                        ;;
    
                    * )
                        printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                        exit 1
                        ;;
    
                esac
            fi
        done
    else
        printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"
    
        # Get the user's attention for a second
        sleep 1
    
        git config --local user.name "${local_fallback_id[0]}"
        git config --local user.email "${local_fallback_id[1]}"
    fi
    
    exit 0
    

    EDIT:

    So I rewrote the hook as a hook and command in Python. Additionally it's possible to call the script as a Git command (git passport), too. Also it's possible to define an arbitrary number of IDs inside a configfile (~/.gitpassport) which are selectable on a prompt. You can find the project at github.com: git-passport - A Git command and hook written in Python to manage multiple Git accounts / user identities.

提交回复
热议问题