Як сказати git використовувати правильну особу (ім’я та електронну пошту) для даного проекту?


117

Я використовую свій особистий ноутбук як для роботи, так і для особистих проектів, і я хотів би використовувати свою робочу адресу електронної пошти для своїх робіт на роботі (гітоліт), а для решти свою особисту адресу електронної пошти (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"

Зробивши це всередині репо, буде встановлено конфігурацію ТАКОГО репо, а не глобально.

Здається, це те, що ви хочете, якщо тільки я вас не перечитаю.


Я думаю, що це має зробити. Я очікую, що для одного проекту будуть кілька локальних сховищ, зокрема для того, щоб легше переходити між гілками без необхідності перекомпілювати все. Можливо, це просто погана звичка svn. Дякую.
Мартін Джамбон

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

Вам потрібно скористатися командою локального набору нижче:

місцевий набір

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.

Не забудьте цитувати пробіли тощо, наприклад: "LastName LastName"


23

Відредагуйте конфігураційний файл у папці ".git", щоб підтримувати різні ім'я користувача та електронну пошту, залежно від сховища

  • Перейдіть у свій сховище
  • Покажіть приховані файли та перейдіть до папки ".git"
  • Знайдіть файл "config"
  • Додайте рядки нижче на EOF

[користувач]

ім'я = Боб

email = bob@example.com

Ця команда нижче показує, яке ім’я користувача та електронну пошту встановлено для цього сховища.

git config --get user.name

git config --get user.email

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

Тут ipchat - моє репо ім'я


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;')

Тоді, якщо ви забудете встановити неглобальні значення, ви отримаєте повідомлення про помилку.

[EDIT] У іншій системі мені довелося збільшити кількість x до 968, щоб збити її з "фатальним: неможливо довгий особистий ідентифікатор". Та ж версія git. Дивно.


Це звучить як чудова хитрість, але це не спрацювало для мене. І віддача, і натискання на віддалений гітоліт були успішними.
Мартін Джамбон

@Martin Jambon: Дивно. Я використовую 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).


Дуже корисно і саме те, що я шукав. У поєднанні з 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, буде копіювати цей скрипт у сховище та виконувати його до того, як буде здійснено будь-який фіксатор. Якщо ви не встановили локальне ім'я користувача, воно видасть попередження і не дозволить вам здійснити виконання.


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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.