Git a checkout podadresáře

Git a checkout podadresáře
« kdy: 18. 08. 2015, 14:56:00 »
Jsem začínající uživatel GITu a narazil jsem na jeden problém. Potřeboval bych checkoutnout jen podadresář - ne celý repozitář.
Jde o to, že mám repozitář s projektem a ten obsahuje krom zdrojáků i podklady, dokumentaci atp.
Na server ale potřebuji nahrát jen zdrojáky a zbytek (např. podklady) nepotřebuji - dokonce na ně na serveru nemám ani dost místa.

Po hledání jsem zjistil, že na toto existuje od verze 1.7 funkce sparse-checkout, ale ta se mi nějak nepodařila rozjet:

Kód: [Vybrat]
echo some/dir/ >> .git/info/sparse-checkout
mi vypisuje, že adresář neexistuje.

Také jsem našel zmínku, že:

Kód: [Vybrat]
git clone --no-checkout
by měl pomoci, ale to se mi taky nepodařilo.

Jak se takovýto problém obyčejně řeší? Pokud je nejlepší ten sparse-checkout, tak k čemu slouží ten příkaz

Kód: [Vybrat]
git remote add –f <name> <url>
co je uveden v článku?


nou

Re:Git a checkout podadresáře
« Odpověď #1 kdy: 18. 08. 2015, 15:24:23 »
A ten repozitar je inicializovany?
Kód: [Vybrat]
git init Pretoze ten ukazkovy priklad z tej stranky funguje naramne.

Re:Git a checkout podadresáře
« Odpověď #2 kdy: 18. 08. 2015, 15:27:59 »
To jo, ale tento příkaz jsem nedělal, protože mu nerozumím. Nevím k čemu je a co tam mám dosadit:

Kód: [Vybrat]
git remote add –f <name> <url>
Ty příkazy z článku se mají dělat na místě kde chci tu část repozitáře nebo tam kde mám repozitář, ze kterého budu tahat?

T

Re:Git a checkout podadresáře
« Odpověď #3 kdy: 18. 08. 2015, 15:39:07 »
Checkout v GITu se dělá z lokálního repozitáře. Tuším, že s trochou snahy jde nadefinovat, ve kterém adresáři se ten repozitář nachází, ale pořád je při běžném použití na tom stroji, ze kterého se checkoutuje. Ale pořád na rozdíl od SVN na tom stroji bude celý repozitář, ne jen checkout. Při klonování repozitáře je možné omezit historii (--depth), ale pokud vím, tak nejde jen vybrat některé adresáře/soubory.

Pomocí sparse-checkout by mělo jít vytáhnout z lokálního repozitáře jen ten adresář, který chcete. Ale pořád na tom serveru bude kompletní repozitář, kde ty podklady, dokumentace atd. budou (a tedy to bude zřejmě velké). Pokud tam může být repozitář, jen nechcete v checkoutu věci, které nepotřebujete, je zřejmě sparse-checkout to, co hledáte.

Kód: [Vybrat]
git remote add sdělí lokálnímu repozitář, že existuje nějaký jiný, se kterým si může povídat (vyměňovat data)

Pokud se na server ta dokumentace nevejde, nemůže tam být ani repozitář s ní. Pak pravděpodobně chcete pomocí git archive vytáhnout část repozitáře, která patří na server a zkopírovat ji tam bez pomoci gitu.

Ovrscout

Re:Git a checkout podadresáře
« Odpověď #4 kdy: 18. 08. 2015, 16:02:55 »
Jestli jsem to pochopil správně tak chcete omezit to co je uloženo v repositáři (hlavně na serveru). Ale sparse/checkout se týka pouze pracovniho adresare, neboli toho co je na lokálním pc. Repositar je tedy vždy kompletni ale v pracovnim adresari se pracuje jenom se zvolenou částí.

V gitu označuje commit vždy stav vsech souboru v daném čase plus odkaz na předchozí commit/y (pomocí SHA1 hash), nejde publikovat jenom část stromu, protože by se změnil hash všech commitů a tak by se jednalo o jiné repository.
Já to řeším rozdělením do dvou repository (kde to vnitřní může být submodul nebo prostě jen vnořené repository). Vnější git pak uchovává pouze aktuální commit vnořeného repo. ale už ne vlastní data, to už se ve vnořeném repository spravuje samostatně.

Pokud už máte spoustu commitů kde to je spojeno tak může být problém to rozdělit, mělo by jít pustit na všech předchozích kommitech skript (pomocí filter-branch) který smaže adresář s dokumentací a nebo opačně, vše ostatní.
To ale nevratně změní SHA1 jednotlivých commitů takže se to bude tvářit jako nové repository které nebude kompatibilní s předchozími.



Re:Git a checkout podadresáře
« Odpověď #5 kdy: 18. 08. 2015, 16:19:55 »
Ano, tedy sparse-checkout pro mě nebude. Z důvodu bezpečnosti a úspory místa nechci na webserver nahrávat nic co tam není potřeba. Takže celý repozitář vč. podkladů mám na strojích, kde se na projektu pracuje, ale na server chci dávat pouze část.

Dokonce ani nutně nepotřebuji (přestože by to bylo lepší - viz níže) aby byla data na serveru nějak verzována, protože nepředpokládám, že by někdo něco chtěl měnit přímo na serveru a změny někam commitovat. Takže by mi stačilo něco jako má SVN svn export (pokud si dobře vzpomínám), kdy dojde k vytvoření kopie požadovaného adresáře bez .svn dat.
Jen kdyby to šlo přímo na serveru kde chci data nahrávat.

U SVN jsem to dělal tak, že jsem na serveru checkoutnul požadovaný podadresář (tam to lze) a pak už jen v případě potřeby  použil svn update a měl jsem na serveru aktuální verzi. Výhodou bylo, že jsem mohl nahrát i starší revizi atp.

GIT tedy něco takového neumožňuje? Mohu nahrát pouze celý repozitář nebo soubory nahrávat přes FTP ručně?

Re:Git a checkout podadresáře
« Odpověď #6 kdy: 18. 08. 2015, 16:22:20 »
A co to resit poradne? Takze job na CI serveru, ktery dela deploy a da se parametrizovat verzi repa (defaultne head)?

Re:Git a checkout podadresáře
« Odpověď #7 kdy: 18. 08. 2015, 16:24:10 »
Já to řeším rozdělením do dvou repository (kde to vnitřní může být submodul nebo prostě jen vnořené repository). Vnější git pak uchovává pouze aktuální commit vnořeného repo. ale už ne vlastní data, to už se ve vnořeném repository spravuje samostatně.

Toto mi zní jako řešení mého problému. Můžete mě prosím nasměrovat na nějaké info o vnořenách repozitářích nebo mi ještě poradit jak na to?
Stačí klasicky vytvořit repozitář, tam nahrát podklady atp. a v tomto repozitáři vytvořit adresář určený pro webserver a v něm vytvořit další repozitář, který pak budu klonova na webserveru?

Re:Git a checkout podadresáře
« Odpověď #8 kdy: 18. 08. 2015, 16:27:19 »
A co to resit poradne? Takze job na CI serveru, ktery dela deploy a da se parametrizovat verzi repa (defaultne head)?

Obávám se, že na to zatím nemám dostatek zkušeností. Popravdě Vašemu postu vůbec nerozumím :(

Re:Git a checkout podadresáře
« Odpověď #9 kdy: 18. 08. 2015, 16:48:42 »
Myslim, ze byla primarne hloupost to resit jako jedine repository, takze bych se primarne zameril na zmenu timto smerem.
Děkuji za možnost editace příspěvku.

Re:Git a checkout podadresáře
« Odpověď #10 kdy: 18. 08. 2015, 16:55:34 »
Obávám se, že na to zatím nemám dostatek zkušeností. Popravdě Vašemu postu vůbec nerozumím :(

CI = Continous Integration
http://www.martinfowler.com/articles/continuousIntegration.html

Franta <xkucf03/>

Re:Git a checkout podadresáře
« Odpověď #11 kdy: 18. 08. 2015, 23:33:46 »
A co to resit poradne? Takze job na CI serveru, ktery dela deploy a da se parametrizovat verzi repa (defaultne head)?

+1 Výstupem sestavení produktu by měl být balíček (.deb, .rpm, .war, .ear, .tar.gz atd.), který se pak nasazuje (na testy, do produkce). Zdrojáky tam nejsou potřeba resp. nepatří tam.

podlesh

Re:Git a checkout podadresáře
« Odpověď #12 kdy: 19. 08. 2015, 08:16:01 »
Ano, tedy sparse-checkout pro mě nebude. Z důvodu bezpečnosti a úspory místa nechci na webserver nahrávat nic co tam není potřeba. Takže celý repozitář vč. podkladů mám na strojích, kde se na projektu pracuje, ale na server chci dávat pouze část.

Dokonce ani nutně nepotřebuji (přestože by to bylo lepší - viz níže) aby byla data na serveru nějak verzována, protože nepředpokládám, že by někdo něco chtěl měnit přímo na serveru a změny někam commitovat. Takže by mi stačilo něco jako má SVN svn export (pokud si dobře vzpomínám), kdy dojde k vytvoření kopie požadovaného adresáře bez .svn dat.
Jen kdyby to šlo přímo na serveru kde chci data nahrávat.
Když pominu to že deployment aplikace by se skutečně měl dělat jinak (jak to radí ostatní), tak
to co hledáš je git archive

Kód: [Vybrat]
git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage | tar zxf -

Re:Git a checkout podadresáře
« Odpověď #13 kdy: 19. 08. 2015, 08:48:49 »
+1 Výstupem sestavení produktu by měl být balíček (.deb, .rpm, .war, .ear, .tar.gz atd.), který se pak nasazuje (na testy, do produkce). Zdrojáky tam nejsou potřeba resp. nepatří tam.

Z toho co píšete mi přijde, že GIT je určen pouze pro kompilované jazyky :D
Co třeba PHP? V takovém případě zdrojáky na server patří a export do .tar.gz mi moc užitečný nepřijde.

Jestli mám špatný už koncept používání verzovacího systému, rád se poučím, ale v tomto případě zatím nechápu co mi chcete říct.

Programuji ve více jazycích a už dlouho používám verzovací systém. Používal jsem SVN a teď se snažím přecházet na GIT. Vždy mám v projektu jak zdrojáky, tak podklady. Každý kdo na projektu pracuje potřebuje i podklady. Navíc ty se leckdy také verzují (návrhy DB, soubory s poznámkami atp.)

Vše funguje jak bych chtěl a jak jsem zvyklý. Jen mám teď problém s tím částečným checkoutem, v případě webserveru, kde potřebuji na server nahrávat pouze adresář se zdrojákem.

Re:Git a checkout podadresáře
« Odpověď #14 kdy: 19. 08. 2015, 09:02:02 »
... Takže by mi stačilo něco jako má SVN svn export (pokud si dobře vzpomínám), kdy dojde k vytvoření kopie požadovaného adresáře bez .svn dat...
Jen kdyby to šlo přímo na serveru kde chci data nahrávat.

Když pominu to že deployment aplikace by se skutečně měl dělat jinak (jak to radí ostatní), tak
to co hledáš je git archive

Kód: [Vybrat]
git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage | tar zxf -

Ano, toto sice je něco jako svn export, ale potřeboval bych aby se to dělalo tam, kde chci data nahrát. Tedy logicky spíše něco jako svn import.

Podle toho, kolik lidí se mi snaží pomoc se domnívám, že to co potřebuji GIT neumožňuje. Přesto mě zaujala rada od Ovrscouta kde radí něco na způsob vnořených repozitářů.
Jak se to dá realizovat, aniž by bylo to, co je ve vnořeném repozitáři, verzováno dvakrát?