Чи можу я вказати декількох користувачів у .gitconfig?


754

У своєму ~/.gitconfigсписку я перелічу мою особисту адресу електронної пошти [user], оскільки саме це я хочу використовувати для репостів Github.

Але я нещодавно почав використовувати git і для роботи. Моя компанія git repo дозволяє мені здійснювати зобов’язання, але коли вона надсилає анонси нових наборів змін, вона каже, що вони від Anonymous, оскільки вона не розпізнає адресу електронної пошти в моїй, .gitconfigпринаймні, це моя теорія.

Чи можна вказати кілька [user]визначень у .gitconfig? Або існує якийсь інший спосіб змінити типовий параметр .gitconfigдля певного каталогу? У моєму випадку я перевіряю весь робочий код ~/worksrc/- чи є спосіб вказати лише .gitconfigдля цього каталогу (та його підкаталогів)?



1
Я здивований, що сервер вашої компанії зробив би це - йому доведеться ЗМІНУТИ ша ваші зобов'язання, щоб це працювало. Якщо ви берете на себе місцеву реєстрацію, яке ім'я користувача ви бачите?
Алекс Браун

1
@Alex: Забув важливий біт там - це може бути просто ім'я в повідомленні електронною поштою, насправді нічого не змінюючи на комісії.
Каскабель

1
Ви можете використовувати git-гак для автоматизації цієї повторюваної роботи: github.com/DrVanScott/git-clone-init
Геннінг

1
Прийміть цю відповідь: stackoverflow.com/a/43654115/482899 . Це найкраще рішення з git 2.13.
northtree

Відповіді:


1016

Ви можете налаштувати індивідуальне репо, щоб використовувати конкретну адресу користувача / електронну пошту, яка перекриває глобальну конфігурацію. Від кореня репо запустіть

git config user.name "Your Name Here"
git config user.email your@email.com

тоді як користувач / електронна пошта за замовчуванням налаштовано у вашій ~ / .gitconfig

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

83
ви можете побачити ефекти цих налаштувань у .git/configфайлі
Abizern

21
Ви можете вручну редагувати ці конфігураційні файли за допомогою git config --editта git config --global --edit. І якщо ви пропустили коментар Abizern , конфігураційний файл сховища знаходиться в <repo-root>/.git/config.
Rory O'Kane

13
Ви також повинні скасувати GIT_AUTHOR_EMAIL та GIT_COMMITTER_EMAIL (і * _NAME), оскільки вони перекриють локальні налаштування
ACyclic

6
Чи є спосіб зробити це для всіх репостів у певній папці, а не для окремих репостів? Дивіться моє запитання тут: stackoverflow.com/questions/21307793 / ...
scubbo

6
Дивіться цю відповідь нижче для більш сучасного рішення з Git 2.13випущеним сьогодні.
tejasbubane

489

Оскільки git 2.13 , це можна вирішити за допомогою нещодавно введених умовних включає .

Приклад:

Глобальна конфігурація ~ / .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

Робота конкретної конфігурації ~ / work / .gitconfig

[user]
    email = john.doe@company.tld

48
Це найкраща відповідь зараз, коли вийшов git 2.13.
tejasbubane

1
Чи буде це рішення працювати у всіх підкаталогах в одному із зазначених у операторі include, якщо у них немає власних файлів .gitconfig? Я би так подумав, але поки тестування цього не підтверджувало.
Гері

2
@Gary Так, згідно з моїм досвідом та документами: "Якщо шаблон закінчиться на /, ** буде додано автоматично. Наприклад, візерунок foo / стає foo / **. Іншими словами, він відповідає "foo" і все, що знаходиться всередині, рекурсивно. ","; включити для всіх сховищ у $ HOME / to / group [includeIf "gitdir: ~ / to / group /"] "
Tomáš Janoušek

6
Gitdir повинен включати останній «/».
Кріс Йім

5
Ви можете перевірити, що він працює рекурсивно, запустивши git config --listв різні каталоги. У підкаталогах, ~/work/що містять сховище git, includeIfефект набуває чинності. Зауважте, що у підкаталогах цього вмісту ~/work/не зберігається git сховище, includeIfвоно не виконується.
NZD

104

Або ви можете додати наступну інформацію у свій локальний .git/configфайл

[user]  
    name = Your Name
    email = your.email@gmail.com

27
... це ручний спосіб зробити те, що команди, рекомендовані @discomurray, роблять для вас.
користувач456584

1
чи можна додати кілька рядків цього на віддалений?
Abel Callejo

55

Один командний перемикач рахунків github

Це рішення має форму єдиного псевдоніма git. Після виконання поточний користувач проекту буде приєднаний до іншого облікового запису

Створення ключів ssh

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Пов’язати їх зі своїми обліковими записами GitHub / Bitbucket

  1. скопіювати відкритий ключ за замовчуванням pbcopy < ~/.ssh/id_rsa.pub
  2. увійдіть на рахунок GitHub
  3. вставте ключ на add SSH keyсторінку github
  4. скопіюйте інший відкритий ключ pbcopy < ~/.ssh/id_rsa_pro.pub
  5. повторити та адаптувати кроки 2 - 4 для кожного іншого облікового запису

Крок 1. Автоматичне перемикання клавіш ssh.

Ми можемо налаштувати sshнадіслати користування певний ключ шифрування залежно від host. Приємно те, що ви можете мати кілька псевдонімів для одного і того ж hostname.

Дивіться цей приклад ~/.ssh/configфайлу:

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

git віддаленої конфігурації

Тепер ви можете використовувати ці псевдоніми в GIT пультах, змінюючи з git@github.comдопомогою git@github_pro.

Ви можете або змінити існуючі віддалені проекти (використовуючи щось на зразок git remote set-url origin git@github_pro:foo/bar.git), або адаптувати їх безпосередньо під час клонування.

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

використовуючи псевдонім, він стає:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

Крок 2. Зміна git user.email

Налаштування конфігурації Git можуть бути глобальними або за проектом. У нашому випадку ми потребуємо налаштувань кожного проекту. Це дуже легко змінити:

git config user.email 'arnaud.rinquin@wopata.com'

Хоча це легко, але розробникам, які ми є, потрібно довго шукати. Для цього ми можемо написати дуже простий псевдонім git.

Ми додамо його до ~/.gitconfigфайлу.

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

Тоді все, що нам потрібно зробити, - це git setpromailзмінити нашу електронну пошту лише для цього проекту.

Крок 3. Один командний комутатор, будь ласка ?!

Чи не було б приємно перейти з облікового запису за замовчуванням на вказаний з допомогою однієї команди без параметрів? Це, безумовно, можливо. Ця команда матиме два етапи:

  • зміни поточного віддаленого проекту на вибрані псевдоніми
  • змінити поточний конфігурацію user.email проекту

У нас вже є одне командне рішення для другого кроку, але перший - складніше. Зміна віддаленого хоста однієї команди

Тут з'являється рішення у вигляді іншої команди git alias, яку слід додати до вашого ~/.gitconfig:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

Це дозволяє змінювати всі віддалені пристрої з одного хоста на інший (псевдонім). Дивіться приклад:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

Поєднайте їх усіх

Нам зараз просто потрібно поєднати дві команди в одну, це досить просто. Подивіться, як я також інтегрую комутацію хостів бітбукета.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Посилання на джерело -Навчальний посібник


Це геніально, дякую. Я працюю з купою репостів на електронну пошту, тому мій setpromailпсевдонім робить config --globalзамість цього (і у мене є інші встановлені псевдоніми для встановлення різних адрес електронної пошти). Це працює!
michel-slm

1
Як для цих 2 різних облікових записів я можу підписати різні клавіші gpg? У мене є 2x gpg ключі для 2x акаунтів github, і я хотів би підписати інакше. "git config --global user.signingkey xxxx"
hakkican

Ця відповідь приголомшлива. Я майже не прочитав його, бо думав, що знайшов те, що з іншої відповіді. Однозначно заслуговує на більше грошей. PS. Ще краще, якщо поєднати з useConfigOnly = trueіншою відповіддю.
steinybot

Не IdentifyFile, це IdenfityFile.
Крістіан

40

Отримавши трохи натхнення з публікації в блозі Орра Селла, я написав гачок, що попередньо здійснює комісію (проживає в ~/.git/templates/hooksякій), в якій встановлюватимуться конкретні імена користувачів та адреси електронної пошти на основі інформації всередині локального сховища ./.git/config:

Ви повинні розмістити шлях до каталогу шаблонів у свій ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

Тоді кожен git initабо git cloneпідбере цей гачок і застосує дані користувача протягом наступного git commit. Якщо ви хочете застосувати гачок до вже існуючих репостів, просто запустіть git initвнутрішню частину репо, щоб повторно її активізувати.

Ось гачок, який я придумав (він ще потребує певної полірування - пропозиції вітаються). Збережіть це як

~/.git/templates/hooks/pre_commit

або

~/.git/templates/hooks/post-checkout

і переконайтеся, що він виконується: chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

Редагувати:

Тому я переписав гачок як гачок і команду в Python. Крім того, скрипт можна викликати також командою Git ( git passport). Також можна визначити довільну кількість ідентифікаторів всередині конфігураційного файлу ( ~/.gitpassport), які можна вибирати у запиті. Ви можете знайти проект на сайті github.com: git-passport - команда Git та гачок, написані на Python для управління кількома обліковими записами / особами користувача Git .


1
Це працює акуратно. Однак для мене це працювало краще, зробивши цю гачку після оформлення замовлення (замість після завершення). Мої пропозиції щодо вдосконалення цієї відповіді: зауважте, що: 1. фрагмент потрібно зберегти як ~ / .git / шаблони / гачки / після перевірки та отримати дозвіл chmod +x post-checkout; 2. git_remotesзначення починаються з частини всього імені хоста, наприклад git@github.com, 3. local_idЗначення повинні редагуватися користувачем на відповідні імена та адреси електронної пошти.
Шантану Кумар

@ShantanuKumar Дякуємо за ваш коментар Я скоригував відповідь, як ви запропонували. Можливо, незабаром перепишу сценарій на Python.
Сосьє

Додана підтримка регулярних виразів та сховищ без віддалених файлів. Для легкого завантаження тут усі об'єднані . Regexps для розрізнення ідентичності для різних проектів на одній службі. І підтримувати віддалені репозиції, наприклад, ідентифікація за замовчуванням, має сенс, якщо ви git initстворюєте нові проекти з IDE, такі як eclipse(які не можуть працювати з інтерактивними тригерами попереднього здійснення)
cfi

25

Якщо ви не хочете мати електронну адресу за замовчуванням (адреса електронної пошти посилається на користувача github ), ви можете налаштувати те, що вам потрібно запитати. Як це зробити, залежить від версії git, яку ви використовуєте, дивіться нижче.

Недолік (призначений) полягає в тому, що вам потрібно налаштувати свою адресу електронної пошти (та своє ім’я) один раз для кожного сховища. Отже, ви не можете забути це зробити.

Версія <2.7.0

[user]
    name = Your name
    email = "(none)"

у вашій глобальної конфігурації , ~/.gitconfigяк зазначено в коментарі Ден Aloni в блозі Орр Sella в . При спробі зробити першу фіксацію у сховищі, git не вдається з приємним повідомленням:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

Ім'я береться з глобальної конфігурації, коли електронна адреса задана локально (повідомлення не є абсолютно точним).

2.7.0 ≤ Версія <2.8.0

Поведінка у версіях <2.7.0 не передбачалася та фіксувалась із 2.7.0. Ви все ще можете використовувати гачок, який попередньо здійснює, як описано у публікації до блогу Орра Селла . Це рішення працює і для інших версій, але інші рішення не для цієї версії.

Версія ≥ 2.8.0

Ден Алоні додав можливість досягти такої поведінки (див. Примітки до випуску ). Використовуйте його з:

[user]
    useConfigOnly = true

Щоб він працював, ви не можете вказувати ім’я чи електронну адресу в глобальній конфігурації. Потім, при першій фіксації, ви отримуєте повідомлення про помилку

fatal: user.useConfigOnly set but no name given

Тож повідомлення не дуже повчальне, але оскільки ви чітко встановили параметр, вам слід знати, що робити. На відміну від рішення версій <2.7.0, завжди потрібно встановлювати і ім’я, і електронну пошту вручну.


Я використовую цей метод кілька місяців, він спрацював чудово. У мене є декілька електронних адрес (особистих, робочих), і я не хочу, щоб "глобальний gitconfig" був налаштований за замовчуванням. З особливим значенням "(none)" git запропонує мені ввести дійсну адресу кожного разу, коли я запускаю нове репо, замість того, щоб вгадувати його на основі імені користувача та імені хоста (що дратує, і мені потрібно - змінити його). Однак нещодавно з оновленою версією Git (2.7.0, можливо, і раніше) я з'ясував, що спеціальне значення "(жодне)" більше не викликає фатальних помилок. Натомість він просто використовуватиме "Джон До <(немає)>" як є ...
Чжуюн Вей

@wzyboy: О, ти маєш рацію. Раніше я вважав,git bisect що фіксація 19ce497c ... представила цю поведінку. Однак незалежно від версії (2.5 - 2.7) я можу використовувати email =(без аргументу) в конфігурації, і вона показує таку ж поведінку, що і email = "(none)"в старих версіях. Ви можете це підтвердити? Якщо так, я відредагую свою відповідь. Я просто скептичний, як це здається настільки очевидним, і не використовував його раніше.
Іван

Я спробував email =в 2.7.0, Git все ще здогадується адресу електронної пошти на основі імені користувача та імені хоста. Зараз я використовую pre-commitпідхід у блозі Sella. Я також повідомив Dan Aloni , який придумав з "(none)"ідеєю в пост Селла і він подав на патч , щоб формально реалізувати це як особливість: permalink.gmane.org/gmane.comp.version-control.git/285301
Zhuoyun Вей

3
оскільки git-2.8: змінна конфігурація "user.useConfigOnly" може бути використана для примушування користувача завжди встановлювати user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0. txt
rofrol

@rofrol Дякую за інформацію. Я відповідно оновив свою відповідь.
Джон

24

Завдяки умовному включенню в Git 2.13, тепер можливо існувати кілька користувачів / електронної пошти співіснувати на одній машині з невеликою роботою.

user.gitconfigмає моє особисте ім’я та електронну пошту. work-user.gitconfigмає моє ім’я роботи та електронну пошту. Обидва файли на ~шляху.

Тож моє особисте ім’я / електронна адреса застосовується за замовчуванням. Для c:/work/режисера застосовується моє ім’я / електронна адреса. Для c:/work/github/режисера застосовується моє особисте ім’я / електронна адреса. Це працює, коли застосовується остання установка.

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdirє чутливим до регістру та gitdir/iнечутливим до регістру.

"gitdir/i:github/"застосував би умовне включення для будь-якого каталогу, що має githubна своєму шляху.


Хоча ваша відповідь оцінена і добрий Томаш Янушек дав те саме за 20 днів до вас. Будь ласка, спробуйте видалити цю відповідь.
Хедж

5
@ Hedge Так, я підтримав його відповідь, але мені знадобився певний час, щоб налаштувати вікна, і саме там gitdir/iмені допомогли (що його відповідь не згадує).
hIpPy

Особливий спосіб @hIpPy реалізував це безпосередньо, застосований до мого випадку використання, і зробив це набагато простіше, ніж відповідь Томаша. Я виступив проти обох.
Ісаак Адамс

18

Ще один варіант gitроботи з декількома іменами / електронними повідомленнями - це псевдонім gitта використання -cпрапора для зміни глобальної конфігурації та конкретного сховища.

Наприклад, визначивши псевдонім:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

Щоб побачити, чи працює він, просто введіть git config user.email:

$ git config user.email
name@example.com

Замість псевдоніма ви також можете помістити користувальницький gitвиконуваний файл у межах свого $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

Перевага цього методу перед конкретним сховищем .git/configполягає в тому, що він застосовується до кожного gitсховища, коли користувацька gitпрограма активна. Таким чином, ви можете легко перемикатися між користувачами / іменами без зміни будь-якої (загальної) конфігурації.


14

псевдоніми git (і розділи в git config) на допомогу!

додайте псевдонім (з командного рядка):

git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; :'

потім встановіть, наприклад

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

і в новому або клонованому репо можна виконати цю команду:

git identity github

Це рішення не є автоматичним, але при знятті з охороною користувача та адресу електронної пошти в вашому глобальному ~/.gitconfigі установках user.useConfigOnlyдля trueзмусить мерзотник , щоб нагадати вам , щоб встановити їх вручну в кожному новому або клонований репо.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
Мені подобається ваше рішення; однак, коли я скидаю глобальну програму, вона просто зобов’язується з іменем хоста мого комп’ютера, а не з git, нагадує мені встановити їх у будь-якому даному репо
::

12

Ось повні кроки, прочитавши тут багато відповідей

Як встановити кілька налаштувань ключів SSH для різних облікових записів github

Можливо, ви захочете почати перевірку ваших збережених в даний час ключів

$ ssh-add -l

Якщо ви вирішите видалити всі кешовані клавіші раніше ( необов’язково, обережно про це )

$ ssh-add -D

Тоді ви можете створити ключ ssh pub / priv, пов’язаний із кожною електронною поштою / обліковим записом, яку ви хочете / потрібно використовувати

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

Після виконання цих команд у вас буде створено такі файли

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

Переконайтесь, що засіб аутентифікації працює

$ eval `ssh-agent -s`

Додайте згенеровані ключі наступним чином (із папки ~ / .ssh)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Тепер ви можете перевірити збережені ключі ще раз

$ ssh-add -l

Тепер вам потрібно додати створені відкриті ключі до вашого сервера github / bickbuket Acces Keys

Клоніруйте кожен із репостів у різні папки

Перейдіть у папку, де працюватиме користувач , і виконайте це

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

Просто щоб побачити, що це перевіряє вміст ".git / config"

Перейдіть в папку , де користувач перс буде працювати і виконувати це

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

Просто щоб побачити, що це перевіряє вміст ".git / config"

Після всього цього ви зможете ввести свій особистий та робочий код, просто перемикаючись між цими двома папками

Якщо ви використовуєте Git Bash і вам потрібно генерувати ssh-ключі під Windows, виконайте наступні дії:

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows


9

Існує просте рішення, яке, здається, працює добре, щоб уникнути помилок.

Просто видаліть [user]розділ зі свого ~/.gitconfig, що не дозволить вам робити будь-які комісії без налаштування user.nameдля кожного сховища.

У ваших ~/.bashrc, додайте кілька простих псевдонімів для користувача та адресу електронної пошти:

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

Не велика причина, якщо ви будете дублювати конфігурацію в кожному
репортажі

9

Ця відповідь частково натхненна публікацією @Saucier, але я шукав автоматизований спосіб встановити user.nameі user.emailна основі репо, на основі дистанційного керування, що був трохи більш легким, ніж пакет, який розробляв паспорт git . Також h / t до @John для налаштування useConfigOnly. Ось моє рішення:

.gitconfig зміни:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

гачок після оформлення замовлення, який слід зберегти у такий шлях ~/.git-templates/hooks/post-checkout:

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

Я використовую різні облікові дані для github та gitlab, але ці посилання у наведеному вище коді можна замінити чи доповнити будь-якою службою, якою ви користуєтесь. Для того, щоб гачок після оформлення замовлення автоматично встановив ім’я користувача та електронну пошту для місцевого повторного відправлення після оформлення замовлення, переконайтеся, що ім’я служби відображається у віддаленій URL-адресі, додайте його до масиву служб у post-checkoutсценарії та створіть для нього розділ ваш, .gitconfigякий містить ваше ім’я користувача та електронну пошту для цієї послуги.

Якщо жодне з імен служб не відображається у віддаленій URL-адресі або у репо-відсутній пульт, ім’я користувача та електронна пошта не будуть встановлені локально. У цих випадках user.useConfigOnlyбуде налаштовано налаштування, яке не дозволить вам робити зобов’язання, поки ім'я користувача та електронна пошта не будуть встановлені на рівні репо, і запропонують користувачеві налаштувати цю інформацію.


1
Прекрасне рішення. Не забудьте до chmod 755сценарію гачка. В іншому випадку вона буде скопійована, але ніколи не буде виконана.
onekiloparsec

5

GIT_AUTHOR_EMAIL + місцеві .bashrc

.bashrc_local: не відстежуйте цей файл, а розміщуйте його лише на робочому комп'ютері:

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: відстежте цей файл, зробіть його однаковим як на робочому, так і на домашньому комп'ютерах:

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

Я використовую https://github.com/technicalpickles/homesick, щоб синхронізувати свої dotfiles.

Якщо тільки gitconfig приймає змінні середовища: Розширення змінної оболонки в git config


5

Середовище Windows

Додатково це можна змінити Git Extensions --> Settings --> Global Settings, якщо він встановлений у ваших системах.

gitextensions-останній випуск

Клацніть правою кнопкою миші папку / каталог у середовищі Windows, щоб отримати доступ до цих налаштувань. введіть тут опис зображення

Оновлення : Як переключити / підтримувати декілька налаштувань у версії 2.49 Як переключити / підтримувати кілька параметрів у версії 2.49


Як ця адреса звертається до кількох користувачів, а не просто редагувати їх?

@D_N Оновлено новий знімок екрана з опціями переключення налаштувань.
Abhijeet

Відкрийте локальну папку repo та виберіть git-config з меню навігації, потім натисніть на вкладку локального репо, вміст буде застосовано до $ local_repo_path / .git / config як відповідь вище.
maxwu

3

Можливо, це простий хакер, але він корисний. Просто генеруйте 2 клавіші ssh, як показано нижче.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

Таким же чином створіть ще один для особистого. Отже, у вас є 2 ключі ssh, робота та компанія. Скопіюйте work.pub, work, personal.pub, personal to ~ / .ssh / Directory.

Потім створіть скрипт оболонки з наступних рядків і назвіть його як crev.sh (Company Reverse) із наступним вмістом.

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

Таким же чином створіть ще один під назвою prev.sh (Personal Reverse) із наступним змістом.

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

в ~ / .bashrc додайте псевдоніми для тих сценаріїв, як нижче

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

Кожен раз, коли ви хочете користуватися компанією, просто робіть Crev, і якщо ви хочете використовувати особисті, робити prev :-p.

Додайте ці ключі ssh до своїх облікових записів GitHub. Переконайтеся, що раніше у вас не створено id_rsa, оскільки ці сценарії замінять id_rsa. Якщо ви вже створили id_rsa, використовуйте його для одного з облікових записів. Скопіюйте їх як особисті та пропустіть генерацію особистих ключів.


1

Я зробив функцію bash, яка впорається з цим. Ось Github repo .

Для запису:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

Просто додайте це до свого ~ / .bash_profile, щоб переключитися між ключами за замовчуванням для github.com

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

1

Ви також можете використовувати git commit --author "Your Name <your@email.com>"в момент виконання зобов’язань у репо, де ви хочете взяти на себе зобов'язання як інший користувач.


0

Щось на зразок відповіді Роб W , але дозволяє інший інший ключ ssh і працює з більш старими версіями git (у яких немає, наприклад, конфігурації core.sshCommand).

Я створив файл ~/bin/git_poweruserіз дозволом на виконання та в PATH:

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

Щоразу, коли я хочу зробити щось або натиснути як "Power User", я використовую git_poweruserзамість цього git. Він повинен працювати в будь-якому каталозі, і не вимагає змін .gitconfigабо .ssh/config, принаймні, не в моїх.


0

Хоча на більшість запитань відповіли ОП, я просто мусив це пережити сам і навіть не гуглившись, я зміг знайти якнайшвидше і найпростіше рішення. Ось прості кроки:

  • скопіюйте наявні .gitconfgу іншого репо
  • вставити у щойно додане репо
  • змінити значення у .gitconfigфайлі, такі як ім'я, електронна пошта та ім’я користувача [user] name = John email = john@email.net username = john133
  • додати ім’я файлу до .gitignoreсписку, щоб переконатися, що ви не скористаєтесь .gitconfigфайлом до вашої роботи репо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.