Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:
Python občas sám od sebe vytváří adresář __pycache__
s pomocnými soubory.
Některé počítače vytváří skryté soubory s názvy jako
.Thumbnails
, .DS_Store
nebo Thumbs.db
.
Takové věci v repozitáři nemají co dělat – je
dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.
Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři jen samotný program. Obrázky si může pomocí programu každý vytvořit sám.
Občas se stane, že v adresáři s repozitářem máš soubor s osobními poznámkami nebo třeba s heslem. Zbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat jen ve tvé kopii.
Jistě už sis zvykl/a na virtuální prostředí.
Adresář s ním se může jmenovat různě, v kurzu PyLadis používáš název venv
.
Není dobré tento adresář dávat do Gitu,
protože je jednoduché jej vždy vytvořit znovu
a pokud na projektu spolupracuje více lidí
(nebo ty z více počítačů), mohlo by dělat neplechu, kdyby virtuální
prostředí nebylo vždy na úplně stejném místě.
Virtuální prstředí z adresáře /home/helena/projektABC/venv
nebude fungovat z adresáře C:\Users\Helena\projektABC\venv
,
ale ani z /home/mirka/projektABC/venv
.
My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby
git status
neukazoval červeně, že ještě nejsou v repozitáři.
Pojďme si to ukázat na příkladu. Založ si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:
obrazek.py
from turtle import forward, left, right, getcanvas
forward(50)
left(60)
forward(50)
right(60)
forward(50)
getcanvas().postscript(file='obrazek.ps')
poznamky.txt
Tohle je tajné!
Autofile.tmp
Do tohohle souboru napiš cokoliv.
Různé operační systémy a (jiné programy) vytváří různé soubory
podivných jmen; Autofile.tmp
pro nás bude představovat takový
automaticky vzniklý soubor.
Pythonní program spusť (pomocí python obrazek.py
).
Mělo by se na chvíli ukázat okno s želvou a měl by vzniknout nový soubor
obrazek.ps
.
Obrázek ve formátu PostScript (.ps) se dá otevřít ve většině programů, které zvládají i PDF, případně v Inkscape.
Jak se na to dívá Git?
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
Autofile.tmp
obrazek.ps
obrazek.py
poznamky.txt
nothing added to commit but untracked files present (use "git add" to track)
Spousta souborů, ale jen jeden z nich chceš v repozitáři. Co s těmi ostatními?
Nejjednodušší je vyrovnat se se souborem obrazek.ps
.
V repozitáři ho nechceš (je to repozitář zdrojového kódu; výsledky bývá
lepší schraňovat jinde než v Gitu).
Zároveň víš, že každý, kdo s repozitářem bude pracovat, pravděpodobně
tenhle soubor vytvoří.
Bylo by tedy dobré říct všem lidem, kteří se k repozitáři dostanou, že tento
soubor nechceš.
To se dělá záznamem ve speciálním souboru v repozitáři.
Udělej soubor s názvem .gitignore
.
(Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává –
doporučuji soubor vytvořit v programátorském editoru.)
Do něj napiš:
obrazek.ps
Pak se podívej na git status.
Obrázek už by ve výpisu neměl být!
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Autofile.tmp
obrazek.py
poznamky.txt
nothing added to commit but untracked files present (use "git add" to track)
Nový soubor .gitignore
(a samotný program) potřebujeme přidat do repozitáře.
Udělej to, pomocí git add
:
$ git add .gitignore obrazek.py
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: obrazek.py
Untracked files:
(use "git add <file>..." to include in what will be committed)
Autofile.tmp
poznamky.txt
Když uděláš git commit
a repozitář nasdílíš s ostatními, všichni dostanou
.gitignore
s instrukcí, že obrazek.ps
do repozitáře nepatří.
Jak ignorovat zbylé dva soubory?
Soubor poznamky.txt
se taky dá zařadit do .gitignore
, ale moc se tam nehodí.
Existuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří
soubor se stejným jménem.
Dejme ho tedy do souboru, který se nebude šířit s repozitářem.
Tento soubor je .git/info/exclude
.
(Může být trochu složité ho najít, protože adresář .git
je skrytý.
Nevidíš–li ho, napiš okýnku pro otevření souboru .git
a dostaneš se do něj.)
Soubory v adresáři .git
bys neměl/a měnit, protože se tak dá přijít
o historii projektu.
Ale exclude
je výjimka. Napiš na konec tohoto souboru:
poznamky.txt
A po uložení budou poznámky ignorovány!
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: obrazek.py
Untracked files:
(use "git add <file>..." to include in what will be committed)
Autofile.tmp
Některé programy automaticky vytvářejí pomocné soubory.
Často to dělají správci souborů (často .Thumbnails
na Linuxu,
.DS_Store
na Macu nebo Thumbs.db
na Windows).
Některé editory si taky nechávají na disku nastavení.
Podobné soubory se dají dát do .gitignore
.
Je ale lepší si je dát do osobního nastavení, protože ostatní lidé,
kteří na projektu můžou spolupracovat, nemusí používat stejný systém
a programy.
Pokud si můžeš být jistý/á, že ostatní budou používat právě
ten program, který používáš ty, použij .gitignore
.
Příklad je adresář __pycache__
, který vytváří Python při importu modulu.
Soubor s osobním nastavením si můžeš pojmenovat, jak chceš, a můžeš ho uložit
kde budeš chtít.
Já doporučuji ho pojmenovat .gitignore_global
a dát ho do tvého domovského
adresáře.
Do souboru zase napiš jméno ignorovaného souboru:
Autofile.tmp
Potom řekni Gitu, kde tento soubor najít:
$ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global
A měl by být ignorován:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: obrazek.py
Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: každý na zvláštní řádek. Kromě toho je možné použít několik vychytávek:
*
ve jméně souboru nahradí část jména souboru.
Takže pokud chceš ignorovat všechny soubory s příponou .tmp
, můžeš napsat:
*.tmp
/
na konci jména značí adresář. Chceš-li tedy ignorovat adresáře
__pycache__
(což v Pythonním projektu chceš), napiš do .gitignore
:
__pycache__/
Další detaily je možné najít v dokumentaci.
Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo
git add soubor1 soubor2
git commit
můžeš napsat jen git commit
s tečkou na konci:
$ git commit .
To automaticky přidá všechny neignorované soubory, které git status
ukazuje
červeně.
Tečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá
do revize.
Doporučuji si před použitím téhle zkratky zkontrolovat git status
, aby sis
ověřil/a, že nepřidáváš nic, co nechceš.
Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize, ukazovala poznámka s tím, co vlastně v nové revizi bude:
$ git config --global commit.verbose 1