Возможно ли иметь разные конфигурации Git для разных проектов?

315

.gitconfigобычно хранится в user.homeкаталоге.

Я использую другую личность для работы над проектами для компании A и что-то еще для компании B (прежде всего имя / адрес электронной почты). Как я могу иметь две разные конфигурации Git, чтобы мои проверки не сопровождались именем / адресом электронной почты?

прийа
источник

Ответы:

264

.git/configФайл в определенном клоном хранилища является локальным для этого клона. Любые настройки, размещенные там, влияют только на действия для этого конкретного проекта.

(По умолчанию git configмодифицирует .git/config, а не ~/.gitconfig- только --globalон изменяет последний.)

янтарный
источник
поэтому изменение файла конфигурации в конфигурации для самого репо, например изменение [user] email = ...блока, переопределит глобальное ~/.gitconfig- и это только для вашего пользователя?
dcsan
285

Есть 3 уровня git config; проектный, глобальный и системный.

  • проект : Конфиги проекта доступны только для текущего проекта и хранятся в .git / config в каталоге проекта.
  • global : Глобальные конфигурации доступны для всех проектов для текущего пользователя и хранятся в ~ / .gitconfig.
  • system : системные конфигурации доступны для всех пользователей / проектов и хранятся в / etc / gitconfig.

Создайте специфичный для проекта конфиг, вы должны выполнить его в каталоге проекта:

$ git config user.name "John Doe" 

Создайте глобальный конфиг:

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

Создайте конфигурацию системы:

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

И, как вы можете догадаться, проект переопределяет глобальную и глобальную систему переопределений.

teymourlouie
источник
69
Есть ли возможность сделать какой-нибудь "каталогный" конфиг? Я делаю работу дома и получаю папки с рабочими проектами и своими собственными. Поэтому я получил папки ~ / job и ~ / my с git-репозиториями и хочу разные конфиги для проектов под ними. Например, задание / проект1 имеет конфигурацию из задания / .gitconfig.
Серж
2
@ Serge, вы когда-нибудь выясняли, возможно ли создать конфигурацию на уровне каталога? У меня сейчас такая же проблема.
Опрос :
2
Нет. Я устанавливаю общую конфигурацию системы для персональных данных и создаю сценарий bash для установки данных задания для определенных конфигураций проекта в одной команде.
Серж
1
В качестве дополнения: просто git config user.nameили git config user.emailпокажу вам имя или адрес электронной почты, которые Git будет использовать для текущего репозитория.
Абхишек Дивекар
1
В итоге я сделал это для zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , надеюсь, это кому-нибудь поможет.
pgarciacamou
219

Начиная с git версии 2.13, git поддерживает условную конфигурацию включает в себя . В этом примере мы клонируем репо компании A в ~/company_aкаталоге, а репозитории компании B в ~/company_b.

В вашей .gitconfigвы можете положить что-то вроде этого.

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

Пример содержимого .gitconfig-company_a

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

Пример содержимого .gitconfig-company_b

[user]
name = John Smith
email = js@companyb.com
crea1
источник
1
Приятно видеть, что это было добавлено в версии 2.13. Некоторое время я использовал github.com/bddenhartog/git-profiles , но не смог заставить его работать с Tower.
Adrum
4
includeIf немного привередливый, см .: stackoverflow.com/questions/43919191/…
рубль
Страница документации, на которую вы ссылаетесь, не упоминает об этом ... на самом деле, поиск includeIf не приводит к каким-либо результатам в документации
Томас Левеск,
1
@ThomasLevesque Это странно. Я уверен, что это уже говорило об этом раньше. Вы можете найти его в журнале изменений github.com/git/git/blob/master/Documentation/RelNotes/…, а также в kernel.org/pub/software/scm/git/docs/git-config.html
crea1
2
@JosephLust вам нужно установить git> = 2.13 (в Ubuntu 16.04 есть git 2.7) . Получить последнюю версию git через Git PPA, и она будет работать :)
Cas
24

Спасибо @ crea1

Небольшой вариант:

Как написано на https://git-scm.com/docs/git-config#_includes :

Если шаблон заканчивается /, **будет добавлен автоматически. Например, шаблон foo/становится foo/**. Другими словами, это соответствует fooи все внутри, рекурсивно.

Поэтому я использую в моем случае
~ / .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…

Поэтому, если каталог проекта находится в моем ~/wokspace/, пользовательские настройки по умолчанию заменяются на
~ / .gitconfig-w :

[user]
name = John Smith
email = js@company.com
bcag2
источник
Сделано это, теперь правильное имя пользователя и адрес электронной почты установлены в разных каталогах. Когда я делаю git config user.name / git config user.email, я получаю правильные данные. Но когда я комментирую в личном репо, он всегда берет глобальное официальное имя пользователя электронной почты
Bhupendra
@Bhupendra В моем примере .gitconfig и .gitconfig-job находятся у меня дома, а не в каталогах проектов. Тебе нужно больше двух? Сделайте, чтобы вы создали .gitconfig-alternativ в своем домашнем каталоге, как мой .gitconfig-job в моем примере, с 3 строками.
bcag2
@ bcag2 Я тоже последовал тому же примеру, что и выше. У меня 2 конфига работают по умолчанию и личный похож на gitconfig-job. Когда я нахожусь в личном каталоге, в git config user.name дает мне правильное имя, но для отправки коммита он принимает значение по умолчанию, тогда как мне нужен личный.
swapnil2993
@ swapnil2993 сначала я думаю о проблеме пути, но если git config user.nameвозвращать правильный, все должно быть в порядке. Вы находитесь под GNU / Linux или другой ОС?
bcag2
@ bcag2 Решил проблему. Просто исправил путь. Но git config user.name, возвращающий правильное значение, был странным. Спасибо за ответ.
swapnil2993
14

Чтобы быть явным, вы также --localможете использовать текущий конфигурационный файл репозитория :

git config --local user.name "John Doe" 
мим
источник
12

Вы также можете указать переменную окружения GIT_CONFIGна файл, который git configследует использовать. С GIT_CONFIG=~/.gitconfig-A git config key valueуказанным файлом манипулируют.

Стефан Наве
источник
2
Прохладно; с небольшим количеством хитрой магии оболочки это можно использовать для настройки, так что git выбирает первый .gitconfig, который он находит при обходе дерева каталогов выше текущего репо. Спасибо!
экманавт
1
У вас есть ссылка на эту магию оболочки, которая делает это? Звучит полезно!
pchiusano
1
@pchiusano вот его элементарная версия в рыбе github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root
Спасибо за простое решение, которое требует изменения только одной переменной среды.
Ноа Суссман
теперь это влияет только на команду git config github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010
12

Я делаю это для своей электронной почты следующим образом:

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

Затем, когда я клонирую новый рабочий проект, мне остается только запустить git hobbyprofileего, и он будет настроен для использования этого электронного письма.

ivand58
источник
3

Другой способ - использовать direnv и разделять конфигурационные файлы на каталог. Например:

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

Каждый .envrcдолжен содержать что-то вроде этого:

export GIT_CONFIG=$(pwd)/.gitconfig

И .gitconfigэто обычный gitconfig с желаемыми значениями.

Немец Лашевич
источник
2

Вы можете настроить конфигурацию Git проекта, изменив файл конфигурации конкретного хранилища (то есть /path/to/repo/.git/config). Кстати, git configпишет в этот файл по умолчанию:

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

Я предпочитаю создавать отдельные профили для разных проектов (например, в ~/.gitconfig.d/) и затем включать их в конфигурационный файл репозитория:

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

Это хорошо работает, если вам нужно использовать один и тот же набор параметров в нескольких репозиториях, которые принадлежат одному проекту. Вы также можете настроить псевдонимы оболочки или пользовательскую команду Git для управления профилями.

Евгений Ярмаш
источник
0

Я в одной лодке. Я написал небольшой скрипт для управления ими. 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
netizen24601
источник
Ваш скрипт здесь на Bash, а на Github у вас есть версия Python. Также -sне обрабатывается в вашем скрипте Bash.
Вадим Котов
0

У меня была ошибка при попытке git stashмоих локальных изменений. Ошибка от git гласила: «Пожалуйста, скажи мне, кто ты», а затем сказал: «Запустить git config --global user.email "you@example.comи git config --global user.name "Your name"установить личность учетной записи по умолчанию». Однако вы должны опустить --global, чтобы установить идентичность только в вашем текущем хранилище.

Эрих Мейснер
источник