Pokud svůj web ukládáte do GIT a nahráváte na server přes FTP, můžete si usnadnit práci pomocí GIT-FTP rozšíření, které se o vše postará za vás.
Instalace Git klienta
Nejprve potřebujete GIT klienta; já budu postup popisovat pro Git Extensions, protože předpokládám, že tohoto klienta budou používat začátečníci, pro které je instalace rozšíření neznámým postupem a naopak uživatelé konzolových Git pro Windows/Linux už budou zkušenější vývojáři, kterým by neměl dělat problém si z popisu odvodit, jaké příkazy je potřeba použít (např. pro naklonování repozitáře).
Uživatelé Linux mohou přeskočit tuto kapitolu, uživatelé konzolových GIT pro Windows si ověří, že mají balík cygwin nebo jiný Bash pro Windows.
Pokud již máte Git Extension nainstalovaný, doporučuji znovu stáhnout instalátor a přeinstalovat. Během instalace ověřte, že jste nainstalovali MsysGit (GitExtensions 2.49 pro Windows místo toho obsahuje Git for Windows 32bit)…
…a zvolili ho jako výchozí konzolový nástroj („Use Git and Unix tools from Command„).
Pokud již máte nainstalován balík cygwin, použijte první („Use Git from Git bash„) nebo druhou („Use Git from Command„) možnost.
Windows x64
Verze GitExtensions 2.49 obsahuje jen 32 bitovou verzi Git for Windows, která sice funguje pro základní práci, ale může mít problémy s pluginy používajícími DLL (např. rozšíření GIT-SVN). Na 64bitových Windows je tedy lepší ručně stáhnout 64bitovou verzi Git a nainstalovat ji samostatně. Git Extensions by měli při spuštění správně najít nainstalovanou verzi Git nebo ji můžete ručně zadat pod Tools – Settings – Git – Command used to run git.
I v této verzi platí výše uvedené s výchozím konzolovým nástrojem (předchozí obrázek).
Čeština
Od verze 2.49 je součástí instalátoru i čeština. (I když nejde o žádný zázrak a jsou to spíše jen strojové nebo mechanické překlady jednotlivých slov.)
Pro její zapnutí zvolte Tools – Settings a pod Appearence změňte Language na Czech. Pro úplný překlad celého programu je potřeba ho ukončit a znovu spustit. České překlady budu uvádět v závorkách nebo za lomítkem „/“ a za anglickými originály.
Instalace git-ftp pluginu
Po instalaci Git Extensions ho spusťte a klikněte na Clone Github repository (kolonovat repozitář Github), přepněte se na záložku Search for repositories (Vyhledat repozitáře), zadejte „git-ftp
“ a klikněte na Get from user (získat od uživatele). Vyberte „git-ftp
“ ze seznamu a dole zadejte cestu, kam ho chcete uložit. Pokud nebudete chtít plugin updatovat nebo rozšiřovat, není potřeba cestu řešit; prostě ho nějak uložte a později můžete složku smazat.
Po stažení budete potřebovat soubor „git-ftp
“ ze složky repozitáře (pro uživatele Windows může být matoucí, že nemá žádnou příponu a ikonu, ale to je tím, že je určený pro Linux). Soubor zkopírujte do složky „c:\Program Files\Git\bin\
“ nebo „c:\Program Files (x86)\Git\bin\
“ nebo prostě tam, kam jste nainstalovali MsysGit (resp. Git)
Zkušenější uživatelé mohou vytvořit symbolický odkaz a soubor updatovat z původního repozitáře na GitHub.
Funkčnost pluginu ověříte tak, že v konzoly nebo bash zadáte příkaz git ftp
a měla by se vypsat nápověda:
git-ftp <action> [<options>] <url>
Pokud plugin nefunguje, vypíše se místo toho:
git: 'ftp' is not a git command.
Pak bude potřeba přesunout soubor „git-ftp
“ do jiné složky bin; např. c:\cygwin\bin
nebo c:\Program Files\Git\mingw64\bin
. Záleží to na tom, jaký konzolový nástroj používáte (resp. jaký byl přibalen v Git instalátoru).
Pokud jste soubor zkopírovali a již nepotřebujete původní repozitář pro GIT-FTP, můžete ho smazat.
Příprava repozitáře
Nyní se v Git Extensions přepněte do repozitáře, který chcete nahrávat přes FTP.
Vytvořte si novou větev (Commands – Create Branch / Příkazy – Vytvořit větev) a nazvěte ji třeba „Deploy-to-FTP
„. Pokud budete chtít stejné soubory nahrávat na více serverů, vytvořte pro každý novou větev (např. „Deploy-to-beta
„, „Deploy-to-PRODUCTION
„, apod.).
Jde to samozřejmě i bez větví, ale s nimi bude přehlednější, co máte kde nasazeno. Nebo pokud již používáte podobné větve (master
, RC
, Final
), můžete použít i je.
Deploy větev vždy vytvářejte na revizi, kterou chcete na server nasadit – pokud máte tedy na serveru již nasazenu starší verzi, vytvořte větev na revizi, která je nasazena. Větev PRODUCTION vytvořte na stabilní a otestované revizi apod.
Konfigurace git-ftp
Nyní je potřeba upravit nastavení repozitáře, aby věděl, kam má soubory nahrávat. Z menu tedy zvolte Repository – Git Maintenance – Edit .git/config (Repozitář – Git údržba – Upravit .git/config).
Na konec souboru přidejte skupinu „git-ftp
“ a do ní zapište údaje pro konfiguraci FTP:
[git-ftp] url = ftp.myserver.com user = ftp-login password = ftp-heslo deployedsha1file = .git-ftp-hash remote-root = /www/
Údaje url
, user
a password
odpovídají tomu, co zadáváte do FTP klienta (např. v Total Commanderu). Pokud potřebujete použít zabezpečené FTP (SFTP nebo FTPS), podívejte se na konec článku jak aktualizovat cURL. Pokud chcete používat více větví (serverů) a nechcete, abyste omylem použili konfiguraci bez konkrétní větve (viz dále), neuvádějte zde hodnoty url
nebo password
, čímž učiníte výchozí konfigurace nepoužitelnou (a později to napravíte ve větvích).
Hodnota remote-root
je cesta, do které se mají soubory nahrát; u hostingů to je obvykle složka „www
„, „public
“ nebo „html
„. Pokud se mají soubory nahrávat přímo do výchozí složky, tuto hodnotu vůbec neuvádějte (nebo uveďte „/“).
Hodnota deployedsha1file
určuje jméno souboru, do kterého se má na serveru ukládat informace o tom, jaká je tam nasazená verze (díky ní plugin pozná, které soubory se změnily a je potřeba je znovu nahrát na server). Pokud ji neuvedete, použije se výchozí jméno. Doporučuje se použít jméno začínající tečkou, protože takové soubory jsou většinou (na Linux serverech) skryté a není je možné přes webový prohlížeč otevřít.
Pokud budete chtít soubory nahrávat do více složek nebo na více serverů, přidejte do konfiguračního souboru další bloky pro příslušné scope:
[git-ftp "beta"] remote-root = /subdomains/beta/ [git-ftp "alfa"] url = ftp.alfa-server.com remote-root = /
Do dalších bloků stačí uvádět jen ty hodnoty, které se liší od výchozího. Pokud jste do výchozího bloku nějakou hodnotu neuvedli, aby nebyla použitelná, musíte ji teď uvést u každého bloku a učinit ho tak použitelným.
Konfigurační soubor uložte a zavřete.
Prvotní distribuce
Nyní je potřeba nahrát na server (nebo servery) soubory pomocí git-ftp. Pozor na to, že tímto se na server nahrají všechny soubory z repozitáře! Před zadáním příkazu se tedy přesvědčte, že máte repozitář přepnutý na příslušnou větev nebo revizi!
Samozřejmě můžete tento krok provést nejprve pro alfa verzi a ostatní servery nastavit až později.
Při nahrávání se vždy existující soubory přepíší, takže nemusíte řešit, pokud již na serveru máte soubory nasazeny.
Spusťte Git bash (CTRL+G nebo Tools / Nástroje – Git bash; ve verzi 2.49 se stačí přepnout na novou záložku Console) a zadejte příkaz:
git ftp init
Nebo pokud máte více serverů (větví), zadejte:
git ftp init -s alfa git ftp init -s beta
Tímto příkazem nahrajete na server všechny soubory z aktuální větve! Bez parametru „s
“ se použije výchozí konfigurace, s parametrem „s
“ se použije konfigurace daného bloku (scope). Nezapomeňte před každým příkazem přepnout repozitář na správnou větev!
Pokud vám skáče chyba „No such file or directory“, podívejte se na konec tohoto článku.
Pokud již na serveru máte nahrány soubory konkrétní revize a máte jistotu, že soubory nikdo neměnil (např. hotfixy), a nechce se vám všechny znovu nahrávat přes git-ftp (protože větší weby obsahují tisíce malých souborů a jejich nahrání trvá dlouhé minuty), můžete místo příkazu init použít catchup, čímž na sebe berete odpovědnost za to, že na serveru je konkrétní verze souborů. Následné updaty již budou nahrávat jen změněné soubory.
git ftp catchup
Nebo pokud máte více serverů (větví), zadejte:
git ftp catchup -s alfa git ftp catchup -s beta
Příprava skriptu
Abyste nemuseli pro nasazení pokaždé psát příkaz do konzole, připravíme si updatovací skript.
V editoru vytvořte soubor „deploy.cmd
„, uložte ho do složky projektu a commitněte tak, aby byl součástí pouze příslušné deploy větve (tedy ne v „master
“ větvi, ale ve větvi např. „deploy-to-FTP
„).
Do souboru zadejte:
@echo off echo. echo Deploying to FTP... echo. bash -c "git ftp push" echo. bash -c "git tag `date \"+deployed-to-FTP_%Y-%m-%d_%H-%M-%S\"`" echo Deployed... pause > NUL
Příkazy pro bash musí být celé na jedné řádce.
Nebo pro více serverů:
@echo off echo. echo Deploying to BETA... echo. bash -c "git ftp push -s beta" echo. bash -c "git tag `date \"+deployed-to-BETA_%Y-%m-%d_%H-%M-%S\"`" echo Deployed... pause > NUL
Příkaz git ftp push
nahraje všechny soubory na FTP server. Příkaz git tag
následně automaticky vytvoří tag s aktuálním datem (díky bash příkazu date
– pozor na ty divné uvozovky, které v bashi spouští příkaz!), abyste měli přehled, kdy a jakou verzi jste na server nahráli. Pokud se vám v tagu zobrazuje špatný čas, podívejte se na konec tohoto článku.
Aby se tag dostal do sdíleného repozitáře, musíte ho tam nahrát. Zvolte Command > Push…, přepněte se na záložku Push tags a buď zvolte daný tag nebo [All] a klikněte na Push. Pokud to chcete dělat automaticky updatovacím skriptem, přidejte do něj příkaz:
bash -c "git push --tags"
Pokud jste při instalaci MsysGit nezvolili „Use Git and Unix tools from Command“ (třetí možnost), bude potřeba pro příkaz bash
uvést i cestu:
"c:\Program Files\Git\bin\bash.exe" -c "git ftp push -s beta" //musí být na jednom řádku //cestu do Program Files dejte do uvozovek!!!
Pro tagovací příkaz musíte uvést cestu k bash
i k date
, takže celý příkaz může (včetně všech uvozovek a lomítek) vypadat:
"C:\Program Files (x86)\Git\bin\bash" -c "git tag `\"/c/Program Files (x86)/Git/bin/date\" \"+test_%Y-%m-%d_%H-%M-%S\"`"
Příkazy jsou samozřejmě pro skript spustitelný z Windows Explorer (Průzkumník) nebo Windows Command (Příkazový řádek). Pro Linux nebo Git bash použijte přímo příkaz git
a uložte jako „deploy.sh
„:
echo. echo Deploying to BETA... echo. git ftp push -s beta echo. git tag `date "+deployed-to-beta_%Y-%m-%d_%H-%M-%S"` echo Deployed...
V bash se musí příkaz spouštět jako ./deploy.sh
. Pokud si to chcete zkrátit, můžete si vytvořit alias. Zadejte příkaz vim ~/.bashrc
, stiskněte „i“ a zadejte na nový řádek "alias deploy=./deploy.sh"
(bez uvozovek). Stiskněte Escape, pak stiskněte dvojtečku „:
“ (na české klávesnici SHIFT + „.
“ resp. SHIFT + >
podle popisků na klávesnici) a zapište „wq
“ (Write and Quit), čímž se soubor uloží. Bash ukončete a znovu spusťte. Když zapíšete příkaz „deploy
„, automaticky se spustí skript deploy.sh
z aktuální složky.
Uložení skriptu
Deploy skript commitněte do každé větve, kterou chcete nasazovat a upravte tak, aby parametr „s
“ používal správnou konfiguraci.
Poznámka: Tento updatovací skript se také nahraje na server a bude (pokud to nezakážete) dostupný přes prohlížeč (pokud si někdo tipne jeho jméno). Jelikož ale neobsahuje nic závadného (kromě jména větve, kterou ale můžete klidně anonymizovat), neměl by s tím být problém. Pokud používáte framework, který přesměrovává traffic do podsložky (např. „public“ v Zend nebo „www“ v Nette), skript samozřejmě bude v hlavní složce a nebude přístupný přes web.
Díky tomu budete mít jistotu, že vždy nasadíte na správný server správnou revizi. A také, že nebudete nahrávat větve, které k tomu nejsou určeny (protože v nich nebude deploy skript).
Nahrání nové verze
Teď, když máte vše připraveno, můžete na server nahrát novou verzi (tedy změny oproti verzi, která již na serveru je díky příkazům init nebo catchup).
Přepněte se do příslušné větve (např. Deploy-to-FTP
) a najděte revizi, kterou chcete nahrát (např. master
). Klikněte na revizi pravým tlačítkem a zvolte Merge into current branch (a ze seznamu vyberte správnou větev – např. „master
„). V okně ověřte, že mergujete správné větve a klikněte na Merge.
Například:
Current branch: deploy-to-FTP Merge with: master
Tím se do deploy
větve zkopírovali všechny změny z master
větve. (Git samozřejmě změny mezi větvemi nekopíruje, ale pouze odkazuje přes hash.)
Pro nahrání změn na server buď spusťte „deploy.cmd
“ z průzkumníka nebo příkazové řádky (přepnuté do složky repozitáře) nebo spusťte Git bash (CTRL+G nebo Tools > Git bash) a zadejte „./deploy.sh
„.
A to je vše. Tento postup (tedy ten popsaný v této kapitole) můžete opakovat pro každé další nasazení.
Zabezpečené FTP
MsysGit podporuje pouze základní (nezabezpečené) FTP. Pokud potřebujete použít šifrování, musíte do složky MsysGit nahrát plnou verzi curl.exe
.
Ze stránky cURL stáhněte verzi pro Windows a ZIP rozbalte. Soubory EXE
a DLL
ze složky OpenSSL
zkopírujte do složky MsysGit
(stejná složka, kam jste kopírovali git-ftp
soubor; např. „c:\Program Files\Git\bin\
“ nebo „c:\Program Files (x86)\Git\bin\
„).
Pokud OpenSSL verze nefunguje, zkuste použít curl.exe
ze složky winssl
.
Kolize s CygWin
Pokud máte nainstalován balík CygWin, můžete narazit na chybu „No such file or directory
„:
creating `/cygdrive/c/TEMP/git-ftp-m7GH/delete_tmp': No such file or directory
Problém je ve špatné konfiguraci konverze cest z Windows formátu (C:\www
) do Unix (/www
), se kterou rozšížení git-ftp neumí pracovat.
Jděte do složky, kde je CygWin nainstalován (např. c:\cygwin
nebo c:\cygwin64
), a otevřete složku etc
. Najděte soubor fstab
a otevřete ho v editoru (stačí Poznámkový blok).
V souboru bude řádek, který bude vypadat nějak takto:
none /cygdrive/ cygdrive binary,posix=0,user 0 0
změňte hodnotu „/cygdrive/
“ na lomítko „/
“ a uložte ho:
none / cygdrive binary,posix=0,user 0 0
Zavřete všechna konzolová okna (nebo restartujte PC) a zkuste spustit skript znovu.
Nastavení časové zóny tagů
Pokud vytváříte pomocí deploy skriptu tagy s časem, bude se čas zobrazovat v UTC nebo GMT (což je to samé).To je vhodné v případě, že repozitář sdílíte s vývojáři po celém světě, a je potřeba se shodnout na tom, kdy přesně se daná verze nasadila.
Pokud ale máte repozitář jen pro sebe (nebo malou českou firmičku bez celosvětových ambicí), může se vám více hodit čas zobrazený v časové zóně Praha (resp. Vídeň či Berlín podle možností – je to úplně jedno).
V případě sh skriptu stačí na začátek přidat řádek:
export TZ="CEST-1"
Tím nastavíte časovou zónu na „Central Europe Summer Time“, což odpovídá +1 hodině v zimě a +2 hodinám v létě (pravděpodobně platí jen v případě, že nemáte ve Windows vypnutou automatickou detekci letního času).
To ale platí jen na Windows, na Linuxu musíte nastavit časovou zónu ve formátu „světadíl/město“, tedy např.
export TZ="Europe/Prague"
Aby bylo možno skript použít na Windows i Linux současně, budete muset rozhodnout, jakou časovou zónu použít:
# Jsme na Windows nebo Linux?
isWindows() { [[ -n "$WINDIR" ]]; }
# Změní časovou zónu podle systému
if isWindows; then
export TZ="CEST-1"
else
export TZ="Europe/Prague"
fi
Pokud používáte CMD skript, bude to trochu složitější, protože tam se vytváří nová bash instance pro každý příkaz a export by tak neměl význam (platil by jen ve své instanci).
Budete tedy muset export zahrnout přímo do příkazu pro vytvoření tagu, což lze provést dvěma způsoby:
"C:\Program Files (x86)\Git\bin\bash" -c "git tag `export TZ=\"CEST-1\"; \"/c/Program Files (x86)/Git/bin/date\" \"+test_%Y-%m-%d_%H-%M-%S\"`"
nebo trochu přehozeně:
"C:\Program Files (x86)\Git\bin\bash" -c "export TZ=\"CEST-1\"; git tag `\"/c/Program Files (x86)/Git/bin/date\" \"+test_%Y-%m-%d_%H-%M-%S\"`"
Tento druhý příkaz je trochu snažší na pochopení toho, co dělá, ale u prvního příkazu je zase na první pohled vidět, že vytváří git tag (a nastavení časové zóny je až druhotné). Fungují oba stejně.
Instalační cestu msysgit (bash) samozřejmě upravte podle potřeby.
Díky moc za detailní popis, velmi to ulehčilo práci!