È possibile impostare git configuration su più repository?


18

Git sembra supportare i valori di configurazione a tre livelli:

  • Impostazioni globali per sistema (memorizzate in /etc/git-core)
  • Impostazioni globali per utente (memorizzate in ~/.gitconfig)
  • Impostazioni locali per repository (archiviate in $REPO/.git/config)

Queste opzioni coprono la maggior parte delle basi ma sto cercando un modo per gestire un quarto livello. Ho una (molto) vasta collezione di repository per i quali ho bisogno di usare un valore diverso user.emailrispetto al mio solito. Questi repository sono spesso creati e manipolati tramite script automatici e la configurazione delle impostazioni locali per repository è complessa.

Tutti i repository in questione si trovano sotto un determinato prefisso di percorso sul mio sistema locale. C'è un modo per impostare un valore di configurazione da qualche parte che verrà ereditato da tutti i repository in quel percorso? (Una sorta di .htaccessimpostazioni simili ereditano fino al file system.) Forse ci sarebbe un modo per impostare i valori condizionali nel file di configurazione globale? Quali altri accordi potrebbero essere presi in un ambiente UNIX per far fronte a una serie di repository come il mio?


Il mio primo riflesso è di hackerare gli script per modificare .gitconfigogni directory che creano. Ad esempio, il repository Android IIRC può fare questo, ma devi leggere attentamente la fonte per scoprirlo. (Non ne sono del tutto sicuro, non lo faccio da un po '.)
Gilles' SO- smetti di essere malvagio

@Gilles: Questa è certamente una possibilità. I repository in questione sono il repository di pacchetti per una distro Linux recentemente migrata da CVS a Git. Stiamo ancora lavorando per rifare tutti i nostri strumenti. A lungo termine è probabilmente dove questo viene risolto, ma a breve termine quelli di noi che stanno lavorando su di esso stanno sperimentando quali sono le opzioni.
Caleb,

Risposte:


11

Non ho trovato alcun modo per configurare git a questo quarto livello. L'unico modo sembra essere il valore di configurazione per comando sovrascrive utilizzando git -c key=value.

La mia attuale soluzione hacky è quella di definire una funzione shell che funge da wrapper per git. Quando viene chiamato, passa gli argomenti al comando git di sistema, ma non prima di controllare l'attuale directory di lavoro e aggiungere un argomento aggiuntivo al comando, se applicabile.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

posso fare command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"o come devo procedere? Ho cercato in alto e in basso e l'unico riferimento a questa bandiera -c che ho trovato è stato tuo, grazie, molto apprezzato.
Vic Goldfeld,

per la cronaca, ce l'ho fatta lavorare concommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld il

6

Puoi configurare l'indirizzo email per git con la variabile d'ambiente GIT_AUTHOR_EMAIL. Se lo si combina con gli script Esegui bash quando si immette una directory o una configurazione shell specifica della directory con zsh, è possibile modificare facilmente le impostazioni per directory o directory principale, ad esempio se si accede a una directory in ~/workè possibile regolare automaticamente le variabili di ambiente per modificare la posta elettronica indirizzo.


2

Vedi la soluzione basata sulla configurazione di git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

Aggiungi al file "~ / .gitconfig":

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

Creare il file “~ / .gitconfig-project1 ″ con contenuto:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

Il predicato "includeIf" mi salva il mal di testa!
Truong Nguyen,

1

Sulla base della risposta di Caleb, possiamo definire un gitcomando modificato che configura permanentemente tutti i repository in questa directory, in modo che tutti gli usi futuri di vanilla git utilizzino la nuova configurazione. Io uso hub, che è un altro wrapper git, quindi ho sostituito il mio alias git=hubcon questo e hubho chiamato nella mia funzione - se non lo usi hub, sostituisci tutte le hubinvocazioni con 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
}

A differenza della risposta di Caleb, che funziona solo in una shell (e se non esplicitamente, solo in una shell interattiva), ciò influisce anche su altri front-end git che leggono correttamente la configurazione git, come emacs magit.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.