Чи можливо мати різні конфігурації Git для різних проектів?


315

.gitconfigзазвичай зберігається в user.homeкаталозі.

Я використовую іншу особистість для роботи над проектами для компанії A і ще чимось для компанії B (насамперед ім'я / електронна адреса). Як я можу створити дві різні конфігурації Git, щоб мої реєстрації не імені / електронної пошти?

Відповіді:


264

.git/configФайл в певному клоном сховища є локальним для цього клону. Будь-які налаштування, розміщені там, впливатимуть лише на дії конкретного проекту.

(За замовчуванням git configвидозмінюється .git/config, не ~/.gitconfig- лише коли --globalвін змінює останнє.)


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

283

Є 3 рівні конфігурації git; проект, глобальний та системний.

  • проект : Конфігурації проекту доступні лише для поточного проекту та зберігаються у .git / config у каталозі проекту.
  • global : глобальні конфігурації доступні для всіх проектів для поточного користувача та зберігаються у ~ / .gitconfig.
  • Система : Конфігурації системи доступні для всіх користувачів / проектів і зберігаються в / etc / gitconfig.

Створіть конфігурацію конкретного проекту. Ви повинні виконати це в каталозі проекту:

$ git config user.name "John Doe" 

Створіть глобальну конфігурацію:

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

Створіть конфігурацію системи:

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

І як ви здогадуєтесь, проект перекриває глобальну та глобальну систему перекриття.


69
Чи є можливість зробити якийсь конфігурацію "каталогу"? Я займаюсь якоюсь роботою вдома і маю папки з робочими проектами і своїми. Тому я отримав папки ~ / job і ~ / my з git repos і хочу різних конфігурацій для проектів під ними. Наприклад, завдання / project1 має конфігурацію з job / .gitconfig.
Серж

2
@Serge Ви коли-небудь з'ясовували, чи можна створити конфігурацію рівня каталогів? У мене зараз те саме питання.
Допит

2
Ні, я встановлюю загальну конфігурацію системи для особистих даних і складаю bash script для встановлення даних завдання для певних конфігурацій проекту в одній команді.
Серж

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

1
Чудово бачити, що це було додано у версії 2.13. Я деякий час використовував github.com/bddenhartog/git-profiles , але не міг змусити його працювати з Tower.
adrum

4
includeЯкщо трохи вибагливо, дивіться: stackoverflow.com/questions/43919191/…
рубль

Сторінка документації, на яку ви посилаєтесь, не згадує про це ... насправді, пошук включитиЯкщо не дасть жодного результату в документації
Томас Левеск

1
@ThomasLevesque Це дивно. Я впевнений, що раніше про це щось говорилося. Ви можете знайти його в changelog 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

Зробив це, тепер правильне ім’я користувача та електронна адреса встановлено в різних каталогах. Коли я роблю git config user.name / git config user.email, я отримую правильні дані. Але коли я коментую в особистому репо, воно завжди отримує глобальний офіційний електронний лист користувача
Bhupendra

@Bhupendra У моєму зразку робота .gitconfig та .gitconfig - у мене вдома, а не в каталогах проектів. Вам потрібно більше двох? Чи створили ви .gitconfig-alternativ у своєму домашньому каталозі, як мій .gitconfig-завдання в моєму зразку, з 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, яку він виявляє, коли обходить дерево dir вище поточного репо. Дякую!
еманаут

1
Чи є у вас посилання на цю магію оболонки, яка робить це? Звучить корисно!
pchiusano

1
@pchiusano ось рудиментарна версія його в рибі github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
-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і він буде налаштований на використання цього електронного листа.


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). BTW, 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

Ваш сценарій тут знаходиться в 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, щоб встановити особу лише у вашому поточному сховищі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.