Est-il possible d'avoir une configuration Git différente pour différents projets?


315

.gitconfigest généralement stocké dans le user.homerépertoire.

J'utilise une identité différente pour travailler sur des projets pour la société A et autre chose pour la société B (principalement le nom / e-mail). Comment puis-je avoir deux configurations Git différentes pour que mes enregistrements ne correspondent pas au nom / e-mail?

Réponses:


264

Le .git/configfichier d'un clone particulier d'un référentiel est local à ce clone. Tous les paramètres qui y sont placés affecteront uniquement les actions pour ce projet particulier.

(Par défaut, git configmodifie .git/config, non ~/.gitconfig- seulement avec --globalmodifie-t-il ce dernier.)


la modification du fichier de configuration dans la configuration du dépôt lui-même, par exemple le changement de [user] email = ...bloc, remplacera-t-elle le global ~/.gitconfig- et cela ne concerne que votre utilisateur?
dcsan

285

Il existe 3 niveaux de configuration git; projet, global et système.

  • projet : les configurations de projet sont uniquement disponibles pour le projet en cours et stockées dans .git / config dans le répertoire du projet.
  • global : les configurations globales sont disponibles pour tous les projets pour l'utilisateur actuel et stockées dans ~ / .gitconfig.
  • system : Les configurations système sont disponibles pour tous les utilisateurs / projets et stockées dans / etc / gitconfig.

Créez une configuration spécifique au projet, vous devez l'exécuter sous le répertoire du projet:

$ git config user.name "John Doe" 

Créez une configuration globale:

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

Créez une configuration système:

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

Et comme vous pouvez le deviner, le projet remplace le système global et le système global.


69
Est-il possible de faire une configuration "répertoire"? Je fais du travail à la maison et j'ai des dossiers avec des projets de travail et les miens. J'ai donc obtenu les dossiers ~ / job et ~ / my avec git repos et je veux différentes configurations pour les projets sous eux. Par exemple, job / project1 a la configuration de job / .gitconfig.
Serge

2
@Serge avez-vous déjà compris s'il était possible de créer une configuration au niveau du répertoire? J'ai le même problème en ce moment.
Interrogatoire le

2
Non, je définis la configuration globale du système sur des données personnelles et je crée un script bash pour définir les données de travail sur certaines configurations de projet en une seule commande.
Serge

1
En complément: juste git config user.nameou git config user.emailvous montrera le nom ou l'email que Git utilisera pour le référentiel actuel.
Abhishek Divekar

1
J'ai fini par faire cela pour zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , j'espère que cela aide quelqu'un.
pgarciacamou

219

À partir de la version 2.13 de git, git prend en charge les configurations conditionnelles incluses . Dans cet exemple, nous clonons les référentiels de la société A dans le ~/company_arépertoire et les référentiels de la société B dans ~/company_b.

Dans votre, .gitconfigvous pouvez mettre quelque chose comme ça.

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

Exemple de contenu de .gitconfig-company_a

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

Exemple de contenu de .gitconfig-company_b

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

1
C'est formidable de voir que cela a été ajouté dans la version 2.13. J'utilise github.com/bddenhartog/git-profiles depuis un certain temps, mais je n'ai pas pu le faire fonctionner avec Tower.
adrum

4
includeIf est un peu capricieux, voir: stackoverflow.com/questions/43919191/…
rouble

La page de documentation à laquelle vous avez lié ne le mentionne pas ... en fait, la recherche de includeIf ne donne aucun résultat dans la documentation
Thomas Levesque

1
@ThomasLevesque C'est bizarre. Je suis sûr qu'il en a déjà parlé. Vous pouvez le trouver dans le changelog github.com/git/git/blob/master/Documentation/RelNotes/… et aussi sur kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust vous devez installer git> = 2.13 (Ubuntu 16.04 a git 2.7) . Obtenez la dernière version de git via Git PPA et cela fonctionnera :)
Cas

24

Merci @ crea1

Une petite variante:

Comme il est écrit sur https://git-scm.com/docs/git-config#_includes :

Si le motif se termine par /, **sera automatiquement ajouté. Par exemple, le motif foo/devient foo/**. En d'autres termes, cela correspond à footout ce qui se trouve à l'intérieur, récursivement.

J'utilise donc dans mon cas,
~ / .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…

Donc, si le répertoire du projet est dans my ~/wokspace/, les paramètres utilisateur par défaut sont remplacés par
~ / .gitconfig-w :

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

Terminé, le nom d'utilisateur et l'adresse e-mail sont désormais corrects dans différents répertoires. Quand je fais git config user.name / git config user.email j'obtiens les détails corrects. Mais quand je commente dans le repo personnel, il récupère toujours l'e
Bhupendra

@Bhupendra Dans mon exemple, .gitconfig et .gitconfig-job se trouvent chez moi, pas dans les répertoires du projet. Avez-vous besoin de plus de deux? Avez-vous créé un .gitconfig-alternativ dans votre répertoire personnel, comme mon travail .gitconfig dans mon exemple, avec 3 lignes.
bcag2

@ bcag2 J'ai moi aussi suivi le même exemple donné ci-dessus. J'ai 2 configs fonctionnent celle par défaut et personnelle similaire à gitconfig-job. Quand je suis dans le répertoire personnel, sur git config user.name me donne le nom correct mais pour pousser le commit il prend le défaut alors que j'ai besoin du personnel.
swapnil2993

@ swapnil2993 d'abord, je pense au problème de chemin, mais si le git config user.nameretour est correct, cela devrait être ok. Êtes-vous sous GNU / Linux ou autre OS?
bcag2

@ bcag2 Résolu le problème. Je viens de corriger le chemin. Mais git config user.name renvoyant la valeur correcte était bizarre. Merci d'avoir répondu.
swapnil2993

14

Pour être explicite, vous pouvez également utiliser --localpour utiliser le fichier de configuration du référentiel actuel :

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

12

Vous pouvez également pointer la variable d'environnement GIT_CONFIGvers un fichier à git configutiliser. Avec GIT_CONFIG=~/.gitconfig-A git config key valuele fichier spécifié est manipulé.


2
Cool; avec un peu de magie de shell intelligente, cela peut être utilisé pour configurer les choses afin que git sélectionne le premier .gitconfig qu'il trouve lors de la traversée de l'arborescence dir au-dessus du dépôt actuel. Merci!
ecmanaut

1
Avez-vous un lien vers cette magie shell qui fait cela? Cela semble utile!
pchiusano

1
@pchiusano en voici une version rudimentaire dans fish github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root

Merci pour une solution simple qui ne nécessite de changer qu'une seule variable d'environnement.
Noah Sussman

cela n'affecte que la commande git config maintenant github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

12

Je fais cela pour mon e-mail de la manière suivante:

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

Ensuite, lorsque je clone un nouveau projet de travail, je n'ai qu'à exécuter git hobbyprofileet il sera configuré pour utiliser cet e-mail.


3

Une autre façon consiste à utiliser direnv et à séparer les fichiers de configuration par répertoire. Par exemple:

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

Chacun .envrcdevrait contenir quelque chose comme ceci:

export GIT_CONFIG=$(pwd)/.gitconfig

Et .gitconfigest gitconfig habituel avec les valeurs souhaitées.


2

Vous pouvez personnaliser la configuration Git d'un projet en modifiant le fichier de configuration spécifique au référentiel (c'est-à-dire /path/to/repo/.git/config). BTW, git configécrit dans ce fichier par défaut:

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

Je préfère créer des profils distincts pour différents projets (par exemple dans ~/.gitconfig.d/), puis les inclure dans le fichier de configuration du référentiel:

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

Cela fonctionne bien si vous devez utiliser le même ensemble d'options dans plusieurs référentiels appartenant à un même projet. Vous pouvez également configurer des alias de shell ou une commande Git personnalisée pour manipuler les profils.


0

Je suis dans le meme bateau. J'ai écrit un petit script bash pour les gérer. 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

Votre script est ici en Bash, alors que sur Github vous avez la version Python. Aussi -sn'est pas géré dans votre script Bash.
Vadim Kotov

0

J'ai eu une erreur lors de la tentative de git stashmodifications locales. L'erreur de git a dit "S'il vous plaît, dites-moi qui vous êtes", puis dites-moi "Exécuter git config --global user.email "you@example.comet git config --global user.name "Your name"définir l'identité par défaut de votre compte". Cependant, vous devez omettre --global pour définir l'identité uniquement dans votre référentiel actuel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.