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

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

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

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

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


person Martin Jambon    schedule 24.05.2011    source источник
comment
Я прошу вас принять один из ответов. Я надеюсь, что один из них, должно быть, помог вам решить вашу проблему.   -  person RBT    schedule 10.01.2017


Ответы (8)


git config user.email "[email protected]"

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

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

person Dan Ray    schedule 24.05.2011
comment
Я думаю, что это должно сделать это. Я ожидаю иметь несколько локальных репозиториев для одного и того же проекта, в частности, чтобы легче переключаться между ветвями без необходимости перекомпилировать все. Может быть, это просто плохая привычка svn. Спасибо. - person Martin Jambon; 25.05.2011
comment
@Martin - я не очень долго использую git, но мне кажется, что использование нескольких локальных репозиториев было бы необычным рабочим процессом для git. Тем не менее, вам нужно будет запустить это только один раз на экземпляре репо, и он установлен на срок службы этого репо, так что это не так уж плохо. - person Dan Ray; 25.05.2011
comment
@DanRay На самом деле это обычная настройка, если, как в случае с Мартином, в локальном репо есть локальные незафиксированные файлы. Переход с одной ветки на другую не приводит к автоматическому перестроению файлов. Если целью является предотвращение перекомпиляции всего, использование нескольких локальных репозиториев — правильный способ сделать это. - person dolmen; 02.08.2012
comment
git config --global user.email [email protected] Добавление --global заставит его работать во всех репозиториях. источник: help.github.com/articles/setting-your-username -в-git - person SashiOno; 14.03.2017
comment
Это ручная задача, о которой можно забыть. Мы с @dragon788 предлагаем автоматические решения. - person naitsirch; 19.03.2019
comment
я сделал это, но git игнорирует локальные настройки - person Jason G; 11.05.2020
comment
Просто добавьте, что если вы все еще застряли со старой версией git и не можете использовать ответ @dragon788, если ваша версия › 2.6.7, вы можете использовать worktree для многократной проверки без необходимости настраивать каждую. - person Tic; 02.06.2020

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

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

git config user.email [email protected]
git config user.name 'Mahmoud Zalt'

местное получение

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

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

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

git config --global user.email [email protected]
git config --global user.name 'Mahmoud Zalt'

глобальное получение

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

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

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

person Mahmoud Zalt    schedule 08.10.2015

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

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

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

имя = Боб

электронная почта = [email protected]

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

git config --получить user.name

git config --получить user.email

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

Здесь ipchat — имя моего репо.

person arulraj.net    schedule 06.06.2011

Если вы используете git config user.email "[email protected]", он будет привязан к текущему проекту, в котором вы находитесь.

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

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

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

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

person Seth Robertson    schedule 24.05.2011
comment
Звучит как отличный трюк, но у меня он не сработал. И фиксация, и отправка на gitolite remote прошли успешно. - person Martin Jambon; 25.05.2011
comment
@Мартин Джамбон: Странно. Я использую git версии 1.7.4.5. - person Seth Robertson; 25.05.2011
comment
@Martin Jambon: Вы также можете попробовать установить глобальное имя пользователя/адрес электронной почты на x. Некоторые старые версии git отклоняли слишком маленькие значения. Сообщите, какая у вас версия/ОС git, если это не работает. - person Seth Robertson; 25.05.2011
comment
@Martin Jambon: Попробуйте 968x и посмотрите, будет ли это работать лучше для вас. - person Seth Robertson; 26.05.2011

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

Поскольку достаточно новый Git поставляется с Ubuntu 18.04, я вполне счастливо использую его в своем ~/.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).

person dragon788    schedule 14.07.2017
comment
Очень полезно и именно то, что я искал. В сочетании с git config core.sshCommand для нескольких закрытых ключей обеспечивает полное беспрепятственное управление идентификацией git. - person topr; 25.03.2020

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

person ismail    schedule 24.05.2011

Мне очень нравится способ Мики Хеннинга в его статье (см. Настройка идентификаторов 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.

person sgy    schedule 13.06.2020
comment
Стоит отметить, что git identity не является допустимой командой git. Я думаю, что ваш ответ вдохновлен этой статьей, и это здорово. Спасибо - person Ahmad Alfy; 26.12.2020
comment
Да, источник указан в посте :) - person sgy; 27.12.2020

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

Это была именно моя проблема. Я написал сценарий ловушки, который предупреждает вас, если у вас есть какой-либо удаленный 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 в соответствии с вашими потребностями.

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

person naitsirch    schedule 19.03.2019