Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Spolupráce a Open Source > Ignorování souborů

Ignorování souborů

Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:

Pomocné soubory nástrojů

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.

Výstup programu

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.

Osobní soubory

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.

Adresář s virtuálním prostředím

Jistě už sis zvykla na virtuální prostředí. Adresář s ním se může jmenovat různě, v začátečnickém kurzu 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í prostř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.

Příprava

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?

Výstupy programu a pomocné soubory společných nástrojů

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?

Osobní poznámky

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

Další haraburdí

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

Formát ignorovacího souboru

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.

Automatické přidávání

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

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem. Přejít na stejnou lekci v kurzu pro samouky.