A configuração do git pode ser definida em vários repositórios?

A configuração do git pode ser definida em vários repositórios?

O Git parece suportar valores de configuração em três níveis:

  • Configurações globais por sistema (armazenadas em /etc/git-core)
  • Configurações globais por usuário (armazenadas em ~/.gitconfig)
  • Configurações locais por repositório (armazenadas em $REPO/.git/config)

Essas opções cobrem a maior parte da base, mas estou procurando uma maneira de lidar com o quarto nível. Eu tenho uma coleção (muito) grande de repositórios para os quais preciso usar um valor diferente do user.emailnormal. Esses repositórios geralmente são criados e manipulados por meio de scripts automatizados, e definir configurações locais por repositório é complicado.

Todos os repositórios em questão estão localizados sob um determinado prefixo de caminho no meu sistema local. Existe uma maneira de definir um valor de configuração em algum lugar que será herdado por todos os repositórios nesse caminho? (As .htaccessconfigurações são herdadas por todo o sistema de arquivos.) Talvez houvesse uma maneira de definir valores condicionais no arquivo de configuração global? Que outros arranjos poderiam ser feitos em um ambiente UNIX para lidar com um conjunto de repositórios como o meu?

Responder1

Não encontrei nenhuma maneira de configurar o git neste quarto nível. A única maneira parece ser a substituição do valor de configuração por comando usando git -c key=value.

Minha solução hacky atual é definir uma função shell que sirva como wrapper para o git. Quando chamado, ele passa os argumentos para o comando git do sistema, mas não antes de verificar o diretório de trabalho atual e adicionar um argumento extra ao comando, se aplicável.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

Responder2

Veja esta solução baseada na configuração do git:

https://dzone.com/articles/how-to-use-gitconfigs-includeif

Adicione ao arquivo “~/.gitconfig”:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

Crie o arquivo “~/.gitconfig-project1″ com conteúdo:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  
  
    [user]  
      name = user1  
      email = [email protected]  

Responder3

Você pode configurar o endereço de e-mail do git com a variável de ambiente GIT_AUTHOR_EMAIL. Se você combinar isso comExecute scripts bash ao entrar em um diretórioouconfiguração de shell específica de diretório com zshvocê pode facilmente alterar as configurações por diretório ou diretório pai, por exemplo, se você entrar em um diretório, ~/workpoderá ajustar automaticamente as variáveis ​​de ambiente para alterar seu endereço de e-mail.

Responder4

Com base na resposta de Caleb, podemos definir um gitcomando modificado que configura permanentemente todos os repositórios neste diretório corretamente, para que todos os usos futuros do vanilla git usem a nova configuração. Eu uso hub, que é outro wrapper do git, então substituí my alias git=hubpor this e chamei hubminha função - se você não usar hub, substitua todas hubas invocações por command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

Ao contrário da resposta de Caleb, que funciona apenas em um shell (e, a menos que tenha origem explícita, apenas em um shell interativo), isso também afeta outros front-ends do git que leem corretamente a configuração do git, como o emacs magit.

informação relacionada