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.email
normal. 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 .htaccess
configuraçõ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, ~/work
poderá 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 git
comando 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=hub
por this e chamei hub
minha função - se você não usar hub
, substitua todas hub
as 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.