Adjust `makeover` to handle newer AsciiDoc output.
[gitmagic.git] / de / clone.txt
blob3f6f65e4af22f472032c9b502e5e2556fc0ec4ce
1 == Rund ums 'Clonen' ==
3 In älteren Versionsverwaltungssystemen ist 'checkout' die Standardoperation,
4 um Dateien zu bekommen. Du bekommst einen Haufen Dateien eines bestimmten
5 Sicherungsstands.
7 In Git und anderen verteilten Versionsverwaltungssystemen ist 'clone' die
8 Standardaktion. Um Dateien zu bekommen, erstellst Du einen 'Clone' des
9 gesamten 'Repository'. Oder anders gesagt, Du spiegelst den zentralen
10 Server. Alles, was man mit dem zentralen 'Repository' tun kann, kannst Du
11 auch mit deinem 'Clone' tun.
13 === Computer synchronisieren ===
15 Es ist akzeptabel, für Datensicherungen und einfaches Synchronisieren mit
16 'tarball' Archiven oder *rsync* zu arbeiten. Aber manchmal arbeite ich an
17 meinem Laptop, dann an meinem Desktop-PC, und die beiden haben sich
18 inzwischen nicht austauschen können.
20 Erstelle ein Git 'Repository' und 'commite' Deine Dateien auf dem einen
21 Rechner. Dann auf dem anderen:
23  $ git clone anderer.computer:/pfad/zu/dateien
25 um eine zweite Kopie der Dateien und des Git 'Repository' zu erstellen. Von
26 jetzt an wird
28  $ git commit -a
29  $ git pull anderer.computer:/pfad/zu/dateien HEAD
31 den Zustand der Dateien des anderen Computer auf den übertragen, an dem Du
32 gerade arbeitest. Solltest Du kürzlich konkurrierende Änderungen an der
33 selben Datei vorgenommen haben, lässt Git Dich das wissen, und Du musst erneut
34 'commiten', nachdem Du die Konflikte aufgelöst hast.
36 === Klassische Quellcodeverwaltung ===
38 Erstelle ein Git 'Repository' für Deine Dateien:
40  $ git init
41  $ git add .
42  $ git commit -m "Erster Commit"
44 Auf dem zentralen Server erstelle ein 'bare Repository' in irgendeinem
45 Ordner:
47  $ mkdir proj.git
48  $ cd proj.git
49  $ git init --bare
50  $ touch proj.git/git-daemon-export-ok
52 Wenn nötig, starte den Git-Dämon:
54  $ git daemon --detach  # er könnte schon laufen
56 Für Git Hostingdienste folge den Anweisungen zum Erstellen des zunächst
57 leeren Git 'Repository'. Normalerweise füllt man ein Formular auf einer
58 Website aus.
60 Übertrage ('push') dein Projekt auf den zentralen Server mit:
62  $ git push zentraler.server/pfad/zu/proj.git HEAD
64 Um die Quellcodes abzurufen, gibt ein Entwickler folgendes ein:
66  $ git clone zentraler.server/pfad/zu/proj.git
68 Nach dem Bearbeiten sichert der Entwickler die Änderungen lokal:
70  $ git commit -a
72 Um auf die aktuelle Server-Version zu aktualisieren:
74  $ git pull
76 Irgendwelche 'Merge'-Konflikte sollten dann aufgelöst und erneut 'commitet'
77 werden:
79  $ git commit -a
81 Um die lokalen Änderungen in das zentrale 'Repository' zu übertragen:
83  $ git push
85 Wenn inzwischen neue Änderungen von anderen Entwicklern beim Hauptserver
86 eingegangen sind, schlägt Dein 'push' fehl. Aktualisiere das lokale
87 'Repository' erneut mit 'pull', löse eventuell aufgetretene
88 'Merge'-Konflikte und versuche es nochmal.
90 Entwickler brauchen SSH Zugriff für die vorherigen 'pull' und 'push'
91 Anweisungen. Trotzdem kann jedermann die Quelltexte einsehen, durch Eingabe
92 von:
94  $ git clone git://zentraler.server/pfad/zu/proj.git
96 Das ursprüngliche Git-Protokoll ähnelt HTTP: Es gibt keine
97 Authentifizierung, also kann jeder das Projekt abrufen. Folglich ist
98 standardmäßig das 'Pushen' per Git-Protokoll verboten.
100 === Geheime Quellen ===
102 Für ein Closed-Source-Projekt lasse die 'touch' Anweisung weg und stelle
103 sicher, dass niemals eine Datei namens `git-daemon-export-ok` erstellt
104 wird. Das 'Repository' kann nun nicht mehr über das Git-Protokol abgerufen
105 werden; nur diejenigen mit SSH Zugriff können es einsehen. Wenn alle
106 'Repositories' geschlossen sind, ist es unnötig den Git Dämon laufen zu
107 lassen, da jegliche Kommunikation über SSH läuft.
109 === 'Nackte Repositories' ===
111 Ein nacktes ('bare') 'Repository' wird so genannt, weil es kein
112 Arbeitsverzeichnis hat. Es enthält nur Dateien, die normalerweise im '.git'
113 Unterverzeichnis versteckt sind. Mit anderen Worten, es verwaltet die
114 Geschichte eines Projekts, enthält aber niemals einen Auszug irgendeiner
115 beliebigen Version.
117 Ein 'bare Repository' übernimmt die Rolle des Hauptserver in einem
118 zentralisierten Versionsverwaltungssystem: Das Zuhause Deines
119 Projekts. Entwickler 'clonen' Dein Projekt davon und 'pushen' die letzten
120 offiziellen Änderungen dort hin. Meistens befindet es sich auf einem Server,
121 der nicht viel tut außer Daten zu verbreiten. Die Entwicklung findet in den
122 'Clonen' statt, so kann das Heim-'Repository' ohne Arbeitsverzeichnis
123 auskommen.
125 Viele Git Befehle funktionieren nicht in 'bare Repositories'. Es sei denn,
126 die `GIT_DIR` Umgebungsvariable wird auf das Arbeitsverzeichnis gesetzt,
127 oder die `--bare` Option wird übergeben.
129 === 'Push' oder 'Pull' ===
131 Warum haben wir den 'push'-Befehl eingeführt, anstatt bei dem vertrauten
132 'pull'-Befehl zu bleiben? Zuerst, 'pull' funktioniert nicht mit 'bare
133 Repositories': stattdessen benutze 'fetch', ein Befehl, den wir später
134 behandeln. Aber auch wenn wir ein normales 'Repository' auf dem zentralen
135 Server halten würden, wäre das 'pullen' eine mühselige Angelegenheit. Wir
136 müssten uns zuerst in den Server einloggen und dem 'pull'-Befehl die
137 Netzwerkadresse des Computer übergeben, von dem aus wir die Änderungen
138 'pullen', also abholen wollen. Firewalls könnten uns stören und was, wenn
139 wir gar keine Berechtigung für eine Serverkonsole haben.
141 Wie auch immer, abgesehen von diesem Fall, raten wir vom 'Pushen' in ein
142 'Repository' ab. Falls das Ziel nämlich ein Arbeitsverzeichnis hat, können
143 Verwirrungen entstehen.
145 Kurzum, während du lernst mit Git umzugehen, 'pushe' nur, wenn das Ziel ein
146 'bare Repository' ist, andernfalls benutze 'pull'.
148 === 'Fork' eines Projekts ===
150 Hast Du es satt, wie sich ein Projekt entwickelt? Du denkst, Du kannst das
151 besser? Dann mache folgendes auf deinem Server:
153  $ git clone git://haupt.server/pfad/zu/dateien
155 Dann erzähle jedem von Deinem 'Fork' des Projekts auf Deinem Server.
157 Zu jedem späteren Zeitpunkt kannst du die Änderungen des Originalprojekts
158 'mergen' mit: 
160  $ git pull
162 === Ultimative Datensicherung ===
164 Du willst zahlreiche, vor Manipulation geschützte, redundante
165 Datensicherungen an unterschiedlichen Orten? Wenn Dein Projekt viele
166 Entwickler hat, musst Du nichts tun! Jeder 'Clone' Deines Codes ist eine
167 vollwertige Datensicherung. Nicht nur des aktuellen Stand, sondern die
168 gesamte Geschichte. Wird irgendein 'Clone' beschädigt, wird dies dank des
169 kryptographischen 'Hashing' sofort erkannt, sobald derjenige versucht, mit
170 anderen zu kommunizieren.
172 Wenn Dein Projekt nicht so bekannt ist, finde so viele Server, wie Du kannst,
173 um dort einen 'Clone' zu platzieren.
175 Die wirklich Paranoiden sollten immer den letzten 20-Byte SHA1 Hash des
176 'HEAD' aufschreiben und an einem sicheren Ort aufbewahren. Er muss sicher
177 sein, aber nicht privat. Zum Beispiel wäre es sicher, ihn in einer Zeitung
178 zu veröffentlichen, denn es ist schwer für einen Angreifer jede
179 Zeitungskopie zu manipulieren.
181 === Multitasking mit Lichtgeschwindigkeit ===
183 Nehmen wir an Du willst parallel an mehreren Funktionen arbeiten. Dann
184 'commite' Dein Projekt und gib ein:
186  $ git clone . /irgendein/neuer/ordner
188 http://de.wikipedia.org/wiki/Harter_Link[Harten Links] ist es zu verdanken,
189 dass ein lokaler Klon weniger Zeit und Speicherplatz benötigt als eine
190 herkömmliche Datensicherung.
192 Du kannst nun an zwei unabhängigen Funktionen gleichzeitig arbeiten. Zum
193 Beispiel kannst Du an einen Klon bearbeiten, während der andere kompiliert
194 wird. Zu jeder Zeit kannst Du 'comitten' und die Änderungen des anderen Klon
195 'pullen'.
197  $ git pull /der/andere/clone HEAD
199 === Versionsverwaltung im Untergrund ===
201 Arbeitest Du an einem Projekt, das ein anderes Versionsverwaltungssystem
202 nutzt und vermisst Du Git? Dann erstelle ein Git 'Repository' in deinem
203 Arbeitsverzeichnis:
205  $ git init
206  $ git add .
207  $ git commit -m "Erster Commit"
209 dann 'Clone' es:
211  $ git clone . /irgendein/neuer/ordner
213 Nun gehe in das neue Verzeichnis und arbeite dort mit Git nach
214 Herzenslust. Irgendwann wirst Du dann mit den anderen synchronisieren
215 wollen, dann gehe in das Originalverzeichnis, aktualisiere mit dem anderen
216 Versionsverwaltungssystem und gib ein:
218  $ git add .
219  $ git commit -m "Synchronisation mit den anderen"
221 Dann gehe wieder ins neue Verzeichnis und gib ein:
223  $ git commit -a -m "Beschreibung der Änderungen"
224  $ git pull
226 Die Vorgehensweise, wie Du Deine Änderungen den anderen übergibst, hängt vom
227 anderen Versionsverwaltungssystem ab. Das neue Verzeichnis enthält die
228 Dateien mit deinen Änderungen. Führe die Anweisungen des anderen
229 Versionsverwaltungssystems aus, die nötig sind, um die Dateien ins zentrale
230 'Repository' zu übertragen.
232 Subversion, vielleicht das beste zentralisierte Versionsverwaltungssystem,
233 wird von unzähligen Projekten benutzt. Der *git svn*-Befehl automatisiert
234 den zuvor genannten Ablauf für Subversion 'Repositories' und kann auch
235 benutzt werden, um
236 http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[ein
237 Git Projekt in ein Subversion 'Repository' zu exportieren].
239 === Mercurial ===
241 Mercurial ist ein ähnliches Versionsverwaltungssystem, das fast nahtlos mit
242 Git zusammenarbeiten kann. Mit der `hg-git`-Erweiterung kann ein Benutzer
243 von Mercurial verlustfrei in ein Git 'Repository' 'pushen' und daraus
244 'pullen'.
246 Beschaffe Dir die `hg-git`-Erweiterung mit Git:
248  $ git clone git://github.com/schacon/hg-git.git
250 oder Mercurial:
252  $ hg clone http://bitbucket.org/durin42/hg-git/
254 Leider kenne ich keine solche Erweiterung für Git. Aus diesem Grund plädiere
255 ich für Git statt Mercurial für ein zentrales 'Repository', auch wenn man
256 Mercurial bevorzugt. Bei einem Mercurial Projekt gibt es gewöhnlich immer
257 einen Freiwilligen, der parallel dazu ein Git 'Repository' für die Git
258 Anwender unterhält, wogegen, Dank der `hg-git`-Erweiterung, ein Git Projekt
259 automatisch die Benutzer von Mercurial mit einbezieht.
261 Die Erweiterung kann auch ein Mercurial 'Repository' in ein Git 'Repository'
262 umwandeln, indem man in ein leeres 'Repository' 'pushed'. Einfacher geht das
263 mit dem `hg-fast-export.sh` Skript, welches es hier gibt:
265  $ git clone git://repo.or.cz/fast-export.git
267 Zum Konvertieren gib in einem leeren Verzeichnis ein:
269  $ git init
270  $ hg-fast-export.sh -r /hg/repo
272 nachdem Du das Skript zu deinem `$PATH` hinzugefügt hast.
274 === Bazaar ===
276 Wir erwähnen auch kurz Bazaar, weil es nach Git und Mercurial das
277 bekannteste freie verteilte Versionsverwaltungssystem ist.
279 Bazaar hat den Vorteil des Rückblicks, da es relativ jung ist; seine
280 Entwickler konnten aus Fehlern der Vergangenheit lernen und kleine
281 historische Unwegbarkeiten umgehen. Außerdem waren sich die Entwickler der
282 Popularität und Interoperabilität mit anderen Versionsverwaltungssystemen
283 bewusst.
285 Eine `bzr-git`-Erweiterung lässt Anwender von Bazaar einigermaßen mit Git
286 'Repositories' arbeiten. Das `tailor` Programm konvertiert Bazaar
287 'Repositories' zu Git 'Repositories' und kann das forlaufend tun, während
288 `bzr-fast-export` für einmalige Konvertierungen besser geeignet ist.
290 === Warum ich Git benutze ===
292 Ich habe ursprünglich Git gewählt, weil ich gehört habe, dass es die
293 unvorstellbar unüberschaubaren Linux Kernel Quellcodes verwalten kann. Ich
294 hatte noch keinen Grund zu wechseln. Git hat mir bewundernswert gedient und
295 hat mich bis jetzt noch nie im Stich gelassen. Da ich in erster Linie unter
296 Linux arbeite, sind Probleme anderer Plattformen bedeutungslos.
298 Ich bevorzuge auch C-Programme und 'bash'-Skripte gegenüber Anwendungen wie
299 zum Beispiel Python Skripts: Es gibt weniger Abhängigkeiten und ich bin
300 süchtig nach schellen Ausführungszeiten.
302 Ich dachte darüber nach, wie Git verbessert werden könnte, ging sogar so
303 weit, dass ich meine eigene Git-Ähnliche Anwendung schrieb, allerdings nur
304 als akademische Übungen. Hätte ich mein Projekt fertig gestellt, wäre ich
305 trotzdem bei Git geblieben, denn die Verbesserungen wären zu gering gewesen,
306 um den Einsatz eines Eigenbrödler-Systems zu rechtfertigen.
308 Natürlich können Deine Bedürfnisse und Wünsche ganz anders sein und
309 vielleicht bist Du mit einem anderen System besser dran. Wie auch immer, mit
310 Git kannst Du nicht viel falsch machen.