Как указать git для использования правильного идентификатора (имени и электронной почты) для данного проекта?

117

Я использую свой личный ноутбук как для работы, так и для личных проектов, и я хотел бы использовать свой рабочий адрес электронной почты для моих коммитов на работе (gitolite) и свой личный адрес электронной почты для остальных (github).

Я читал о следующих решениях, которые являются глобальными или временными:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • установив один из GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILили EMAILпеременные окружения

Одно из решений - запустить вручную функцию оболочки, которая устанавливает рабочую или личную среду в моей среде , но я почти уверен, что часто забываю переключаться на правильную идентификацию, что приводит к фиксации с неправильной идентификацией.

Есть ли способ привязать определенный репозиторий, название проекта и т. Д. К личности (имени, электронной почте)? Что делают люди?

Мартин Джэмбон
источник
1
Прошу принять один из ответов. Надеюсь, один из них помог вам решить вашу проблему.
RBT

Ответы:

134

git config user.email "bob@example.com"

Выполнение этого внутри репо установит конфигурацию в ЭТОМ репо, а не глобально.

Похоже, это в значительной степени то, что вам нужно, если только я вас не понял.

Дэн Рэй
источник
Я думаю, это должно сработать. Я ожидаю иметь несколько локальных репозиториев для одного и того же проекта, особенно для того, чтобы легче переключаться между ветвями без необходимости перекомпилировать все. Может, это просто плохая свн привычка. Спасибо.
Мартин Джэмбон,
1
@ Martin - Я не очень давно использую git, но, как мне кажется, использование нескольких локальных репозиториев было бы необычным рабочим процессом для git. Даже в этом случае вам нужно будет запустить это только один раз в экземпляре репо, и он установлен на срок жизни этого репо, так что это не так уж плохо.
Дэн Рэй
@DanRay На самом деле это обычная установка, если, как в случае с Мартином, в локальном репо есть локальные незафиксированные файлы. При переключении с одной ветки на другую файлы автоматически не восстанавливаются. Если целью является избегание «перекомпиляции всего», то правильным способом будет использование нескольких локальных репозиториев.
дольмен
1
git config --global user.email "bob@example.com" Добавление --global заставит его работать во всех репозиториях. источник: help.github.com/articles/setting-your-username-in-git
SashiOno
1
Это ручная задача, о которой можно забыть. @ Dragon788 и я предложили автоматические решения
naitsirch
47

Вам нужно использовать команду local set ниже:

местный набор

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

местные получают

git config --get user.email
git config --get user.name

Локальный конфигурационный файл находится в директории проекта: .git/config.

глобальный набор

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

глобальный получить

git config --global --get user.email
git config --global --get user.name

Глобальный конфигурационный файл в вашей домашней директории: ~/.gitconfig.

Не забудьте указать пробелы и т. Д., Например: «Имя Фамилия».

Махмуд Залт
источник
23

Отредактируйте файл конфигурации в папке ".git", чтобы сохранить другое имя пользователя и адрес электронной почты в зависимости от репозитория.

  • Перейти в ваш репозиторий
  • Покажите скрытые файлы и перейдите в папку ".git"
  • Найдите файл "config"
  • Добавьте следующие строки в EOF

[Пользователь]

name = Боб

email = bob@example.com

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

git config --get user.name

git config --get user.email

Пример: для моего файла конфигурации в D: \ workspace \ eclipse \ ipchat \ .git \ config

Здесь ipchat - мое имя репо

arulraj.net
источник
16

Если вы git config user.email "foo@example.com"его используете, он будет привязан к текущему проекту, в котором вы находитесь.

Это то, что я делаю в своих проектах. Я устанавливаю соответствующий идентификатор при клонировании / инициализации репозитория. Это не безупречно (если вы забудете и нажмете, прежде чем понять, что вас обливают), но он настолько хорош, насколько вы можете получить, не имея возможности сказатьgit config --global user.email 'ILLEGAL_VALUE'

Фактически, вы можете сделать недопустимое значение. Установите свойgit config --global user.name $(perl -e 'print "x"x968;')

Затем, если вы забудете установить неглобальные значения, вы получите сообщение об ошибке.

[РЕДАКТИРОВАТЬ] В другой системе мне пришлось увеличить число x до 968, чтобы заставить ее выйти из строя с "фатальным: невозможно длинный личный идентификатор". Та же версия git. Странный.

Сет Робертсон
источник
Звучит как отличный трюк, но у меня он не сработал. И фиксация, и нажатие на gitolite remote были успешными.
Мартин Джэмбон
@ Мартин Джэмбон: Странно. Я использую git версии 1.7.4.5
Сет Робертсон
@Martin Jambon: Вы также можете попробовать установить для своего глобального имени пользователя / адреса электронной почты значение «x». Некоторые старые версии git отклоняли слишком маленькие значения. Сообщите, какая у вас версия git / os, если это не работает.
Сет Робертсон
@Martin Jambon: Попробуйте 968 "x" и посмотрите, подходит ли это вам больше.
Сет Робертсон
8

Если вы не используете --globalпараметр, он установит переменные только для текущего проекта.

исмаил
источник
8

Начиная с Git 2.13, вы можете использовать includeIfв своем gitconfig файл с другой конфигурацией в зависимости от пути к репозиторию, в котором вы запускаете свои команды git.

Поскольку с Ubuntu 18.04 поставляется достаточно новый Git, я с ~/.gitconfigудовольствием его использую.

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

Чтобы использовать Git 2.13, вам нужно будет либо добавить PPA (Ubuntu старше 18.04 / Debian), либо загрузить двоичные файлы и установить (Windows / другой Linux).

dragon788
источник
Очень полезно и именно то, что я искал. В сочетании с git config core.sshCommandнесколькими закрытыми ключами обеспечивает полное бесшовное управление идентификацией git.
Topr
0

Одно из решений - запустить вручную функцию оболочки, которая устанавливает рабочую или личную среду в моей среде, но я почти уверен, что часто забываю переключаться на правильную идентификацию, что приводит к фиксации с неправильной идентификацией.

Это была моя проблема. Я написал сценарий ловушки, который предупреждает вас, если у вас есть удаленный github, а не определено локальное имя пользователя.

Вот как это настроить:

  1. Создайте каталог для хранения глобальной ловушки

    mkdir -p ~/.git-templates/hooks

  2. Скажите git скопировать все в каталог ~/.git-templatesдля каждого проекта .gitпри запуске git init или clone

    git config --global init.templatedir '~/.git-templates'

  3. А теперь скопируйте следующие строки ~/.git-templates/hooks/pre-commitи сделайте файл исполняемым (не забывайте об этом, иначе git его не выполнит!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

Если вы используете другие хосты для своих частных репозиториев, вам необходимо заменить их в github.comсоответствии с вашими потребностями.

Теперь каждый раз, когда вы выполняете команду a, git initили git clonegit будет копировать этот скрипт в репозиторий и выполнять его до того, как будет произведена фиксация. Если вы не установили локальное имя пользователя, он выдаст предупреждение и не позволит вам выполнить фиксацию.

naitsirch
источник
0

Мне очень нравится способ Мики Хеннинга в его статье (см. Настройка идентификаторов Git ) на эту тему. Тот факт, что он применяет и принудительно устанавливает личность для каждого созданного / клонированного репозитория, является хорошим способом не забывать настраивать это каждый раз.

Базовая конфигурация git

Отменить текущую конфигурацию пользователя в git:

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

Принудительно настроить идентификацию в каждом новом локальном репозитории:

$ git config --global user.useConfigOnly true

Создайте псевдоним Git для identityкоманды, который мы будем использовать позже:

$ 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 user.signingkey "$(git config user.$1.signingkey)"; :'

Создание идентичности

Создайте личность с помощью GPG (используйте gpgили в gpg2зависимости от того, что у вас есть в вашей системе). Повторите следующие шаги для каждой личности, которую вы хотите использовать.

Примечание: [keyid]вот идентификатор созданного секретного ключа. Пример здесь:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

8A5C011E4CE081A5Часть после того, как sec rsa4096/это идентификатор ключа.

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

Скопируйте блок открытого ключа и добавьте его в настройки GitHub / GitProviderOfChoice в качестве ключа GPG.

Добавьте личность в конфигурацию Git. Также повторите это для каждого идентификатора, который вы хотите добавить:

Примечание: здесь я использую gitlabдля обозначения своей личности, но, судя по вашему вопросу, это может быть что угодно, например: gitoliteили github, workи т. Д.

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

Установить личность для репозитория

Если новое репо не связано с идентификатором, при фиксации появится сообщение об ошибке, напоминающее вам установить его.

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

Укажите идентификатор, который вы хотите использовать в новом репозитории:

$ git identity gitlab

Теперь вы готовы к фиксации с идентификатором gitlab .

elbaid
источник