forked from tkrajina/uvod-u-git
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dodaci.tex
218 lines (143 loc) · 9.24 KB
/
dodaci.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
\chapter*{Dodaci}
\addcontentsline{toc}{chapter}{Dodaci}
% TODO
%\section*{Grafičko sučelje?}
%\addcontentsline{toc}{section}{Grafičko sučelje?}
%
%Ako spadate u one ljude koji se smrznu pri samoj pomisli da moraju toliko toga raditi u komandnoj liniji (a ova knjiga, kao što smi vidjeli, vrvi od komandnolinijskih primjera) -- moram vam reći dvije stvari.
\section*{Git hosting}
\addcontentsline{toc}{section}{Git hosting}
Projekt na kojem radi samo jedna osoba je jednostavno organizirati.
Ne trebaju udaljeni repozitoriji.
Dovoljno je jedno računalo i neki mehanizam snimanja sigurnosnih kopija \verb+.git+ direktorija.
Radimo li s drugim programerima ili možda imamo ambiciju kod našeg projekta pokazati svijetu -- tada nam treba repozitorij na nekom vidljivijem mjestu.
Prvo što se moramo odlučiti je -- hoće li taj repozitorij biti na našem serveru ili ćemo ga \emph{host}ati na nekom od postojećih javnih servisa.
Ukoliko je u pitanju ovo drugo, to je jednostavno.
Većina ozbiljnih servisa za za hostanje projekata podržava git.
Ovdje ću samo nabrojati neke od najpopularnijih:
\begin{itemize}
\item GitHub (\url{http://github.com}) -- besplatan za projekte otvorenog koda, košta za privatne projekte (cijena ovisna o broju repozitorija i programera). Najpopularniji, brz i pregledan.
\item BitBucket (\url{http://bitbucket.org}) -- besplatan čak i za privatne repozitorije, malo manje popularan. U početku je bio zamišljen samo za projekte na mercurialu, ali sad nudi mercurial i git.
\item Google Code (\url{http://code.google.com}) -- također ima mogućnost hostanja na gitu. Samo za projekte otvorenog koda.
\item Sourceforge (\url{http://sourceforge.net}) -- jedan od najstarijih takvih servisa. Isključivo za projekte otvorenog koda.
\item Codeplex (\url{http://www.codeplex.com}) -- Microsoftova platforma za projekte otvorenog koda. Iako oni "guraju" TFS -- vjerojatno im je postalo očito da je git danas \emph{de facto} standard za otvoreni kod.
\end{itemize}
Za privatne repozitorije s više članova, moja preporuka je da platite tih par dolara Githubu ili BitBucketu.
Osim što dobijete vrhunsku uslugu -- tim novcem implicitno subvencionirate hosting svim ostalim projektima otvorenog koda koji su hostani tamo.
\section*{Vlastiti server}
\addcontentsline{toc}{section}{Vlastiti server}
Druga varijanta je koristiti vlastiti server.
Najjednostavniji scenarij je da jednostavno koristimo ssh protokol i postojeći korisnički račun na tom serveru.
Treba samo u neki direktorij na rom računalu postaviti git repozitorij.
Ako je naziv servera \verb+server.com+, korisničko ime s kojim se prijavljujemo \verb+git+, a direktorij s repozitorijem \verb+projekti/abc/+, onda ga možemo početi koristiti s:
\gitoutputcommand{git remote add moj-repozitorij [email protected]:projekti/abc}
Naš projekt se u tom slučaju vjerojatno nalazi unutar korisnikovog "home" direktorija.
Dakle, vjerojatno je putanja do našeg repozitorija na tom računalu: \\\verb+/home/korisnik/projekti/abc+.
To će vjerojatno biti dovoljno za jednog korisnika, no ima nekih nedostataka.
Ukoliko želimo još nekome dati mogućnost da \emph{push}a ili \emph{fetch}a na/s našeg repozitorija.
Moramo mu dati i sve potrebne podatke da bi ostvario ssh konekciju na naš server.
Ukoliko to učinimo, on se može povezati \emph{ssh}om i raditi sve što i mi, a to ponekad ne želimo.
Drugi problem je što ne možemo jednostavno nekome dati mogućnost da \emph{fetch}a i \emph{push}, a nekome drugome da samo \emph{fetch}a.
Ako smo dali ssh pristup -- onda je on punopravan korisnik na tom serveru i ima iste ovlasti kao i bilo tko drugi tko se može prijaviti kao taj korisnik.
\subsection*{Git \emph{shell}}
\addcontentsline{toc}{subsection}{Git \emph{shell}}
\emph{Git shell} riješava prvi od dva prethodno spomenuta problema.
Kao što (pretpostavljam) znamo, na svakom UNIXoidnom operativnom sustavu korisnici imaju definiran \emph{shell}, odnosno nekakav program u kojem mogu izvršavati naredbe.
\emph{Git shell} je posebna vrsta takvog \emph{shell}a koja korisniku \textbf{omogućuje ssh pristup, ali i korištenje samo određenom broja naredbi}.
Postupak je jednostavan, treba kreirati novog korisnika (u primjeru koji slijedi, to je korisnik \verb+git+).
Naredbom:
\gitoutputcommand{chsh -s /usr/bin/git-shell git}
\dots{}mu se početni \emph{shell} mijenja u \verb+git-shell+.
I sad u njegovom \emph{home} direktoriju treba kreirati direktorij \verb+git-shell-commands+ koji sadrži samo one naredbe koje će se ssh-om moći izvršavati.
Neke distribucije linuxa će već imati predložak takvog direktorija kojeg treba samo kopirati i dati prava za izvršavanje datotekama.
Na primjer:
\gitoutputcommand{cp -R /usr/share/doc/git/contrib/git-shell-commands /home/git/\\
chmod +x /home/git/git-shell-commands/help\\
chmod +x /home/git/git-shell-commands/list}
Sad, ako se netko (tko ima ovlasti) pokuša spojiti s \emph{ssh}om, moći će izvršavati samo \verb+help+ i \verb+list+ naredbe.
Ovakav pristup ne riješava problem ovlasti čitanja/pisanja nad repozitorijima, on vam samo omogućuje da ne dajete prava klasičnog korisnika na sustavu.
\subsection*{Certifikati}
\addcontentsline{toc}{subsection}{Certifikati}
S obzirom da je najjednostavniji način da se git koristi preko ssh, praktično je podesiti certifikate na lokalnom/udaljenom računalu tako da ne moramo svaki put tipkati lozinku.
To se može tako da naš javni ssh certifikat kopiramo na udaljeno računalo.
U svojem \emph{home} direktoriju bi trebali imati \verb+.ssh+ direktorij.
Ukoliko nije tamo, naredba:
\gitoutputcommand{ssh-keygen -t dsa}
\dots{}će ga kreirati zajedno s javnim certifikatom \verb+id_rsa.pub+.
Kopirajte sadržaj te datoteke u \verb+~/.ssh/authorized_keys+ na udaljenom računalu.
Ako je sve prošlo bez problema, korištenje gita preko ssh će od sad na dalje ići bez upita za lozinku za svaki \emph{push}, \emph{fetch} i \emph{pull}.
\section*{Git \emph{plugin}}
\addcontentsline{toc}{section}{Git \emph{plugin}}
Ukoliko vam se učini da je skup naredbi koje možemo dobiti s \verb+git <naredba>+ limitiran -- lako je dodati nove.
Recimo da trebamo naredbu \verb+git gladan-sam+\footnote{Irelevantno što bi ta naredba radila :)}.
Sve što treba je snimiti negdje izvršivu datoteku \verb+git-gladan-sam+ i potruditi se da je dostupna u komandnoj liniji.
Na unixoidnim računalima, to bi izgledalo ovako nekako:
\gitoutputcommand{mkdir moj-git-plugin\\
cd moj-git-plugin\\
touch git-gladan-sam\\
\# Tu bi sad trebalo editirati skriptu git-gladan-sam...\\
chmod +x git-gladan-sam\\
export PATH=\$PATH:\textasciitilde{}/moj-git-plugin}
Ovu zadnju liniju ćete, vjerojatno, dodati u neku inicijalizacijsku skriptu (\verb+.bashrc+, isl.) tako da bude dostupna i nakon restarta računala.
%\section*{Interakcija s drugim sustavima za verzioniranje}
%\addcontentsline{toc}{section}{Interakcija s drugim sustavima za verzioniranje}
%
%TODO
%
%git hg
%git tf
%git svn
%git cvs
%
%Rebase
%\section*{Git workflow}
%\addcontentsline{toc}{section}{Git workflow}
%
%\TODO
\section*{Git i Mercurial}
\addcontentsline{toc}{section}{Git i Mercurial}
Mercurial je distribuirani sustav za verzioniranje sličan gitu.
S obzirom da su nastali u isto vrijeme i bili pod utjecajem jedan drugog -- imaju slične funkcionalnosti i terminologiju.
Postoji i \emph{plugin} koji omogućuje da naredbe iz jednog koristite u radu s drugim\footnote{http://hg-git.github.com}.
Mercurial ima malo konzistentnije imenovane naredbe, ali i značajno manji broj korisnika.
Međutim, ukoliko vam je git neintuitivan, mercurial bi trebao biti prirodna alternativa.
Naravno, ukoliko uopće želite distribuirani sustav.
Ovdje ćemo proći samo nekoliko osnovnih naredbi u mercurialu, tek toliko da steknete osjećaj o tome kako je s njime raditi:
Inicijalizacija repozitorija:
\gitoutputcommand{hg init}
Dodavanje datoteke \verb+README.txt+ u prostor predviđen za sljedeći \emph{commit} (ono što je u gitu indeks):
\gitoutputcommand{hg add README.txt}
Micanje datoteke iz indeksa:
\gitoutputcommand{hg forget README.txt}
\emph{Commit}:
\gitoutputcommand{hg commit}
Trenutni status repozitorija:
\gitoutputcommand{hg status}
Izmjene u odnosu na repozitorij:
\gitoutputcommand{hg diff}
Premještanje i izmjenu datoteka je poželjno raditi direktno iz mercuriala:
\gitoutputcommand{hg mv datoteka1 datoteka2\\hg cp datoteka3 datoteka 4}
Povijest repozitorija:
\gitoutputcommand{hg log}
"Vraćanje" na neku reviziju (\emph{commit}) u povijesti (za reviziju "1"):
\gitoutputcommand{hg update 1}
Vraćanje na zadnju reviziju:
\gitoutputcommand{hg update tip}
Pregled svih trenutnih grana:
\gitoutputcommand{hg branches}
Kreiranje nove grane:
\gitoutputcommand{hg branch nova\_grana}
Grana će biti stvarno i stvorena tek nakon prvog \emph{commit}a.
Jedna razlika između grana u mercurialu i gitu je što su u prvome grane permanentne.
Grane mogu biti aktivne i neaktivne, ali u principu one ostaju u repozitoriju.
Glavna grana (ono što je u gitu \verb+master+) je ovdje \verb+default+.
Prebacivanje s grane na granu:
\gitoutputcommand{hg checkout naziv\_grane}
\emph{Merge}anje grana:
\gitoutputcommand{hg merge naziv\_grane}
Pomoć:
\gitoutputcommand{hg help}
Za objašnjenje mercurialove terminologije:
\gitoutputcommand{hg help glossary}
%\section*{}
%\addcontentsline{toc}{section}{}