Могу ли я указать несколько пользователей для себя в .gitconfig? - PullRequest
636 голосов
/ 19 ноября 2010

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

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

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

Ответы [ 20 ]

7 голосов
/ 21 февраля 2017

Этот ответ частично вдохновлен публикацией @Saucier, но я искал автоматизированный способ установки user.name и user.email для репо на основе удаленного, что было немного более легкимчем пакет мерзавца-паспорта, который он разработал.Также 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

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

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

4 голосов
/ 23 июля 2014

Среда Windows

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

gitextensions-latest-release

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

Обновление : Как переключать / поддерживать несколько настроек в версии 2.49 How to switch/maintain multiple settings in Version 2.49

4 голосов
/ 25 июня 2018

Вот то, что я только что нашел после выполнения шагов во многих ответах здесь

Как настроить несколько ключей 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

Клонировать каждый репозиторий в разные папки

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

$ 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"

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

3 голосов
/ 26 февраля 2017

Может быть, это простой взлом, но это полезно. Просто сгенерируйте 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 / .

Затем создайте сценарий оболочки со следующими строками и назовите его 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 голос
/ 10 ноября 2018

Просто добавьте это в ваш ~ / .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 голос
/ 07 февраля 2018

Я сделал функцию 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'
0 голосов
/ 04 мая 2019

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

0 голосов
/ 10 августа 2018

Несмотря на то, что большинство вопросов вроде отвечало ОП, мне просто пришлось пройти через это самому, и даже без поиска в Google я смог найти самое быстрое и простое решение. Вот простые шаги:

  • скопировать существующее .gitconfg из другого репо
  • вставьте в недавно добавленный репо
  • изменить значения в файле .gitconfig, такие как имя, адрес электронной почты и имя пользователя [user] name = John email = john@email.net username = john133
  • добавьте имя файла в список .gitignore, чтобы убедиться, что вы не зафиксировали файл .gitconfig в своем рабочем репо
0 голосов
/ 27 мая 2017

Что-то похожее на ответ Роба В. , но допускает использование другого ключа 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, по крайней мере, в моем.

...