Git
May 14

Настройка клиента git

Настройка git

Установка git

Установка клиента git на Debian/Ubuntu

apt install -y git

Установка git на MacOS

brew install git

Для настройки клиента git используется конфигурационный файл в домашней директории пользователя ~/.gitconfig

Создание нескольких профилей подключения к репозиториям

При использовании нескольких профилей подключения к различным репозиториям можно использовать условные директивы в файле .gitconfig, подключая разные файлы с реквизитами подключения в зависимости от расположения локальной копии.
Например, создадим файл ~/.gitconfig, если он еще не существует, также необходимо создать два файла для условного подключения:

touch ~/.gitconfig
touch ~/.gitconfig-default
touch ~/.gitconfig-home
touch ~/.gitconfig-work

Добавим два условия в основной файл, где указано, что при нахождении внутри директории использовать дополнительный файл, значения параметров в котором перепишут исходные:

# vi ~/.gitconfig
[include]
  path = ~/.gitconfig-default
[includeIf "gitdir:~/git/home/"]
    path = ~/.gitconfig-home
[includeIf "gitdir:~/git/work/"]
    path = ~/.gitconfig-work

И в подключаемых файлах зададим необходимые параметры

# vi ~/.gitconfig-default
[user]
    name = Alexander
    email = alexander@antroot.ru
[init]
    defaultBranch = master
[color]
    ui = auto
[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green
[color "diff"]
    meta = yellow bold
    frag = magenta bold
    old = red bold
    new = green bold
[color "status"]
    added = yellow
    changed = green
    untracked = cyan
# vi ~/.gitconfig-home
[user]
    name = cs
    email = cs@antroot.ru
[url "git@gitlab.antroot.ru:"]
    insteadOf = https://gitlab.antroot.ru/
# vi ~/.gitconfig-work
[user]
    name = Alexander
    email = alex.cs@mywork.com
[init]
    defaultBranch = main
[url "git@gitlab.com:"]
    insteadOf = https://gitlab.com/

Проверка: перейти в директорию, создать директорию проекта, инициализировать и запросить имя пользователя:

cd ~/git/home/
mkdir test && cd test
git init
git config user.name
git config user.email
# cs cs@antroot.ru

cd ~/git/work/
mkdir test && cd test
git init
git config user.name
git config user.email
# alex alex@mywork.com

Настройка ключей SSH для разных репозиториев

Так как для авторизации в git репозитории используем SSH подключение, то будет удобно настроить подключения к каждому из репозиториев со своими реквизитами (username, public key).

1 шаг: сгенерировать публичные ключи

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_antroot -C cs@antroot.ru
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_gitlab -C alexander@mywork.com
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_github -C alex.cs@myfree.com

2 шаг: запустить ssh-agent

eval $(ssh-agent -s)
ssh-add

3 шаг: указать в файл идентификации для SSH

# ~/.ssh/config
Host antroot.ru
    Hostname gitlab.antroot.ru
    User git
    IdentityFile ~/.ssh/id_rsa_antroot
Host gitlab.com
    Hostname gitlab.com
    User git
    IdentityFile ~/.ssh/id_rsa_gitlab
Host github.com
    Hostname github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github

И немного настроек в ~/.ssh/config
Создать директорию для хранения подключений:

mkdir -p ~/.ssh/.sessions
# ~/.ssh/config
Host *
    Protocol 2

  # использовать общий канал к одному и тому же хосту
    # вместо отрытия нового для ускорения подключения
    ControlMaster auto
    ControlPath ~/.ssh/.sessions/%r@%h:%p
    ControlPersist 600

    Compression yes
    TCPKeepAlive yes
    ServerAliveInterval 30
    ServerAliveCountMax 10

Вывод профиля в приглашение командной строки

Для этого добавить в .bashrc

git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
git_user() {
    in_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
    if [ "$in_repo" ]; then
        echo " $(git config user.name)"
    fi
}
export PS1="\[\033[1;32m\]\u@\h \[\033[34m\]\w \[\033[33m\]\$(git_branch)\$(git_user)\[\033[00m\]$

Для .zshrc

setopt prompt_subst

PROMPT="%F{green}%n%f@%F{cyan}%m%f %F{yellow}%1~%f %# "
RPROMPT="%D %F{cyan}%T%f %a"

git_repo() {
  basename $(git rev-parse --show-toplevel)
}
git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
git_user() {
  git config user.name
}
git_url() {
  #git config --get remote.origin.url | sed -nr 's/^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)([.git]*)$/\3\/\4/p' # show URL and Group
  git config --get remote.origin.url | sed -nr 's/^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)([.git]*)$/\3/p' # show URL only
}
prompt_hint() {
  [ -d .git ] && git_rep="true" || git_rep=$(git rev-parse --show-toplevel 2>/dev/null)
  if [ "$git_rep" ]
    then
      RPROMPT="%F{green}$(git_user)%f $(git_url) %F{yellow}$(git_repo)%f%F{cyan} $(git_branch)%f"
    else
      export RPROMPT="%D %F{cyan}%T%f %a"
  fi
}
precmd_functions+=(prompt_hint)


Команды Git - Информация по основным и продвинутым командам, git tag, git hook, git stash и др.