Исправьте имена пользователей при отслеживании /etc/ в репозитории git и фиксации от имени пользователя root

Мы используем Git для отслеживания изменений в /etc/ на наших серверах.

Администраторы работают как root при изменении файлов в /etc/, и поэтому их коммиты имеют автора

root <root@machinename>

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

Что мы можем сделать, чтобы получить настоящие имена администраторов в журнале git? Я не думаю, что сохранение локального клона репозитория возможно, так как мы часто меняемся интерактивно, пока что-то не работает, и цикл change-commit-push-seeError-repeat здесь не поможет.

6 ответов

Решение

На имя автора git и имя коммиттера могут влиять переменные окружения GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_AUTHOR_NAME а также GIT_AUTHOR_EMAIL,

Теперь хитрость заключается в том, чтобы передать эти переменные на удаленный сервер при подключении через SSH:

  1. Определите и экспортируйте переменные в вашем ~/.bashrc файл:

    export GIT_AUTHOR_NAME="Christian Weiske"
    
  2. Автоматически отправляйте их по SSH-соединению, настраивая ~/.ssh/config:

    SendEnv LANG LC_* GIT_*
    

    LANG а также LC_* не являются необходимыми, но в Debian по умолчанию используется ssh_config, так что я подумал, что их тоже нужно отправить

  3. На удаленном сервере настройте конфигурацию sshd в /etc/ssh/sshd_config принять GIT_* переменные среды:

    AcceptEnv LANG LC_* GIT_*
    

Вуаля git commit как корень в /etc/ приводит к:

commit 8a4654f13241f05361283a88ce041a0fc24b8ac6
Author: Christian Weiske <christian.weiske@netresearch.de>

В случае сбоя сервера в будущем: http://cweiske.de/tagebuch/carry-git-settings.htm

Во-первых, и не имеет отношения к вашему вопросу, я призываю вас срочно прекратить использование root логины и su и использовать логины пользователей и sudo вместо. Ограничить ваш root вход в консоль только или нет.

Это сказало, git commit имеет --author вариант, который может помочь вам там:

# git commit --author='Author Name <author@email.address.com>' -a

Вы также можете осторожно использовать переменные среды для каждого пользователя, чтобы установить GIT_AUTHOR_NAME а также GIT_AUTHOR_EMAIL переменные. В журнале появятся разные авторы и один и тот же коммитер (root@host), но это даст вам больше одитинга. Конечно, это означает, что вы доверяете своим администраторам сохранять переменные нетронутыми. Поскольку каждый использует определенную оболочку, они могут sudo рутировать и исходный файл с их конкретными git переменные, по-разному идентифицирующие каждую в коммитах. Не очень практично, но вы можете даже автоматизировать это с помощью сценариев.

РЕДАКТИРОВАТЬ: Конечно, еще лучший подход, назначенный @ScottPack, состоит в том, чтобы использовать систему управления конфигурациями, такую ​​как Puppet или Chef, и использовать git для отслеживания изменений на центральном сервере, а не на реальных серверах, чтобы у каждого администратора была рабочая копия. конфигурации.

Если вам случится подготовить учетные записи пользователей на ваших серверах с помощью ключей ssh, вы можете фактически присоединить переменные среды к авторизованным ключам во время установки - например, в ~bob/.ssh/authorized_keys.

environment="GIT_AUTHOR_NAME=Bob Smith",environment="GIT_AUTHOR_EMAIL=bob.smith@megacorp.com" ssh-rsa AAAA.... bob.smith@megacorp.com

Таким образом, когда пользователи SSH автоматически устанавливают эти envs, им не нужно пересылать их с локального клиента. Бонусные баллы, если у вас уже есть эта информация, и вы генерируете константы author_keys из системы управления конфигурациями.

Примечание: вышеуказанное требует PermitUserEnvironment yes в sshd_config

С putty вы можете установить это в "Соединение -> Данные -> Переменные среды".

Они также присутствуют послеsuк корню.

Если вы используете sudo и ваш не-root пользователь смонтировал свой домашний каталог:

git -c include.path=<file> будет включать конфигурацию в <file>,

Чтобы автоматически загружать файлы конфигурации моего пользователя без полномочий root, я использую bash псевдоним:

alias gsudo='sudo git -c "include.path='"${XDG_CONFIG_DIR:-$HOME/.config}/git/config\" -c \"include.path=$HOME/.gitconfig\""

Тогда я использую gsudo вместо git как для:

  • Запуск от имени пользователя root
  • Иметь доступ ко всем пользовательским настройкам git без полномочий root

Убедитесь, что конфиг действительно импортируется:

gsudo config --list --show-origin --includes | less

В дополнение к ответу coredump вы также можете установить эти параметры в .git/config файл в вашей рабочей копии хранилища (вручную или с помощью git config команда.

Увидеть man git-config для получения дополнительной информации о команде и классных вещах, которые вы можете сделать с ней.

Другие вопросы по тегам