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

#git #github #gitolite #git-config

#git #github #gitolite #git-config

Вопрос:

Я использую свой персональный ноутбук как для работы, так и для личных проектов, и я хотел бы использовать свой рабочий адрес электронной почты для своих коммитов на работе (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:

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

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

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

Комментарии:

1. Я думаю, это должно сработать. Я ожидаю иметь несколько локальных репозиториев для одного и того же проекта, в частности, для того, чтобы легче переключаться между ветвями без необходимости все перекомпилировать. Возможно, это просто плохая привычка svn. Спасибо.

2. @Martin —Я не очень давно использую git, но у меня возникает ощущение, что использование нескольких локальных репозиториев было бы необычным рабочим процессом для git. Даже в этом случае вам нужно будет запустить это только один раз на экземпляре репозитория, и оно настроено на срок службы этого репозитория, так что это не так уж плохо.

3. @DanRay На самом деле это обычная настройка, если, как в случае с Martin, в локальном репозитории есть локальные незафиксированные файлы. Переключение с одной ветки на другую не приведет к автоматическому восстановлению файлов. Если целью является избежать «перекомпиляции всего», правильным способом сделать это является использование нескольких локальных репозиториев.

4. конфигурация git —глобальный пользователь.email «bob@example.com » Добавление —global позволяет заставить его работать во всех репозиториях. источник: help.github.com/articles/setting-your-username-in-git

5. Это задача, выполняемая вручную, и о ней можно забыть. Мы с @dragon788 предлагаем автоматические решения

Ответ №2:

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

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

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

локальный get

 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'
  

глобальный get

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

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

Не забудьте заключить пробелы в кавычки и т.д., Например: ‘FirstName LastName’

Комментарии:

1. потрясающий ответ… я хочу, чтобы локальный отличался от глобального

Ответ №3:

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

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

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

имя = Bob

электронная почта = bob@example.com

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

git config —get user.name

git config —get user.email

Пример: для моего этого конфигурационного файла в D:workspaceeclipseipchat.gitconfig

Здесь ipchat — это имя моего репозитория

Ответ №4:

Если вы используете 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. Странно.

Комментарии:

1. Это звучит как отличный трюк, но у меня он не сработал. Как фиксация, так и отправка на gitolite remote прошли успешно.

2. @Martin Jambon: Странно. Я использую git версии 1.7.4.5

3. @Martin Jambon: Вы также можете попробовать установить для своего глобального имени пользователя / адреса электронной почты значение «x». Некоторые старые версии git отклоняли слишком маленькие значения. Сообщите, какая у вас версия git / OS, если это не работает.

4. @Martin Jambon: Попробуйте 968 «x» и посмотрите, работает ли это лучше для вас.

Ответ №5:

Начиная с 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).

Комментарии:

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

Ответ №6:

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

Ответ №7:

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

Комментарии:

1. Стоит упомянуть, что git identity это недопустимая команда git. Я думаю, что ваш ответ вдохновлен этой статьей , которая великолепна. Спасибо

2. Да, источник указан в сообщении 🙂

Ответ №8:

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

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

Вот как вы это настраиваете:

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

    mkdir -p ~/.git-templates/hooks

  2. Скажите git, чтобы он копировал все в ~/.git-templates каталог для каждого вашего проекта .git при запуске git init или клонировании

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

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

 #!/bin/bash

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

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

if [ -n "$GITHUB_REMOTE" ] amp;amp; [ -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]nn"
    exit 1
fi
  

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

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