Могу ли я указать несколько пользователей для себя в.gitconfig?
В моем ~/.gitconfig
, Я перечисляю свой личный адрес электронной почты под [user]
, поскольку это то, что я хочу использовать для репозиториев Github.
Но я недавно начал использовать git и для работы. Git-репо моей компании позволяет мне фиксировать, но когда он рассылает объявления о новых наборах изменений, он говорит, что они от Anonymous, потому что он не распознает адрес электронной почты в моем .gitconfig
- по крайней мере, это моя теория.
Можно ли указать несколько [user]
определения в .gitconfig
? Или есть какой-то другой способ переопределить значение по умолчанию .gitconfig
для определенного каталога? В моем случае я проверяю весь рабочий код в ~/worksrc/
- есть ли способ указать .gitconfig
только для этого каталога (и его подкаталогов)?
24 ответа
Вы можете настроить индивидуальное репо на использование определенного пользователя / адреса электронной почты, который переопределяет глобальную конфигурацию. Из корня репо запустите
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
Начиная с 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
Или вы можете добавить следующую информацию в вашем местном .git/config
файл
[user]
name = Your Name
email = your.email@gmail.com
Переключатель учетных записей 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
- скопировать открытый ключ по умолчанию
pbcopy < ~/.ssh/id_rsa.pub
- войдите в свой аккаунт GitHub
- вставьте ключ в
add SSH key
страница github - скопировать другой открытый ключ
pbcopy < ~/.ssh/id_rsa_pro.pub
- повторите и адаптируйте шаги 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 Remote, изменив git@github.com
от git@github_pro
,
Вы можете изменить существующие удаленные проекты (используя что-то вроде git remote origin set-url 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\"
С помощью условных включений в 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
на своем пути.
После получения вдохновения от поста в блоге Орра Селлы я написал хук перед фиксацией (находится в ~/.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 / идентификацией пользователей.
Если вы не хотите иметь адрес электронной почты по умолчанию (адрес электронной почты ссылается на пользователя 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, вы всегда должны указывать имя и адрес электронной почты вручную.
Прочитав все ответы, я пришел к такому решению:
Сценарий:
- Локальная ОС: Linux (bash)
- два аккаунта на GitHub (рабочий / личный)
- доступ по ssh с разными ключами
- моя рабочая учетная запись будет "основной" (поэтому настраивать ее не нужно)
Конфигурация:
- Установите «фальшивый» хост, который позволяет мне выбрать правильную пару ключей SSH.
В~/.ssh/config
:# Personal GitHub account Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes
- «Скажите» мерзавец его следует использовать пользовательскую конфигурацию в пределах данного каталога поддерева:
At~/.gitconfig
:# My personal projects [includeIf "gitdir/i:~/REPOS/PERSONAL/"] path = ~/REPOS/PERSONAL/personal.gitconfig
- Наконец, моя конфигурация по адресу:
# gitconfig for personal projects [user] email = personalemail@example.com [url "git@github-personal"] insteadOf = git@github.com
После того, как три вышеперечисленных будут выполнены, я могу клонировать личное репо следующим образом:
user@host:~/REPOS/PERSONAL$ git clone git@github.com:jmnavarrol/python-multigit.git
Cloning in 'python-multigit'...
(...)
user@host:~/REPOS/PERSONAL$ cd python-multigit && git remote -v
origin git@github-personal:jmnavarrol/python-multigit.git (fetch)
origin git@github-personal:jmnavarrol/python-multigit.git (push)
user@host:~/REPOS/PERSONAL/python-multigit$
Добавление переписывания URL на
~/REPOS/PERSONAL/personal.gitconfig
...
[url "git@github-personal"]
insteadOf = git@github.com
... это то, что позволяет мне ссылаться на репо только по его "стандартному" URL в скриптах, подрепо (то есть в случае самого python-multigit - да, неубедительная попытка небольшого саморекламы), не рискуя использовать "неправильный" URL-адреса, следовательно, неправильная аутентификация.
Мои два цента.
Еще один вариант получить 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
Программа активна. Таким образом, вы можете легко переключаться между пользователями / именами без изменения какой-либо (общей) конфигурации.
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 заставит git напомнить вам об их установке вручную в каждом новом или клонированном репо.
git config --global --unset user.name
git config --global --unset user.email
Этот ответ частично вдохновлен публикацией @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, но эти ссылки в приведенном выше коде могут быть заменены или дополнены любым сервисом, который вы используете. Чтобы хук после проверки автоматически установил имя пользователя и адрес электронной почты локально для репо после проверки, убедитесь, что имя службы отображается в удаленном URL-адресе, добавьте его в массив служб в поле post-checkout
сценарий и создать раздел для него в вашем .gitconfig
который содержит ваше имя пользователя и адрес электронной почты для этой услуги.
Если ни одно из имен служб не отображается в удаленном URL-адресе или в репозитории нет удаленного, имя пользователя и адрес электронной почты не будут установлены локально. В этих случаях user.useConfigOnly
настройка будет действовать, что не позволит вам совершать коммиты до тех пор, пока имя пользователя и адрес электронной почты не будут установлены на уровне репо, и предложит пользователю настроить эту информацию.
Вот то, что я только что нашел после выполнения шагов во многих ответах здесь
Как настроить параметры нескольких ключей 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"
Перейдите в папку, где будет использоваться пользователь activehacker, и сделайте это
$ git config user.name "Personal Account"
$ git config user.email "pers@email.com"
Просто чтобы увидеть, что это делает, проверьте содержимое ".git/config"
После всего этого вы сможете зафиксировать свой личный и рабочий код, переключая папки
Если у вас есть какие-либо проблемы, дайте мне знать mgg.isco@gmail.com
Существует простое решение, которое, кажется, хорошо работает для избежания ошибок.
Просто удалите [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'
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
Окружающая среда Windows
Дополнительно это может быть изменено с Git Extensions --> Settings --> Global Settings
, если он установлен в ваших системах.
Щелкните правой кнопкой мыши папку / каталог в среде Windows, чтобы получить доступ к этим настройкам.
Обновление: Как переключить / сохранить несколько настроек в версии 2.49
Прежде чем выполнять следующие шаги, у вас должно быть несколько ключей ssh. Их можно сгенерировать с помощью здесь команды
Шаги
- Перейдите в папку c:\users\Ваш пользователь\.ssh.
- сенсорный конфиг
- Настройте ключи ssh для каждого домена
- Перейдите в репозиторий git, используя gitbash.
- Настройте имя пользователя и имя для каждого репо
"git config user.email="abc@gmail.com"
- Настройте имя для каждого репо.
git config user.name="Mo Sh"
- Выполнение git-команд. он автоматически выберет ключи SSH.
Может быть, это простой взлом, но это полезно. Просто сгенерируйте 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, используйте это для одной из учетных записей. Скопируйте их как личные и пропустите генерацию личных ключей.
Вы также можете использовать git commit --author "Your Name <your@email.com>"
в момент совершения коммита в репо, где вы хотите коммитить как другой пользователь.
Несмотря на то, что большинство вопросов вроде отвечало на ОП, мне просто пришлось пройти через это самостоятельно, и, даже не взглянув на гугл, я смог найти самое быстрое и простое решение. Вот простые шаги:
- скопировать существующий
.gitconfg
из вашего другого репо - вставить в недавно добавленный репо
- изменить значения в
.gitconfig
файл, такой как имя, адрес электронной почты и имя пользователя[user] name = John email = john@email.net username = john133
- добавить имя файла в
.gitignore
список, чтобы убедиться, что вы не делаете.gitconfig
файл в вашу рабочую репо
Я сделал функцию 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'
Для этого может быть несколько способов, но я добиваюсь этого с помощью функции оболочки ниже.
Вызывая это как,
gitprofile "public" -> Это переключит на профиль с
tom@gmail.com
а также
gitprofile "private" -> Это переключится на
tom@workmail.com
.
Добавьте эту функцию в свой ~ / .bash_profile или ~ / .zshrc в зависимости от ваших текущих настроек терминала. Перезагрузите терминал или просто скомпилируйте скрипт, например
. ~ / .bash_profile
чтобы сделать функцию эффективной. Надеюсь, поможет !
Давайте переопределим спецификации - вы просто хотите иметь возможность использовать несколько идентификаторов с git против разных организаций - все, что вам нужно, это 2 одинарных строки:
# generate a new private public key pair for org1
email=me@org1.eu;ssh-keygen -t rsa -b 4096 -C $email -f $HOME/.ssh/id_rsa.$email
# use org1 auth in THIS shell session - Ctrl + R, type org1 in new one
email=me@org1.eu;export GIT_SSH_COMMAND="ssh -p 22 -i ~/.ssh/id_rsa.$email"
Почему я знаю, что это, безусловно, самое простое решение:
# me using 9 different orgs with separate git auths dynamically
find $HOME/.ssh/id_rsa.*@* | wc -l
18
Что-то вроде ответа Роба В., но допускает использование другого ключа 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" $@
Всякий раз, когда я хочу зафиксировать или выдвинуть что-либо как "Опытный пользователь", я использую git_poweruser
вместо git
, Он должен работать в любом каталоге и не требует изменений в .gitconfig
или же .ssh/config
по крайней мере не в моем.
Просто добавьте это в ваш ~/.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"