Autor Zpráva
joe
Profil
Ahoj,

ještě bych měl pár otázek k Gitu, prosím o opravení, pokud dělám něco špatně, když vyvíjím jen na svém PC (chci to vyzkoušet) a nemám nikde nic uloženo vzdáleně:

Při vytváření projektu na doméně example.com:

1. Vytvořím si sdílený repozitář (master), tzn. jeden adresář (kam je zvykem ho ukládat?) - v prohlížeči bych ho chtěl vidět pod master.example.com[.dev]

2. Naklonuju si vytvořený repozitář (pracovní), abych mohl do masteru pushovat. (tím vznikne pracovní kopie, její adresář bych měl ukládat kam? Do document rootu?)

- v prohlížeči bych ho chtěl vidět pod example.com.dev

----

Když budu mít víc větví, chtěl bych si je taky prohlédnout, ale jen u té master verze. Tzn. pokud tam bude větev stage, chtěl bych to vidět pod stage.example.com[.dev]

----

Poradil by mi někdo jak na to? Jakou bych měl zvolit adresářovou strukturu? Co všechno je třeba dát do document rootu...? Používám Windows.

Teoreticky si myslím, že by to asi mělo být tak, že když z pracovní kopie pushnu do větve stage v masteru, tak se budu mít nějaký adresář v document rootu, kam se checkoutne větev stage a to pak bude dostupné pod URL adresou (?)
Jan Tvrdík
Profil
joe:
Není běžné pracovat s Gitem způsobem, že jedna složka odpovídá jedné větvi. Je to spíš přežitek z doby kdy bylo populární (a bohužel pořád je) SVN. Většina vývojářů pracuje v jednom adresáři a mezi větvemi se přepíná příkazem git checkout.


Nicméně Git si neklade na workflow téměř žádná omezení, takže to realizovat jde. Pokud si tedy chceš rozchodit lokálně, to, na co většina lidí má vzdálený server, tak bych postupoval asi následovně. (Příkazy předpokládají, že je spouštíš na Windows přes Git Bash.)

1) Vytvořit bare repozitář (tj. repozitář, který nemá working dir, ekvivalent „origin“ repozitáře, který bývá na serveru.
git init --bare bare-repository
2) Vytvořit si normální repozitář jako klon toho bare repository
git clone 'C:\a\b\...\bare-repository' work
3) Zkopírovat soubor bare-repository/hooks/post-receive.sample do bare-repository/hooks/post-receive
cp 'bare-repository/hooks/post-receive.sample' 'bare-repository/hooks/post-receive'
4) Vytvořit složky deployed-master a deployed-stage
mkdir deployed-master deployed-stage
5) Upravit soubor bare-repository/hooks/post-receive. Tohle je nejtěžší část, neboť vyžaduje, abys uměl psát shellové skripty. Jednoduchá varianta může vydat třeba takto

#!/bin/sh
read oldrev newrev refname
branch=${refname##refs/heads/}
 
if [[ $branch = "master" || $branch = "stage" ]]
then
    echo "Deploying branch $branch..."
    targetDir="$PWD/../deployed-$branch"
 
    if [ -d $targetDir ]
    then
        rm -rf $targetDir/* && \
        git archive --format=tar $branch | (cd $targetDir && tar xf -) && \
        echo "Done"
    else
        echo "Error: Directory $targetDir does not exist!"
        exit 1
    fi
fi
6) Upravit nastavení Apache a soubor hosts, aby se ti vše zobrazovalo pod chtěnými URL.
joe
Profil
Jan Tvrdík:
Děkuju moc za podrobnější vysvětlení, pro mě je vždycky ideální se to nějakým způsobem dovědět z praktické ukázky od někoho, než teoreticky odjinud.

S těma složkama jsme se možná trošku špatně pochopili, tou sdílenou jsem myslel právě ten "bare repozitář", takže už vím jak tomu říkat.

Takže pokud to dobře chápu, ten origin bych měl být v document root na serveru. Pokud bych tedy tedy otevřel URL example.com.dev, tak by se "načítal" origin?

Ten normální repozitář bych měl pak někde mimo ten document root.

---

Shell skripty znám opravdu jenom malé základy, ale dohledat by to pak neměl být problém. Chci to jen pro vlastní potřeby, ale rád dělám věci tak, jak mají (/by měly) být.

Úprava těch hostů, nedá se to nějak zautomatizovat? Kdybych měl třeba 100 projektů, u každého třeba od 5 a víc větví, tj. 500+ řádků v hosts a to už je pak docela neudržitelné a znamenalo by to při každém vytvoření nové větve editovat i hosts.

---

A ještě hloupá otázka, ten bash skript se spustí i na Windows? :-) (pardon, ale příkazovou řádku používám opravdu minimálně a bash jde mimo mě)
joe
Profil
Ne, napsal jsem blbost. Přístupná pro mě by měla být pracovní kopie, abych se vždycky dostal na větev, kterou mám aktivní. Tzn. bare repozitář uložit někam jinam. Otázka je, jestli je vůbec potřeba :-) když to chci jen pro lokální vývoj...
Jan Tvrdík
Profil
joe:
Zkus si ty příkazy, co jsem ti napsal, nejenom přečíst, ale vyzkoušet, jak se to chová. Tj. zkus si vytvořit pár commitů v adresáři/repozitáři work ve větvích master a stage a pushnout je. Budeš moudřejší a nebudeš se ptát na zbytečné věci.

Takže pokud to dobře chápu, ten origin bych měl být v document root na serveru
Mám trochu problém s tvojí nepřesnou terminologií. origin je (konkrétně v situaci vzniklé po provedení příkazů popsaných v [#2]) název vzdáleného repozitáře u repozitáře work, konkrétně repozitáře sídlícího ve složce bare-repository. Zkus si spustit příkaz git remote -v ve složce work.
Repozitář ve složce bare-repository je tzv. bare repozitář, což znamená, že nemá working directory a tedy jeho umístění do document rootu nedává žádný smysl. Prohlédni si obsah složky bare-repository.
Adresáře, které by měly být jako document rooty domén master.example.com a stage.example.com (nebo jak to vlastně chceš) jsou deployed-master a deployed-stage.

Ten normální repozitář bych měl pak někde mimo ten document root.
Pokud tím myslíš repozitář ve složce work (repozitář, který není bare repozitářem), tak ten obvykle budeš chtít mít taky dostupný přes nějakou URL, protože to je složka, ve které pracuješ, provádíš změny, tvoříš commity a pushuješ je do toho bare repozitáře.

Úprava těch hostů, nedá se to nějak zautomatizovat?
Můžeš to třeba zautomatizovat tak, že upravíš ten post-receive hook (což je skript spuštěný automaticky při pushnutí do toho bare repozitáře), aby v případě, že vytvoříš větev, které předtím neexistovala automaticky přidal do hosts souboru příslušný řádek a upravil konfigurace Apache. Alternativně si můžeš zprovoznit lokální DNS server, viz např. phpfashion.com/heureka-example-l-na-localhost.

ten bash skript se spustí i na Windows
Pokud máš standardní instalaci Gitu, tak by to mělo fungovat bez problémů. (Taky mám Windows.)
joe
Profil
Jan Tvrdík:
OK, nejradši bych ten příspěvek, na který jsi reagoval, smazal, ráno moudřejší večera, možná už je dost hodin na ráno, díky za trpělivost.

Vyřeším to následovně:

- document root mám v C:\web\www
- bare repozitáře budou v C:\web\repositories
- ukázkový projekt - bare repozitář bude v C:\web\repositories\example.com
- ukázkový projekt - pracovní adresář (normální repozitář, tebou uváděný work) bude v C:\web\www\example.com\work, dostupná na example.com.dev
- ukázkový projekt - větev master bude v C:\web\www\example.com\deployed-master, dostupná na master.example.com.dev
- ukázkový projekt - větev stage bude v C:\web\www\example.com\deployed-stage, dostupná na stage.example.com.dev

Tak si myslím, že by to mohlo fungovat...

Vaše odpověď

Mohlo by se hodit

Pokuste se již v titulku uvést název programu související s tématem.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: