Č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.
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ěla 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ěřila, ž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
{ "data": { "sessionMaterial": { "id": "session-material:2017/pyladies-brno-jaro-po:file:6", "title": "Ignorování souborů v Gitu (bonus)", "html": "\n \n \n\n <h1>Ignorování souborů</h1>\n<p>Často se stává, že některé soubory v repozitáři nechceš.\nTakových souborů jsou tři hlavní druhy:</p>\n<dl>\n<dt></dt><dt>Pomocné soubory nástrojů</dt><dd><p>Python občas sám od sebe vytváří adresář <code>__pycache__</code> s pomocnými soubory.\nNěkteré počítače vytváří skryté soubory s názvy jako\n<code>.Thumbnails</code>, <code>.DS_Store</code> nebo <code>Thumbs.db</code>.\nTakové věci v repozitáři nemají co dělat – je\ndobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.</p>\n</dd><dt></dt><dt>Výstup programu</dt><dd><p>Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři\njen samotný program.\nObrázky si může pomocí programu každý vytvořit sám.</p>\n</dd><dt></dt><dt>Osobní soubory</dt><dd><p>Občas se stane, že v adresáři s repozitářem máš soubor s osobními\npoznámkami nebo třeba s heslem.\nZbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat\njen ve tvé kopii.</p>\n</dd></dl><p>My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby\n<code>git status</code> neukazoval červeně, že ještě nejsou v repozitáři.</p>\n<h2>Příprava</h2>\n<p>Pojďme si to ukázat na příkladu.\nZalož si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:</p>\n<ul>\n<li><p><code>obrazek.py</code></p>\n<div class=\"highlight\"><pre><span></span> <span class=\"kn\">from</span> <span class=\"nn\">turtle</span> <span class=\"kn\">import</span> <span class=\"n\">forward</span><span class=\"p\">,</span> <span class=\"n\">left</span><span class=\"p\">,</span> <span class=\"n\">right</span><span class=\"p\">,</span> <span class=\"n\">getcanvas</span>\n\n <span class=\"n\">forward</span><span class=\"p\">(</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n <span class=\"n\">left</span><span class=\"p\">(</span><span class=\"mi\">60</span><span class=\"p\">)</span>\n <span class=\"n\">forward</span><span class=\"p\">(</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n <span class=\"n\">right</span><span class=\"p\">(</span><span class=\"mi\">60</span><span class=\"p\">)</span>\n <span class=\"n\">forward</span><span class=\"p\">(</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n <span class=\"n\">getcanvas</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">postscript</span><span class=\"p\">(</span><span class=\"nb\">file</span><span class=\"o\">=</span><span class=\"s1\">'obrazek.ps'</span><span class=\"p\">)</span>\n</pre></div></li>\n<li><p><code>poznamky.txt</code></p>\n<div class=\"highlight\"><pre><code> Tohle je tajné!</code></pre></div></li>\n<li><p><code>Autofile.tmp</code></p>\n<p>Do tohohle souboru napiš cokoliv.\n Různé operační systémy a (jiné programy) vytváří různé soubory\n podivných jmen; <code>Autofile.tmp</code> pro nás bude představovat takový\n automaticky vzniklý soubor.</p>\n</li>\n</ul>\n<p>Pythonní program spusť (pomocí <code>python obrazek.py</code>).\nMělo by se na chvíli ukázat okno s želvou a měl by vzniknout nový soubor\n<code>obrazek.ps</code>.</p>\n<div class=\"admonition note\"><p>Obrázek ve formátu PostScript (.ps) se dá otevřít ve většině programů, které\nzvládají i PDF, případně v <a href=\"https://inkscape.org/\">Inkscape</a>.</p>\n</div><p>Jak se na to dívá Git?</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git status\nOn branch master\n\nInitial commit\n\nUntracked files:\n (use "git add <file>..." to include in what will be committed)\n\n <span style=\"color: #aa0000\">Autofile.tmp</span>\n <span style=\"color: #aa0000\">obrazek.ps</span>\n <span style=\"color: #aa0000\">obrazek.py</span>\n <span style=\"color: #aa0000\">poznamky.txt</span>\n\nnothing added to commit but untracked files present (use "git add" to track)</code></pre></div><p>Spousta souborů, ale jen jeden z nich chceš v repozitáři.\nCo s těmi ostatními?</p>\n<h2>Výstupy programu a pomocné soubory společných nástrojů</h2>\n<p>Nejjednodušší je vyrovnat se se souborem <code>obrazek.ps</code>.\nV repozitáři ho nechceš (je to repozitář <em>zdrojového</em> kódu; výsledky bývá\nlepší schraňovat jinde než v Gitu).\nZároveň víš, že každý, kdo s repozitářem bude pracovat, pravděpodobně\ntenhle soubor vytvoří.\nBylo by tedy dobré říct <em>všem</em> lidem, kteří se k repozitáři dostanou, že tento\nsoubor nechceš.\nTo se dělá záznamem ve speciálním souboru v repozitáři.</p>\n<p>Udělej soubor s názvem <code>.gitignore</code>.\n(Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává –\ndoporučuji soubor vytvořit v programátorském editoru.)\nDo něj napiš:</p>\n<div class=\"highlight\"><pre><code>obrazek.ps</code></pre></div><p>Pak se podívej na <code>git status.</code> Obrázek už by ve výpisu neměl být!</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git status\nOn branch master\n\nInitial commit\n\nUntracked files:\n (use "git add <file>..." to include in what will be committed)\n\n <span style=\"color: #aa0000\">.gitignore</span>\n <span style=\"color: #aa0000\">Autofile.tmp</span>\n <span style=\"color: #aa0000\">obrazek.py</span>\n <span style=\"color: #aa0000\">poznamky.txt</span>\n\nnothing added to commit but untracked files present (use "git add" to track)</code></pre></div><p>Nový soubor <code>.gitignore</code> (a samotný program) potřebujeme přidat do repozitáře.\nUdělej to, pomocí <code>git add</code>:</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git add .gitignore obrazek.py\n<span style=\"color: #00aaaa\">$</span> git status\nOn branch master\n\nInitial commit\n\nChanges to be committed:\n (use "git rm --cached <file>..." to unstage)\n\n <span style=\"color: #00aa00\">new file: .gitignore</span>\n <span style=\"color: #00aa00\">new file: obrazek.py</span>\n\nUntracked files:\n (use "git add <file>..." to include in what will be committed)\n\n <span style=\"color: #aa0000\">Autofile.tmp</span>\n <span style=\"color: #aa0000\">poznamky.txt</span></code></pre></div><p>Když uděláš <code>git commit</code> a repozitář nasdílíš s ostatními, všichni dostanou\n<code>.gitignore</code> s instrukcí, že <code>obrazek.ps</code> do repozitáře nepatří.</p>\n<p>Jak ignorovat zbylé dva soubory?</p>\n<h2>Osobní poznámky</h2>\n<p>Soubor <code>poznamky.txt</code> se taky dá zařadit do <code>.gitignore</code>, ale moc se tam nehodí.\nExistuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří\nsoubor se stejným jménem.</p>\n<p>Dejme ho tedy do souboru, který se nebude šířit s repozitářem.\nTento soubor je <code>.git/info/exclude</code>.\n(Může být trochu složité ho najít, protože adresář <code>.git</code> je skrytý. \nNevidíš–li ho, napiš okýnku pro otevření souboru <code>.git</code> a dostaneš se do něj.)</p>\n<p>Soubory v adresáři <code>.git</code> bys neměla měnit, protože se tak dá přijít\no historii projektu.\nAle <code>exclude</code> je výjimka. Napiš na konec tohoto souboru:</p>\n<div class=\"highlight\"><pre><code>poznamky.txt</code></pre></div><p>A po uložení budou poznámky ignorovány!</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git status\nOn branch master\n\nInitial commit\n\nChanges to be committed:\n (use "git rm --cached <file>..." to unstage)\n\n <span style=\"color: #00aa00\">new file: .gitignore</span>\n <span style=\"color: #00aa00\">new file: obrazek.py</span>\n\nUntracked files:\n (use "git add <file>..." to include in what will be committed)\n\n <span style=\"color: #aa0000\">Autofile.tmp</span></code></pre></div><h2>Další haraburdí</h2>\n<p>Některé programy automaticky vytvářejí pomocné soubory.\nČasto to dělají správci souborů (často <code>.Thumbnails</code> na Linuxu,\n<code>.DS_Store</code> na Macu nebo <code>Thumbs.db</code> na Windows).\nNěkteré editory si taky nechávají na disku nastavení.</p>\n<p>Podobné soubory se dají dát do <code>.gitignore</code>.\nJe ale lepší si je dát do osobního nastavení, protože ostatní lidé,\nkteří na projektu můžou spolupracovat, nemusí používat stejný systém\na programy.</p>\n<div class=\"admonition note\"><p>Pokud si můžeš být jistá, že ostatní budou používat právě\nten program, který používáš ty, použij <code>.gitignore</code>.\nPříklad je adresář <code>__pycache__</code>, který vytváří Python při importu modulu.</p>\n</div><p>Soubor s osobním nastavením si můžeš pojmenovat, jak chceš, a můžeš ho uložit\nkde budeš chtít.\nJá doporučuji ho pojmenovat <code>.gitignore_global</code> a dát ho do tvého domovského\nadresáře.</p>\n<p>Do souboru zase napiš jméno ignorovaného souboru:</p>\n<div class=\"highlight\"><pre><code>Autofile.tmp</code></pre></div><p>Potom řekni Gitu, kde tento soubor najít:</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global</code></pre></div><p>A měl by být ignorován:</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git status\nOn branch master\n\nInitial commit\n\nChanges to be committed:\n (use "git rm --cached <file>..." to unstage)\n\n <span style=\"color: #00aa00\">new file: .gitignore</span>\n <span style=\"color: #00aa00\">new file: obrazek.py</span></code></pre></div><h2>Formát ignorovacího souboru</h2>\n<p>Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů:\nkaždý na zvláštní řádek.\nKromě toho je možné použít několik vychytávek:</p>\n<ul>\n<li><p><code>*</code> ve jméně souboru nahradí část jména souboru.\nTakže pokud chceš ignorovat všechny soubory s příponou <code>.tmp</code>, můžeš napsat:</p>\n<div class=\"highlight\"><pre><code>*.tmp</code></pre></div></li>\n<li><p><code>/</code> na konci jména značí adresář. Chceš-li tedy ignorovat adresáře\n<code>__pycache__</code> (což v Pythonním projektu chceš), napiš do <code>.gitignore</code>:</p>\n<div class=\"highlight\"><pre><code>__pycache__/</code></pre></div></li>\n</ul>\n<p>Další detaily je možné najít v <a href=\"https://git-scm.com/docs/gitignore\">dokumentaci</a>.</p>\n<h2>Automatické přidávání</h2>\n<p>Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo</p>\n<div class=\"highlight\"><pre><span></span><span class=\"go\">git add soubor1 soubor2</span>\n<span class=\"go\">git commit</span>\n</pre></div><p>můžeš napsat jen <code>git commit</code> s tečkou na konci:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git commit .\n</pre></div><p>To automaticky přidá <em>všechny</em> neignorované soubory, které <code>git status</code> ukazuje\nčerveně.\nTečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá\ndo revize.</p>\n<p>Doporučuji si před použitím téhle zkratky zkontrolovat <code>git status</code>, aby sis\nověřila, že nepřidáváš nic, co nechceš.</p>\n<p>Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize,\nukazovala poznámka s tím, co vlastně v nové revizi bude:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git config --global commit.verbose <span class=\"m\">1</span>\n</pre></div>\n\n\n " } } }