Hlavní navigace

GIT: config, commit, e-mail a browsing

Karel Žák

Každý, kdo spravuje velké množství obsahu, časem přijde na to, že by potřeboval software, který by mu pomohl nad tímto obsahem držet ochrannou ruku. Takovým pomocníkem může být například nástroj GIT. V dnešním článku probereme konfiguraci GITu, naučíme se provádět commit a posílat patche e-mailem.

Před tím než začnete provádět změny do svého repositáře, je vhodné provést alespoň základní konfiguraci. Konfigurace se ukládá do souboru .git/config nebo ~/.gitconfig a k modifikaci/lis­tování slouží příkaz  git-config.

$ git config --global --list

GIT vcelku pečlivě uchovává informace o autorech a commitorech patchů. Je však nutno na počátku nastavit:

$ git config --global user.name "Full Hacker"
$ git config --global user.email hacker@example.com"

Je tedy na čase udělat do repositáře nějakou změnu. Předpokládejme, že máme nově udělaný prázdný repositář. Ve svém editoru vytvořte soubor file1.c a řekněte GITu, že soubor má být součásti příštího commitu (přesněji řečeno přidejte soubor do indexu):

$ git add file1.c

Podívejme se, co na to GIT:

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file: file1.c
#

Provedeme commit:

$ git commit -a -s -m "toto je komentář"

a pro studium jednotlivých options:

$ git commit --help

Důležité je nezapomenout, že první řádka komentáře patche se používá jako subject a pojmenování patche.

Nakonec se můžeme na celý commit podívat:

$ git show
commit e8fa25358eca06285757e3c1029d7f5f884283be
Author: Karel Zak <kzak@....>
Date:   Wed Mar 19 00:08:09 2008 +0100

    toto je komentář

  Signed-off-by: Karel Zak <kzak@redhat.com>

diff --git a/file1.c b/file1.c
new file mode 100644
index 0000000..53c5fdf
--- /dev/null
+++ b/file1.c
@@ -0,0 +1 @@
+#include <stdio.h>

Neuvedli jsme žádnou referenci (tag, SHA-1, …) takže příkaz show byl proveden na default referenci, kterou je HEAD, tedy poslední commit aktuální větve.

Občas se hodí vydolovat patch z repositáře a uložit ho jako samostatný diff soubor:

$ git format-patch -o ~/ HEAD^
/home/kzak/0001-any-other-include.patch

a když už máme patch, tak ho můžeme někomu poslat:

$ git send-email --to guru@project.org ~/0001-any-other-include.patch

Na rozdíl od řady MUA se tento příkaz nedopustí žádného násilí na odesílaném diffu. Je nepsaným pravidlem posílat patche v těle dopisu (žádná příloha) a posílat vždy jeden patch v jednom e-mailu. Je zřejmé, že cesta mezi vaší tvořivostí ve vašem editoru a odesláním hotového patche může být hodně krátká a přímočará.

Pokud nějaký patch dostanete e-mailem, lze ho snadno aplikovat pomocí příkazu:

$ git am -i ~/Mail/box

Pochopitelně příkaz může být nefunkční, pokud odesílatel použil hloupý MUA nebo přílohu.

Co opravdu v podání CVS bolí, je hledání odpovědí na to, co kdo kde změnil. V GITu seznam všech změn:

$ git log

nebo stručněji:

$ git log --pretty=oneline

Zajímá-li vás jen určitý soubor:

$ git log file1.c

A co třeba jednotlivé řádky souboru? Typicky „Jééé… kterej trouba udělal tenhle bug?“:

$ git blame -L8,8 file1.c
4ba6758a (Karel Zak 2008-03-19 00:52:03 +0100 8)      printf("%s\n", argv[argc+1]);

tedy na řádce 8 ( -L je rozsah) v souboru file1.c.

Našli jste v článku chybu?