Могу ли я указать несколько пользователей для себя в .gitconfig?


755

В моем ~/.gitconfigсписке я указал свой личный адрес электронной почты [user], поскольку именно это я и хочу использовать для репозиториев Github.

Но я недавно начал использовать git и для работы. Git-репо моей компании позволяет мне фиксировать, но когда он рассылает объявления о новых наборах изменений, он говорит, что они от Anonymous, потому что он не распознает адрес электронной почты в моем .gitconfig- по крайней мере, это моя теория.

Можно ли указать несколько [user]определений в .gitconfig? Или есть какой-то другой способ переопределить значение .gitconfigпо умолчанию для определенного каталога? В моем случае я проверяю весь рабочий код в ~/worksrc/- есть ли способ указать .gitconfigтолько для этого каталога (и его подкаталогов)?


Смотрите git-config # FILES .
Джош Ли

1
Я удивлен, что сервер вашей компании сделал бы это - он должен был бы ИЗМЕНИТЬ ша вашей фиксации, чтобы это работало. Если вы делаете коммит на локальную проверку, какое имя пользователя вы видите?
Алекс Браун

1
@ Алекс: Забыл важный момент - это может быть просто имя в уведомлении по электронной почте, фактически ничего не меняя при коммите.
Каскабель

1
Вы можете использовать git-hook для автоматизации этой повторяющейся работы: github.com/DrVanScott/git-clone-init
Henning

1
Пожалуйста, примите этот ответ: stackoverflow.com/a/43654115/482899 . Это лучшее решение со времен git 2.13.
северное дерево

Ответы:


1017

Вы можете настроить индивидуальное репо на использование определенного пользователя / адреса электронной почты, который переопределяет глобальную конфигурацию. Из корня репо запустите

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. И если вы пропустили комментарий Абизерна , файл конфигурации репозитория находится по адресу <repo-root>/.git/config.
Рори О'Кейн

13
Вам также следует сбросить настройки GIT_AUTHOR_EMAIL и GIT_COMMITTER_EMAIL (и * _NAME), поскольку они будут переопределять локальные настройки
ACyclic

6
Есть ли способ сделать это для всех репо в данной папке, а не для отдельных репо? Смотрите мой вопрос здесь: stackoverflow.com/questions/21307793/…
scubbo

6
Посмотрите этот ответ ниже для более современного решения с Git 2.13выпущенным сегодня.
tejasbubane

491

Начиная с 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
Будет ли это решение работать для всех подкаталогов в каталоге, указанном в операторе включения, при условии, что у них нет собственных файлов .gitconfig? Я бы так подумал, но пока тестирование не подтвердило это.
Гэри

2
@Gary Да, согласно моему опыту и документам: «Если шаблон заканчивается символом /, ** будет добавлен автоматически. Например, шаблон foo / становится foo / **. Другими словами, это соответствует "foo" и всему внутри, рекурсивно. ”,“; include для всех репозиториев внутри $ HOME / to / group [includeIf "gitdir: ~ / to / group /"] »
Томаш Яноушек

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

5
Вы можете проверить, что он работает рекурсивно, запустив git config --listв разных каталогах. В подкаталогах ~/work/, содержащих git-репозиторий, includeIfэффект вступает в силу. Обратите внимание, что в подкаталогах ~/work/, не содержащих git-репозиторий, функция includeIfне выполняется.
NZD

105

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

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

27
... который является ручным способом сделать то, что команды, рекомендованные @discomurray, делают для вас.
user456584

1
Можно ли добавить несколько строк этого на один пульт?
Абель

56

Переключатель учетных записей 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 Remote Configuration

Теперь вы можете использовать эти псевдонимы в git remotes, изменив 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 config могут быть глобальными или для каждого проекта. В нашем случае нам нужны индивидуальные настройки проекта. Это очень легко изменить:

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 config

У нас уже есть одно командное решение для второго шага, но первый намного сложнее. Одна команда удаленного изменения хоста

Вот решение в виде еще одной команды 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)

Объедините их всех

Теперь нам просто нужно объединить две команды в одну, это довольно просто. Посмотрите, как я также интегрирую переключение хостов Bitbucket.

[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
Для этих двух разных учетных записей, как я могу подписать с разными ключами 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). Также можно определить произвольное количество идентификаторов внутри configfile ( ~/.gitpassport), которые можно выбрать в приглашении. Вы можете найти проект на github.com: git-passport - команда Git и хук, написанный на Python для управления несколькими учетными записями Git / идентификацией пользователей .


1
Это работает аккуратно. Тем не менее, он работал лучше для меня, сделав этот хук после проверки (вместо пост-фиксации). Мои предложения по улучшению этого ответа: упомяните, что: 1. фрагмент должен быть сохранен как ~ / .git / templates / hooks / post-checkout и ему должно быть дано разрешение chmod +x post-checkout, 2. git_remotesзначения являются начальной частью полного имени хоста, например git@github.com, 3. local_idзначения должны быть отредактированы пользователем по соответствующим именам и адресам электронной почты.
Шантану Кумар

@ShantanuKumar Спасибо за ваш комментарий. Я скорректировал ответ, как вы предложили. Возможно, я скоро перепишу скрипт на Python.
Saucier

Добавлена ​​поддержка регулярных выражений и репозиториев без пультов. Для удобства скачивания все объединено здесь . Regexps для различения идентификаторов для разных проектов на одном и том же сервисе. А поддержка удаленных репозиториев с, например, идентификацией по умолчанию имеет смысл, если вы создаете git initновые проекты из IDE, такой как eclipse(которая не может обрабатывать интерактивные триггеры предварительной фиксации)
cfi

25

Если вы не хотите иметь адрес электронной почты по умолчанию (адрес электронной почты ссылается на пользователя github ), вы можете настроить, что вы хотите, чтобы вас спрашивали. Как вы можете это сделать, зависит от версии используемого вами git, см. Ниже.

(Предполагаемый) недостаток заключается в том, что вам необходимо настроить свой адрес электронной почты (и ваше имя) один раз для каждого хранилища. Таким образом, вы не можете забыть сделать это.

Версия <2.7.0

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

в вашей глобальной конфигурации, ~/.gitconfigкак указано в комментарии Дэна Алони в блоге Орра Селлы . При попытке сделать первый коммит в репозитории, 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, может быть, и раньше), я обнаружил, что специальное значение "(none)" больше не вызывает фатальных ошибок. Вместо этого он будет просто использовать "John Doe <(none)>" как есть ...
Zhuoyun Wei

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

Я пробовал email =в 2.7.0, Git по-прежнему угадывает адрес электронной почты на основе имени пользователя и имени хоста. Теперь я использую pre-commitподход в блоге Селлы. Я также уведомил Дана Алони, который придумал эту "(none)"идею в посте Селлы, и он подал патч, чтобы официально реализовать его как функцию: permalink.gmane.org/gmane.comp.version-control.git/285301
Чжуоюнь Вэй,

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/DIR применяется мое имя работы / адрес электронной почты. Для c:/work/github/DIR применяется мое личное имя / адрес электронной почты. Это работает, когда применяются последние настройки.

# ~/.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 Да, я проголосовал за его ответ, но мне потребовалось некоторое время, чтобы настроить на Windows, и именно здесь gitdir/iмне помогли (что его ответ не упоминает).
Хиппи

Конкретный способ, которым @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 Configs) на помощь!

добавить псевдоним (из командной строки):

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 напоминает мне установить их в любом репо :(
ENG618

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"

Перейдите в папку, где будет работать пользователь pers , и выполните это

$ 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-passport, который он разработал , Также 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

хук post-checkout, который следует сохранить по следующему пути ~/.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, но эти ссылки в приведенном выше коде можно заменить или дополнить любым сервисом, который вы используете. Для того чтобы хук post-checkout автоматически устанавливал имя пользователя и адрес электронной почты для репо после извлечения, убедитесь, что имя сервиса отображается в удаленном URL-адресе, добавьте его в массив services в 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 для синхронизации моих точечных файлов.

Если только gitconfig будет принимать переменные окружения: Расширение переменной оболочки в git config


5

Окружающая среда Windows

Дополнительно это можно изменить Git Extensions --> Settings --> Global Settings, если он установлен в ваших системах.

gitextensions-последний релиз

Щелкните правой кнопкой мыши папку / каталог в среде Windows, чтобы получить доступ к этим настройкам. введите описание изображения здесь

Обновление : Как переключить / сохранить несколько настроек в версии 2.49 Как переключить / сохранить несколько настроек в версии 2.49


Как это относится к нескольким пользователям, а не просто редактирует их?

@D_N Обновлен новый скриншот с возможностью переключения настроек.
Абхиджит

Откройте папку локального репо и выберите 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 в ~ / .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, и если вы хотите использовать личные, делайте пред.

Добавьте эти ключи ssh в свои учетные записи GitHub. Убедитесь, что у вас нет сгенерированного ранее id_rsa, потому что эти скрипты будут перезаписывать id_rsa. Если вы уже создали id_rsa, используйте это для одной из учетных записей. Скопируйте их как личные и пропустите генерацию личных ключей.


1

Я сделал функцию bash, которая справится с этим. Вот репозиторий Github .

Для записи:

# 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

Что-то вроде ответа Роба В. , но он позволяет использовать другой ключ ssh и работает со старыми версиями git (в которых нет, например, конфигурации core.sshCommand).

Я создал файл ~/bin/git_poweruserс разрешением на выполнение и в ПУТИ:

#!/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" $@

Всякий раз, когда я хочу зафиксировать или выдвинуть что-либо как «Опытный пользователь», я использую 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.