Tema: Re: Ar yra koks SVN tools'as
Autorius: Laimis
Data: 2012-10-23 11:50:50
VaidasB rašė:
> nu va kitas pavyzdys/problema.
> kažkas susifakapino kai perkėliau projektą į gilesnį folderį. Pushinant
> gaunu idiotiškus messagus apie bare repozitory ir pan. siūlo daryt
> branchą ir pan, kam man to reik? nu padariau aš tą branch, supushino
> kažkur. ir dabar neesu tikras ar mano kodas guli serveryje ar ne. vietoj
> to kad dirbčiau, kas reikia, turiu aškintis gito "privalumus".

Konkretumas, tai kaip bobos už kampo: kažkas kažką kažkur kažkaip... :-)
Su tokiu konkretumu, tai turi dar mažiau šansų išsiaškinti svn 
susifakup'inimo privalumus...
Konkrečiai kas susivėlė ir ką konkrečiai darant? Konkrečiai kokie 
klaidos pranešimai?

Bet šiaip jau veikiausiai pražiopsojai _tai_ darydamas git push:
-f, --force
Usually, the command refuses to update a remote ref that is not an
ancestor of the local ref used to overwrite it. This flag disables the
check. This can cause the remote repository to lose commits; use it
with care.

Bet apie viską plačiau; pabandysiu paaiškini esmę:
git push atsisako push'inti, jei remote repozitorija yra su darbine 
direktorija ir push'inamas branch'as buvo lokaliai checkout'intas.
Supaprastinus, tai tokiu būdu saugomasi, kad nupush'inus nebūtų 
perrašyti remote repozitorijos darbinės direktorijos (ir indekso) 
pakeitimai, kurie galbūt net nebuvo commit'inti.
Analogijai tiktų pavyzdys, jei svn'e išsicheckout'intum kokią 
direktoriją, joje pridarytum pakeitimų ir paskui ant viršaus (pakeitimų 
nenucommit'inus) norėtum vėl išsicheckout'inti kokią direktoriją. 
Rizikuoji prarasti pakeitimus ir svn'as to neleistų (nebent nurodytum 
--force). Logiška, kad ir git'as to neleidžia, ar ne?

Jei žinai, ką darai ir esi tikras, kad remote repozitorijos darbinės 
direktorijos (su išchekout'intu branch'u, kurį ir push'ini) niekas 
nekeičia (ten lokaliai niekas nedirba), tai gali kaskart naudoti --force 
raktą, tačiau nesiūlyčiau taip daryti ir prie to priprasti.

Kitas variantai (jei remote'e kažkas dirba lokaliai):
  - traukti pakeitimus iš tavęs remote pusėje: git pull;
  - push'inti į atskirą branch'ą remote repozitorijoje; tas, kas dirba 
pats susimerge'ins pakeitimus, kuriuos sustūmei.

Variantai, kai remote niekas lokaliai nedirba (tai — centrinė/serverinė 
repozitorija):
  - susikurti dummy branch'ą ir į jį persijungti, t.y. jį 
išsichek'outinti: git branch dummy; git checkout dummy (tada bus galima 
push'inti į šią remote repozitoriją);

  - paversti tą remote repozitoriją bare repozitorija, kuri apskritai 
neturi darbinės direktorijos. Tą buvo galima padaryti nuo pat pradžių: 
git --bare init, o dabar paversti remote repozitoriją į bare galima:
1) pašalinti visus failus (išskyrus .git katalogą), esančius joje;
2) perkelti .git katalogo turinį į pačią repozitorijos direktoriją:
    (mv .git/* .);
3) (git config --bool core.bare true).