È possibile avere una configurazione Git diversa per progetti diversi?


315

.gitconfigdi solito è memorizzato nella user.homedirectory.

Uso un'identità diversa per lavorare su progetti per l'azienda A e qualcos'altro per l'azienda B (principalmente il nome / e-mail). Come posso avere due diverse configurazioni Git in modo che i miei check-in non vadano con il nome / e-mail?

Risposte:


264

Il .git/configfile in un particolare clone di un repository è locale per quel clone. Tutte le impostazioni inserite influiranno solo sulle azioni per quel particolare progetto.

(Per impostazione predefinita, git configmodifica .git/config, non ~/.gitconfigsolo - modifica solo --globalquest'ultimo.)


quindi la modifica del file di configurazione nella configurazione per il repository stesso, ad esempio la modifica del [user] email = ...blocco, sostituirà il globale ~/.gitconfig- e questo è solo per l'utente?
dcsan,

285

Ci sono 3 livelli di git config; progetto, globale e di sistema.

  • progetto : le configurazioni del progetto sono disponibili solo per il progetto corrente e memorizzate in .git / config nella directory del progetto.
  • globale : le configurazioni globali sono disponibili per tutti i progetti per l'utente corrente e archiviate in ~ / .gitconfig.
  • sistema : le configurazioni di sistema sono disponibili per tutti gli utenti / progetti e memorizzate in / etc / gitconfig.

Crea una configurazione specifica del progetto, devi eseguirla nella directory del progetto:

$ git config user.name "John Doe" 

Crea una configurazione globale:

$ git config --global user.name "John Doe"

Crea una configurazione di sistema:

$ git config --system user.name "John Doe" 

E come puoi immaginare, il progetto ha la precedenza sul sistema globale e globale.


69
Esiste la possibilità di configurare alcune "directory"? Faccio qualche lavoro a casa e ho cartelle con progetti di lavoro e il mio. Quindi ho cartelle ~ / job e ~ / my con repository git e voglio diverse configurazioni per i progetti sotto di loro. Ad esempio, job / project1 ha una configurazione da job / .gitconfig.
Serge

2
@Serge hai mai capito se era possibile creare una configurazione a livello di directory? Ho lo stesso problema in questo momento.
Interrogazione

2
No, ho impostato la configurazione generale del sistema sui dati personali e ho creato lo script bash per impostare i dati del lavoro su determinate configurazioni del progetto in un solo comando.
Serge

1
Come addendum: basta git config user.nameo git config user.emailti mostrerà il nome o l'e-mail che Git utilizzerà per il repository corrente.
Abhishek Divekar,

1
Ho finito per farlo per zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , spero che questo aiuti qualcuno.
pgarciacamou,

219

A partire dalla versione 2.13 di git, git supporta la configurazione condizionale inclusa . In questo esempio cloniamo i repository della società A nella ~/company_adirectory e i repository della società B in ~/company_b.

Nel tuo .gitconfigpuoi mettere qualcosa del genere.

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

Contenuti di esempio di .gitconfig-company_a

[user]
name = John Smith
email = john.smith@companya.net

Contenuti di esempio di .gitconfig-company_b

[user]
name = John Smith
email = js@companyb.com

1
È bello vedere che questo è stato aggiunto nella versione 2.13. Ho usato github.com/bddenhartog/git-profiles per un po ', ma non sono riuscito a farlo funzionare con Tower.
adrum,

4
includeSe è un po 'schizzinoso, vedi: stackoverflow.com/questions/43919191/…
rublo

La pagina della documentazione a cui ti sei collegato non menziona questo ... in effetti, la ricerca di includeSe non produce alcun risultato nella documentazione
Thomas Levesque,

1
@ThomasLevesque È strano. Sono sicuro che ha detto qualcosa al riguardo prima. Puoi trovarlo nel registro delle
modifiche

2
@JosephLust devi installare git> = 2.13 (Ubuntu 16.04 ha git 2.7) . Ottieni l'ultima versione di Git tramite Git PPA e funzionerà :)
Cas

24

Grazie @ crea1

Una piccola variante:

Come è scritto su https://git-scm.com/docs/git-config#_includes :

Se il motivo termina con /, **verrà aggiunto automaticamente. Ad esempio, il modello foo/diventa foo/**. In altre parole, corrisponde fooe tutto dentro, ricorsivamente.

Quindi uso nel mio caso
~ / .gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

Quindi, se la directory del progetto è nella mia ~/wokspace/, le impostazioni utente predefinite vengono sostituite con
~ / .gitconfig-w :

[user]
name = John Smith
email = js@company.com

Fatto ciò, ora il nome utente e l'e-mail corretti sono impostati in directory diverse. Quando eseguo git config user.name / git config user.email ottengo i dettagli corretti. Ma quando commento nei repository personali, raccoglie sempre e
Bhupendra,

@Bhupendra Nel mio esempio, .gitconfig e .gitconfig-job sono nella mia casa, non nelle directory del progetto. Ne hai bisogno di più di due? Hai creato un .gitconfig-alternativ nella tua home directory, come mio lavoro .gitconfig nel mio esempio, con 3 righe.
bcag2,

@ bcag2 Anch'io ho seguito lo stesso esempio di cui sopra. Ho 2 configurazioni configurate come predefinite e personali simili a gitconfig-job. Quando mi trovo nella directory personale, su git config user.name mi dà il nome corretto ma per spingere il commit prende quello predefinito mentre ho bisogno di quello personale.
swapnil2993

@ swapnil2993 prima penso al problema del percorso, ma se git config user.namerestituisci quello corretto, dovrebbe essere ok. Sei su GNU / Linux o altri sistemi operativi?
bcag2

@ bcag2 Risolto il problema. Ho appena corretto il percorso. Ma git config user.name che restituiva il valore corretto era strano. Grazie per la risposta.
swapnil2993,

14

Per essere espliciti, è anche possibile utilizzare --localper utilizzare il file di configurazione del repository corrente :

git config --local user.name "John Doe" 

12

È inoltre possibile puntare la variabile di ambiente GIT_CONFIGsu un file che git configdovrebbe usare. Con GIT_CONFIG=~/.gitconfig-A git config key valueil file specificato viene manipolato.


2
Freddo; con un po 'di magia shell intelligente questo può essere usato per impostare le cose in modo che git raccolga il primo .gitconfig che trova quando attraversa l'albero dir sopra il repository corrente. Grazie!
ecmanaut,

1
Hai un link a questa magia shell che fa questo? Sembra utile!
pchiusano,

1
@pchiusano eccone una versione rudimentale in fish github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root

Grazie per una soluzione semplice che richiede solo la modifica di una variabile di ambiente.
Noah Sussman,

influenza solo il comando git config ora github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

12

Lo sto facendo per la mia e-mail nel modo seguente:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

Quindi, quando clonerò un nuovo progetto di lavoro, devo solo eseguirlo git hobbyprofilee sarà configurato per usare quell'e-mail.


3

Un altro modo è usare direnv e separare i file di configurazione per directory. Per esempio:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

Ognuno .envrcdovrebbe contenere qualcosa del genere:

export GIT_CONFIG=$(pwd)/.gitconfig

Ed .gitconfigè solito gitconfig con i valori desiderati.


2

È possibile personalizzare la configurazione Git di un progetto modificando il file di configurazione specifico del repository (ad es /path/to/repo/.git/config.). A proposito, git configscrive in questo file per impostazione predefinita:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

Preferisco creare profili separati per diversi progetti (ad es. In ~/.gitconfig.d/) e quindi includerli nel file di configurazione del repository:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

Funziona bene se è necessario utilizzare lo stesso set di opzioni in più repository appartenenti a un singolo progetto. Puoi anche impostare alias di shell o un comando Git personalizzato per manipolare i profili.


0

Sono nella stessa barca. Ho scritto un piccolo script bash per gestirli. https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

Il tuo script qui è in Bash, mentre su Github hai la versione di Python. Inoltre -snon è gestito nel tuo script Bash.
Vadim Kotov,

0

Ho riscontrato un errore durante il tentativo di git stashapportare modifiche locali. L'errore di git diceva "Per favore dimmi chi sei" e poi mi ha detto di "Esegui git config --global user.email "you@example.come git config --global user.name "Your name"impostare l'identità predefinita del tuo account". Tuttavia, è necessario Omettere --global per impostare l'identità solo nel repository corrente.

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.