Я делаю разный софт на Go, Python и C++
0,0
рейтинг
28 декабря 2012 в 20:31

Разработка → Что нам стоит Git настроить! tutorial


Дарова, хабр! (ничего оригинальнее не придумал)

Сомневаюсь что эта заметка тянет на полноценный пост, но я все же оставлю ее здесь. О чем же пойдет речь?

Все мы слышали о Git. Все мы знаем что он — хорош. Но лишь немногие пытаются что-то с ним делать, как-то его протвикерить. Сразу говорю, тут не будет ничего паранормального, только немного работы с файлом .gitconfig. Да-да, именно с тем файлом, который так трепетно пылится у вас в домашней директории.

Так, мне уже немного надоело писать этот, по сути, бессмысленный вступительный текст, так что давайте уже начнем что-то делать.

Что такое .gitconfig и зачем он нужен?
В стандартной поставке системы контроля версий Git есть замечательный файл — .gitconfig. Его предназначение очевидно из названия. Строго говоря, это пользовательский конфиг. Он позволяет настраивать алиасы, надстройки, etc.

Не знаю как на других системах, но в Linux он лежит в ~. Если его там нету — смело создавайте!

Открываем .gitconfig в удобном для вас текстовом редакторе (для меня это nano).

Подсветка вывода

Читать вывод Git'а «всухую» достаточно сложно. Я видел достаточно много людей которые терпели это. После одной замечательной комманды им полегчало. Для включения цветного вывода добавляем строчки в .gitconfig:

[color]
        ui = true

Себя записываем

Зачем это нужно? Если вы запустите git log для какого-то репозитория, вы увидите что для каждого коммита, автор характеризируется через Name и Email. Чтобы нас правильно нашли, настало время задать все это правильно. Внимание! Менять эту информацию во время разработки крайне нежелательно. Она может поломать историю (множественные автора)! Желательно единажды выбрать какое-то имя и конкретный Email.

[user]
        name = Anonymous Doody
        email = anonymous.doody@anonymous.com

Шаблон коммитов

Не знаю как другие хабровчане работают, но в основном мои коммиты идут в KDE Edu проекты. Там четко диктуют правила формы и вида коммита, так как он парсится разными ботами и т.д. Чтобы не дай Бог ошибиться или что-то неправильно сделать существуют шаблоны. Такой шаблон очень просто сделать (а можно и взять где-то). Чтобы он отображался во время git commit нужно добавить такое:

[commit]
        template = ~/.commit-template

В данном случае, ~/.commit-template конечно же может быть любым файлом в вашей файловой системе.

Credential Helper

Бывает такое что нужно выполнить несколько операций с удаленным репозиторием за раз. Каждый раз вводить имя и пароль, имя и пароль, имя и… Напрягает, нет? Меня напрягает. Начиная с версии 1.7.10 Git поддерживает Credential Helper.

[credential]
        helper = cache --timeout=<время>

Ставим нужное время (у меня это 3600 — один час) и радуемся!

Алиасы для частых команд

Я очень часто пользуюсь командами checkout и branch, например. Писать по три-четыре раза одно и тоже — надоедает. Давайте заменим их на более лаконичный вариант: cd и dir, например.

[alias]
    cd = checkout
    dir = branch
    mersq = merge --squash
    free = branch -D

А теперь посмотрим что мы сделали:
Без модификаций С модификациями
git pull --rebase
git branch
git checkout temp
git add -u
git commit
git merge master
git checkout master
git merge --squash temp
git commit
git push
git branch -D temp

git pull --rebase
git dir
git cd temp
git add -u
git commit
git merge master
git cd master
git mersq temp
git commit
git push
git free temp


Префиксы для remote

Есть один трюк, который нередко используется разработчиками. Это префиксы для remote. Они позволяют сократить длину адреса к удаленному репозиторию. Можно задать такие для read-only и push. Зачем? Это логично для open-source проектов. Для уменшения нагрузки на сервер и скорости, лучше pull'ить из anongit (read-only) без использования SSH. Что стоит у меня для KDE?

[url "http://anongit.kde.org/"]
    insteadOf = kde:
[url "git@git.kde.org:"]
    pushInsteadOf = kde:

Давайте разбираться. Тут мы настроили два URL для pull и push. Задали префикс kde. Что это нам дает? Посмотрим на примере (в статье не указан префикс gh — для GitHub):
Без модификаций С модификациями
git clone http://anongit.kde.org/marble
git clone https://github.com/user/repository

git clone kde:marble
git clone gh:user/repository



Стало лучше, не правда ли?

Заключение

В статье были опущены мои всякие «экзотические» алиасы и доп. префиксы для разных сервисов. Смело могу сказать, что после того как потвикерил Git — работать стало приятнее. Все знакомые, которые опробовали это — согласились со мной.

P.S. Если я что-то делаю неправильно или я уже совсем убогий, пожалуйста, отпишите ко мне в ЛС и сообщите/посоветуйте (если вам не сложно, конечно).

UPD: Больше интересного и свежего можно найти тут.

Happy Coding!
Была ли эта статья для вас полезной?

Проголосовал 1871 человек. Воздержалось 607 человек.

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

Илья @namespace
карма
24,7
рейтинг 0,0
Я делаю разный софт на Go, Python и C++
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (39)

  • +13
    Вообще, опрос практически дублирует рейтинг статьи. Статья, кстати, неплохая вышла, только вот cd и dir, конечно, как-то напрягает.
    • 0
      Это не более чем мои личные наблюдения. Я не знаю как вас, но меня, например, немного достает писать branch, checkout, merge --squash по пять раз на дню. Для этого я и ввел для себя несколько комманд по-короче (самое интересное, что их выигрыш видно на примере).
      • +3
        Никто вас не осуждает за использование алиасов, просто вы выбрали не удачные названия
        • 0
          Скорее всего, вы правы. Мне их когда-то посоветовали — вот я и привык. А какие названия вы считаете удачными?
          • +5
            branch -> br
            checkout -> co
            Я где-то в другом месте находил настройки, но вот примерно так это делают некоторые.
          • +11
            ci       = commit
            br       = branch
            co       = checkout
            st       = status --short
            


            PS: вот мой конфиг
            • +5
              Хе, у меня ровно то же самое. Призрак SVN пребудет с нами вечно ;)
          • 0
            Посмотрите в сторону oh-my-zsh с git-плагином
  • +5
    Спасибо за Credential Helper!

    btw, никто не знает, как бы так при работе over http в .netrc хранить пароль, но чтобы не в открытом виде?)
    • +22
      Меня одного удивляет, почему не используются ключи?
      • 0
        Смею предположить, что некоторые системы (например Stash) не поддерживают ключи, да и bsideup явно указал «over http»
        • +2
          Если Вы имеете ввиду Atlassian Stash, то он совершенно замечательно поддерживает ssh с ключами (учить мат.часть тут)
          • 0
            я из тех ненормальных, кто предпочитает работать с git-ом через http (GitLab, GitHub, etc) и авторизовываться по паре логин + пароль, а не ключём, хотя и осознаю всю проблему с точки зрения безопасности и всего прочего)

            А ещё есть такая вещь как LDAP, которая так же сводит тему с ключами на нет =)
            • +8
              1) GitHub тот же самый прекрасно авторизовывает по ключам в случае https.

              2) У нас LDAP как раз используется в том числе и для доставки ключей куда надо.
            • 0
              для openssh есть патч lpk
              с ним ssh замечательно хавает ключи из лдапа.
      • +1
        Если иметь ввиду ssh-ключи — то не всегда доступен ssh =((
  • +1
    • 0
      Упс. Несколько пунктов у меня выпали. Огромное спасибо. Сейчас UDPшну.
  • +9
    На просторах интернета нашел замечательные алиасы для построения дерева визуального дерева всех веток.

    lg1 = log --graph --all --format=format:'%C(bold blue)%h%C(reset) — %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
    lg2 = log --graph --all --format=format:'%C(bold blue)%h%C(reset) — %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
    lg = !«git lg1»
    hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short

    git hist — это для просмотра текущей ветки
  • 0
    git, gitconfig, никто не читает теги, заметка

    Дело не в том, что никто не читает теги, а в том, чтобы, например, я, добавив вашу статью в избранное, мог легко и быстро найти набор статей по интересующей теме у себя в избранном через фильтр тэгов, ну, или банально они нужны для релевантного поиска по всему Хабру…
    • 0
      А я думал что это мэйнстрим добавлять такой тег. Ну да ладно.
      • 0
        Не, я к вам без всяких претензий, я не против приколов) Просто, главное, чтобы были теги, отражающие содержание статьи, у вас это есть. Просто бывают такие случаи, когда теги никак не связаны с содержанием или вообще содержат полную ересь, за такое надо наказывать… как говорится, главное не строгость наказания, а отвратительность неотвратимость))
  • +1
    Для самых маленьких.
    • 0
      лучше таки книжку
      git-scm.com/book/ru
      • 0
        Если хочется быстро, то тот сайт даст небольшую основу, а потом можно и книжку.
    • 0
      Просто для самых маленьких.
  • 0
    git в виде клиента всё же удобнее. И дифы смотреть и лишние команды не надо делать.
    • +7
      Не скажите. Вот я в консоли чувствую себя увереннее чем в гуе. Не знаю почему, но в линуксе (царстве консоли) как-то легче это в терминале делать.
    • +1
      А почему диффы нельзя смотреть из консоли? :(
  • +2
    Да читаем мы теги, читаем.
  • +1
    Префиксы для remote порадовали. В основном работаю с github и сервером компании и каждый раз весь url писать надоедает.
  • +1
    Внимание! Менять эту информацию во время разработки крайне нежелательно. Она может поломать историю (множественные автора)! Желательно единажды выбрать какое-то имя и конкретный Email.
    .mailmap
    • 0
      Хм. Не слышал про него и в проектах не встречал. Возьму на заметку.
  • –3
    я люблю git ^_^
  • 0
    Не совсем в тему, но для гитхаба есть удобный костыль: github.com/defunkt/hub
  • 0
    Для меня на много важней и удобней вот это alias
    git checkout -b name => git cb name

    Но о некоторых вещах узнал благодаря статье… =) спс!
    • +1
      спасибо! Очень упростило жизнь!
  • 0
    Привели бы пример ~/.commit-template

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