#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 и не определено локальное имя пользователя.
Вот как вы это настраиваете:
-
Создайте каталог для хранения глобального хука
mkdir -p ~/.git-templates/hooks
-
Скажите git, чтобы он копировал все в
~/.git-templates
каталог для каждого вашего проекта.git
при запуске git init или клонированииgit config --global init.templatedir '~/.git-templates'
-
А теперь скопируйте следующие строки в
~/.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 копирует этот скрипт в репозиторий и выполняет его перед выполнением любого коммита. Если вы не установили локальное имя пользователя, он выдаст предупреждение и не позволит вам зафиксировать.