2012-12-06 7 views
22

Ho un computer di lavoro, ed è configurato a livello globale per utilizzare la mia email di lavoro e il nome quando si esegue il commit. Questo è buono. Tuttavia, mi piacerebbe fare una sorta di regola che dice "se l'origine del repository è github, usa l'utente X e invia una email a Y"È possibile configurare user.name e user.email per i domini con caratteri jolly in .gitconfig?

Mi rendo conto che puoi fare una voce di configurazione per repository, ma mi piacerebbe per essere più automatico: se il clone è github, dovrebbe usare i dettagli dell'utente github. Se cloro dal lavoro, dovrebbe usare i dettagli del lavoro.

C'è un modo per configurarlo globalmente in base al dominio remoto? O un altro modo?

EDIT/UPDATE

ho accettato la risposta qui sotto, ma modificato lo script appena un po ':

#!/usr/bin/env bash 

# "Real" git is the second one returned by 'which' 
REAL_GIT=$(which -a git | sed -n 2p) 

# Does the remote "origin" point to GitHub? 
if ("$REAL_GIT" remote -v 2>/dev/null | grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then 

    # Yes. Set username and email that you use on GitHub. 
    export GIT_AUTHOR_NAME=$("$REAL_GIT" config --global user.ghname) 
    export GIT_AUTHOR_EMAIL=$("$REAL_GIT" config --global user.ghemail) 

fi 

"$REAL_GIT" "[email protected]" 

L'aggiunta primario è il requisito per due git config valori.

git config --global user.ghname "Your Name" 
git config --global user.ghemail "[email protected]" 

Questo evita di codificare i valori nello script, consentendogli di essere più portabile. Può essere?

+0

Considerare di cambiare la risposta accettata a boywhoroared. È stato presentato dopo che la risposta di Mike Morearty è stata accettata, ma penso che sia una risposta migliore. È più semplice aggiungere altri domini e utilizza il hook post-checkout di git invece di sostituire interamente l'eseguibile. – charmoniumQ

risposta

17

Non c'è niente di costruito in Git per fare questo (per quanto ne so), ma il seguente script di shell sembra funzionare abbastanza affidabile . Modificalo per avere il nome utente e l'indirizzo e-mail che vuoi quando effettui il check-in in GitHub, e poi salvalo come un eseguibile chiamato "git" sul tuo percorso da qualche parte prima del il git "reale".

#!/usr/bin/env bash 

# "Real" git is the second one returned by 'which' 
REAL_GIT=$(which -a git | sed -n 2p) 

# Does the remote "origin" point to GitHub? 
if ("$REAL_GIT" remote -v 2>/dev/null | 
    grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then 

    # Yes. Set username and email that you use on GitHub. 
    export GIT_AUTHOR_NAME='*** put your name here ***' 
    export GIT_AUTHOR_EMAIL='*** put your email address here ***' 

fi 

"$REAL_GIT" "[email protected]" 

Io uso un trucco simile con ssh sulla mia macchina - voglio ssh cambiare il mio colore di sfondo della finestra quando viene eseguito, e poi cambiare di nuovo quando esce - e ha funzionato in modo affidabile per me.

Inoltre, notare che questo è hardcoded per guardare solo il telecomando denominato origin.

+1

sono GIT_AUTHOR_ * esportati solo per la lunghezza dello script + git proper, o sarebbe globale rispetto alla sessione terminale? Non vorrei sovrascrivere quei valori per i repository non Github dopo aver toccato un singolo repository github. – Andrew

+1

Vengono esportati solo per la lunghezza dello script + git proper. –

+1

Oggi stavo testando uno shim in ~/bin e ho eseguito "export PATH = ~/bin: $ PATH". Più tardi sono passato a un altro progetto, ho eseguito lo stato git e ... bomba a forcella! Il mio male, ma ... d'ora in poi sarò hard-coding $ REAL_GIT :-) – choover

1

user.name e user.email sono utilizzati per "firmare" i vostri commit. Dal momento che i commit sono indipendenti dal repo (diciamo, lo stesso commit sarà in molti repository diversi quando li si preme), quelle proprietà non dipendono da remote.

Ciò che si può fare è impostare diversi registri quando ci si connette a diversi telecomandi tramite https. Dovresti semplicemente inserire il nome utente nell'URL, nel formato https://[email protected]/path/to/repo.git e il gioco è fatto.

Ma l'autore del commit sarà lo stesso user.name, perché i commit sono fatti localmente e quindi sono condivisi con altri.

Poiché l'identità del committente è parte del commit, se si effettuano due commit uguali ad eccezione del nome e dell'email del committente, tali commit avranno hash diversi, quindi saranno due commit diversi da fare a tutti . Questo sarebbe un disastro :)

Se davvero vuole fare questo, forse si può fare qualcosa con ganci che spinge i vostri commit a un altro repo sul computer, e che altri pronti contro termine (tramite ganci, ancora una volta) sarà riscrivere i commit, cambiare l'autore e spingere all'altro telecomando.

Ma è così brutto ti rinnegherò aver detto a tale proposito;)

+0

Sì, è brutto. Non sono sicuro che sia necessario però ... Non sto cercando di commettere due persone diverse allo stesso repository, ma a repository diversi. Né sto cercando di riscrivere i commit esistenti. – Andrew

4

Git 2.13 adds supporto per config condizionale comprende. Se organizzi i pagamenti in directory per ciascun dominio di lavoro, puoi aggiungere impostazioni personalizzate in base a dove si trovano i checkout. Nella vostra configurazione git globale:

[includeIf "gitdir:code/work/"] 
    path = /Users/self/code/work/.gitconfig 

E poi in ~/code/lavoro/.gitconfig:

[user] 
    email = [email protected] 

E naturalmente si può fare per tanti domini di lavoro come ti piace.

+0

Questa è una buona soluzione per me. Per Windows '[includeIf" gitdir: D:/repositories/"]' corrisponderà a tutti i repository in 'D: \ repository \\'. '' 'Sembra che sia necessario. – ceztko

0

Simile a Mike's answer, ma grazie al comando uniq alla quarta riga, non si verificherà un bombardamento a forcella, anche se si avvia una shell all'interno di una shell.

#!/usr/bin/env bash 

# "Real" git is the second one returned by 'which' 
REAL_GIT=$(which -a git | uniq | sed -n 2p) 

# Does the remote "origin" point to GitHub? 
if ("$REAL_GIT" remote -v 2>/dev/null | 
    grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then 

    # Yes. Set username and email that you use on GitHub. 
    export GIT_AUTHOR_NAME='*** put your name here ***' 
    export GIT_AUTHOR_EMAIL='*** put your email address here ***' 

fi 

"$REAL_GIT" "[email protected]" 
Problemi correlati