1 # Git Magic - A guide to using Git
2 # This file is distributed under the GNU GENERAL PUBLIC LICENSE Version 3.
3 # Benn Lynn <benlynn@gmail.com>, 2007.
4 # Armin Stebich <armin@lordofbikes.de>, 2010, 2011.
8 "Project-Id-Version: Git Magic deutsch\n"
9 "Report-Msgid-Bugs-To: bennlynn@gmail.com\n"
10 "POT-Creation-Date: 2010-10-30 08:21+0300\n"
11 "PO-Revision-Date: 2011-07-07 18:53+0200\n"
12 "Last-Translator: Armin Stebich <armin@lordofbikes.de>\n"
13 "Language-Team: DE <gitmagic@lordofbikes.de>\n"
16 "Content-Type: text/plain; charset=UTF-8\n"
17 "Content-Transfer-Encoding: UTF-8\n"
21 #: ../en/secrets.txt:2
22 msgid "== Secrets Revealed =="
23 msgstr "== Aufgedeckte Geheimnisse =="
26 #: ../en/secrets.txt:4
28 "We take a peek under the hood and explain how Git performs its miracles. I "
29 "will skimp over details. For in-depth descriptions refer to http://www."
30 "kernel.org/pub/software/scm/git/docs/user-manual.html[the user manual]."
32 "Wir werfen einen Blick unter die Motorhaube und erklären, wie Git seine "
33 "Wunder vollbringt. Ich werde nicht ins Detail gehen. Für tiefer gehende "
34 "Erklärungen verweise ich auf das http://www.kernel.org/pub/software/scm/git/"
35 "docs/user-manual.html[englischsprachige Benutzerhandbuch]."
38 #: ../en/secrets.txt:6
39 msgid "=== Invisibility ==="
40 msgstr "=== Unsichtbarkeit ==="
43 #: ../en/secrets.txt:8
45 "How can Git be so unobtrusive? Aside from occasional commits and merges, you "
46 "can work as if you were unaware that version control exists. That is, until "
47 "you need it, and that's when you're glad Git was watching over you the whole "
50 "Wie kann Git so unauffällig sein? Abgesehen von gelegentlichen 'Commits' und "
51 "'Merges' kannst Du arbeiten, als würde die Versionsverwaltung nicht "
52 "existieren. Das heißt, bis Du sie brauchst. Und das ist, wenn Du froh bist, "
53 "dass Git die ganze Zeit über Dich gewacht hat."
56 #: ../en/secrets.txt:10
58 "Other version control systems force you to constantly struggle with red tape "
59 "and bureaucracy. Permissions of files may be read-only unless you explicitly "
60 "tell a central server which files you intend to edit. The most basic "
61 "commands may slow to a crawl as the number of users increases. Work grinds "
62 "to a halt when the network or the central server goes down."
64 "Andere Versionsverwaltungssysteme zwingen Dich ständig Dich mit "
65 "Verwaltungskram und Bürokratie herumzuschlagen. Dateien sind können "
66 "schreibgeschützt sein, bis Du einem zentralen Server mitteilst, welche "
67 "Dateien Du gerne bearbeiten möchtest. Die einfachsten Befehle werden bis zum "
68 "Schneckentempo verlangsamt, wenn die Anzahl der Anwender steigt. Deine "
69 "Arbeit kommt zum Stillstand, wenn das Netzwerk oder der zentrale Server weg "
73 #: ../en/secrets.txt:12
75 "In contrast, Git simply keeps the history of your project in the `.git` "
76 "directory in your working directory. This is your own copy of the history, "
77 "so you can stay offline until you want to communicate with others. You have "
78 "total control over the fate of your files because Git can easily recreate a "
79 "saved state from `.git` at any time."
81 "Im Gegensatz dazu hält Git seinen Verlauf einfach im `.git` Verzeichnis von "
82 "Deinem Arbeitsverzeichnis. Das ist Deine eigene Kopie der "
83 "Versionsgeschichte, damit kannst Du so lange offline bleiben, bis Du mit "
84 "anderen kommunizieren willst. Du hast die absolute Kontrolle über das "
85 "Schicksal Deiner Dateien, denn Git kann jederzeit einfach einen gesicherten "
86 "Stand aus `.git` wiederherstellen."
89 #: ../en/secrets.txt:14
90 msgid "=== Integrity ==="
91 msgstr "=== Integrität ==="
94 #: ../en/secrets.txt:16
96 "Most people associate cryptography with keeping information secret, but "
97 "another equally important goal is keeping information safe. Proper use of "
98 "cryptographic hash functions can prevent accidental or malicious data "
101 "Die meisten Leute verbinden mit Kryptographie die Geheimhaltung von "
102 "Informationen, aber ein genau so wichtiges Ziel ist es Informationen zu "
103 "sichern. Die richtige Anwendung von kryptographischen Hash-Funktionen kann "
104 "einen versehentlichen oder bösartigen Datenverlust verhindern."
107 #: ../en/secrets.txt:18
109 "A SHA1 hash can be thought of as a unique 160-bit ID number for every string "
110 "of bytes you'll encounter in your life. Actually more than that: every "
111 "string of bytes that any human will ever use over many lifetimes."
113 "Einen SHA1-Hash-Wert kann man sich als eindeutige 160-Bit Identitätsnummer "
114 "für jegliche Zeichenkette vorstellen, welche Dir in Deinem ganzen Leben "
115 "begegnen wird. Sogar mehr als das: jegliche Zeichenfolge, die alle Menschen "
116 "über mehrere Generationen verwenden."
119 #: ../en/secrets.txt:20
121 "As a SHA1 hash is itself a string of bytes, we can hash strings of bytes "
122 "containing other hashes. This simple observation is surprisingly useful: "
123 "look up 'hash chains'. We'll later see how Git uses it to efficiently "
124 "guarantee data integrity."
126 "Ein SHA1-Hash-Wert selbst ist eine Zeichenfolge von Bytes. Wir können SHA1-"
127 "Hash-Werte aus Zeichenfolgen generieren, die selbst SHA1-Hash-Werte "
128 "enthalten. Diese einfache Beobachtung ist überraschend nützlich: suche nach "
129 "'hash chains'. Wir werden später sehen, wie Git diese nutzt um effizient die "
130 "Datenintegrität zu garantieren."
133 #: ../en/secrets.txt:22
135 "Briefly, Git keeps your data in the `.git/objects` subdirectory, where "
136 "instead of normal filenames, you'll find only IDs. By using IDs as "
137 "filenames, as well as a few lockfiles and timestamping tricks, Git "
138 "transforms any humble filesystem into an efficient and robust database."
140 "Kurz gesagt, Git hält Deine Daten in dem `.git/objects` Unterverzeichnis, wo "
141 "Du anstelle von normalen Dateinamen nur Identitätsnummern findest. Durch die "
142 "Verwendung von Identitätsnummern als Dateiname, zusammen mit ein paar "
143 "Sperrdateien und Zeitstempeltricks, macht Git aus einem einfachen "
144 "Dateisystem eine effiziente und robuste Datenbank."
147 #: ../en/secrets.txt:24
148 msgid "=== Intelligence ==="
149 msgstr "=== Intelligenz ==="
152 #: ../en/secrets.txt:26
154 "How does Git know you renamed a file, even though you never mentioned the "
155 "fact explicitly? Sure, you may have run *git mv*, but that is exactly the "
156 "same as a *git rm* followed by a *git add*."
158 "Woher weiß Git, dass Du eine Datei umbenannt hast, obwohl Du es ihm niemals "
159 "explizit mitgeteilt hast? Sicher, Du hast vielleicht *git mv* benutzt, aber "
160 "das ist exakt das selbe wie *git rm* gefolgt von *git add*."
163 #: ../en/secrets.txt:28
165 "Git heuristically ferrets out renames and copies between successive "
166 "versions. In fact, it can detect chunks of code being moved or copied around "
167 "between files! Though it cannot cover all cases, it does a decent job, and "
168 "this feature is always improving. If it fails to work for you, try options "
169 "enabling more expensive copy detection, and consider upgrading."
171 "Git stöbert Umbenennungen und Kopien zwischen aufeinander folgenden "
172 "Versionen heuristisch auf. Vielmehr kann es sogar Codeblöcke erkennen, die "
173 "zwischen Dateien hin und her kopiert oder verschoben wurden! Jedoch kann es "
174 "nicht alle Fälle abdecken, aber es leistet ordentliche Arbeit und diese "
175 "Eigenschaft wird immer besser. Wenn es bei Dir nicht funktioniert, versuche "
176 "Optionen zur aufwendigeren Erkennung von Kopien oder erwäge einen Upgrade."
179 #: ../en/secrets.txt:30
180 msgid "=== Indexing ==="
181 msgstr "=== Indizierung ==="
184 #: ../en/secrets.txt:32
186 "For every tracked file, Git records information such as its size, creation "
187 "time and last modification time in a file known as the 'index'. To determine "
188 "whether a file has changed, Git compares its current stats with those cached "
189 "in the index. If they match, then Git can skip reading the file again."
191 "Für jede überwachte Datei speichert Git Informationen wie deren Größe, ihren "
192 "Erstellzeitpunkt und den Zeitpunkt der letzten Bearbeitung in einer Datei "
193 "die wir als 'Index' kennen. Um zu ermitteln, ob eine Datei verändert wurde, "
194 "vergleicht Git den aktuellen Status mit dem im Index gespeicherten. Stimmen "
195 "diese Daten überein, kann Git das Lesen des Dateiinhalts überspringen."
198 #: ../en/secrets.txt:35
200 "Since stat calls are considerably faster than file reads, if you only edit a "
201 "few files, Git can update its state in almost no time."
203 "Da das Abfragen des Dateistatus erheblich schneller ist als das Lesen der "
204 "Datei, kann Git, wenn Du nur ein paar Dateien verändert hast, seinen Status "
205 "im Nu aktualisieren."
208 #: ../en/secrets.txt:40
210 "We stated earlier that the index is a staging area. Why is a bunch of file "
211 "stats a staging area? Because the add command puts files into Git's database "
212 "and updates these stats, while the commit command, without options, creates "
213 "a commit based only on these stats and the files already in the database."
215 "Wir haben früher festgestellt, dass der Index ein Bereitstellungsraum ist. "
216 "Warum kann ein Haufen von Dateistatusinformationen ein Bereitstellungsraum "
217 "sein? Weil die 'add' Anweisung Dateien in die Git Datenbank befördert und "
218 "die Dateistatusinformationen aktualisiert, während die 'commit' Anweisung, "
219 "ohne Optionen, einen 'Commit' nur auf Basis der Dateistatusinformationen "
220 "erzeugt, weil die Dateien ja schon in der Datenbank sind."
223 #: ../en/secrets.txt:42
224 msgid "=== Git's Origins ==="
225 msgstr "=== Git's Wurzeln ==="
228 #: ../en/secrets.txt:44
230 "This http://lkml.org/lkml/2005/4/6/121[Linux Kernel Mailing List post] "
231 "describes the chain of events that led to Git. The entire thread is a "
232 "fascinating archaeological site for Git historians."
234 "Dieser http://lkml.org/lkml/2005/4/6/121['Linux Kernel Mailing List' "
235 "Beitrag] beschreibt die Kette von Ereignissen, die zu Git geführt haben. Der "
236 "ganze Beitrag ist eine faszinierende archäologische Seite für Git Historiker."
239 #: ../en/secrets.txt:46
240 msgid "=== The Object Database ==="
241 msgstr "=== Die Objektdatenbank ==="
244 #: ../en/secrets.txt:52
246 "Every version of your data is kept in the 'object database', which lives in "
247 "the subdirectory `.git/objects`; the other residents of `.git/` hold lesser "
248 "data: the index, branch names, tags, configuration options, logs, the "
249 "current location of the head commit, and so on. The object database is "
250 "elementary yet elegant, and the source of Git's power."
252 "Jegliche Version Deiner Daten wird in der Objektdatenbank gehalten, welche "
253 "im Unterverzeichnis `.git/objects` liegt; Die anderen Orte in `.git/` "
254 "enthalten weniger wichtige Daten: den Index, 'Branch' Namen, Bezeichner "
255 "('tags'), Konfigurationsoptionen, Logdateien, die Position des aktuellen "
256 "'HEAD Commit' und so weiter. Die Objektdatenbank ist einfach aber trotzdem "
257 "elegant und sie ist die Quelle von Git's Macht."
260 #: ../en/secrets.txt:55
262 "Each file within `.git/objects` is an 'object'. There are 3 kinds of objects "
263 "that concern us: 'blob' objects, 'tree' objects, and 'commit' objects."
265 "Jede Datei in `.git/objects` ist ein 'Objekt'. Es gibt drei Arten von "
266 "Objekten die uns betreffen: 'Blob'-, 'Tree'-, und 'Commit'-Objekte."
269 #: ../en/secrets.txt:57
270 msgid "=== Blobs ==="
271 msgstr "=== Blobs ==="
274 #: ../en/secrets.txt:59
276 "First, a magic trick. Pick a filename, any filename. In an empty directory:"
278 "Zuerst ein Zaubertrick. Suche Dir einen Dateinamen aus, irgendeinen. In "
279 "einem leeren Verzeichnis:"
282 #: ../en/secrets.txt:64
285 " $ echo sweet > YOUR_FILENAME\n"
288 " $ find .git/objects -type f\n"
290 " $ echo sweet > DEIN_DATEINAME\n"
293 " $ find .git/objects -type f\n"
296 #: ../en/secrets.txt:66
297 msgid "You'll see +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+."
299 "Du wirst folgendes sehen: +.git/objects/"
300 "aa/823728ea7d592acc69b36875a482cdf3fd5c8d+."
303 #: ../en/secrets.txt:69
305 "How do I know this without knowing the filename? It's because the SHA1 hash "
308 "Wie konnte ich das wissen, ohne den Dateiname zu kennen? Weil der SHA1-Hash-"
312 #: ../en/secrets.txt:71
314 msgid " \"blob\" SP \"6\" NUL \"sweet\" LF\n"
315 msgstr " \"blob\" SP \"6\" NUL \"sweet\" LF\n"
318 #: ../en/secrets.txt:75
320 "is aa823728ea7d592acc69b36875a482cdf3fd5c8d, where SP is a space, NUL is a "
321 "zero byte and LF is a linefeed. You can verify this by typing:"
323 "aa823728ea7d592acc69b36875a482cdf3fd5c8d ist. Wobei SP ein Leerzeichen ist, "
324 "NUL ist ein Nullbyte und LF ist ein Zeilenumbruch. Das kannst Du "
325 "kontrollieren, durch die Eingabe von:"
328 #: ../en/secrets.txt:77
330 msgid " $ printf \"blob 6\\000sweet\\n\" | sha1sum\n"
331 msgstr " $ printf \"blob 6\\000sweet\\n\" | sha1sum\n"
334 #: ../en/secrets.txt:84
336 "Git is 'content-addressable': files are not stored according to their "
337 "filename, but rather by the hash of the data they contain, in a file we call "
338 "a 'blob object'. We can think of the hash as a unique ID for a file's "
339 "contents, so in a sense we are addressing files by their content. The "
340 "initial `blob 6` is merely a header consisting of the object type and its "
341 "length in bytes; it simplifies internal bookkeeping."
343 "Git ist 'assoziativ': Dateien werden nicht nach Ihren Namen gespeichert, "
344 "sondern eher nach dem SHA1-Hash-Wert der Daten, welche sie enthalten, in "
345 "einer Datei, die wir als 'Blob'-Objekt bezeichnen. Wir können uns den SHA1-"
346 "Hash-Wert als eindeutige Identnummer des Dateiinhalts vorstellen, was "
347 "sinngemäß bedeutet, dass die Dateien über ihren Inhalt adressiert werden. "
348 "Das führende `blob 6` ist lediglich ein Vermerk, der sich aus dem Objekttyp "
349 "und seiner Länge in Bytes zusammensetzt; er vereinfacht die interne "
353 #: ../en/secrets.txt:87
355 "Thus I could easily predict what you would see. The file's name is "
356 "irrelevant: only the data inside is used to construct the blob object."
358 "So konnte ich einfach vorhersagen, was Du sehen wirst. Der Dateiname ist "
359 "irrelevant: nur der Dateiinhalt wird zum Erstellen des 'Blob'-Objekt "
363 #: ../en/secrets.txt:91
365 "You may be wondering what happens to identical files. Try adding copies of "
366 "your file, with any filenames whatsoever. The contents of +.git/objects+ "
367 "stay the same no matter how many you add. Git only stores the data once."
369 "Du wirst Dich fragen, was mit identischen Dateien ist. Versuche Kopien "
370 "Deiner Datei hinzuzufügen, mit beliebigen Dateinamen. Der Inhalt von +.git/"
371 "objects+ bleibt der selbe, ganz egal wieviele Dateien Du hinzufügst. Git "
372 "speichert den Dateiinhalt nur ein einziges Mal."
375 #: ../en/secrets.txt:95
377 "By the way, the files within +.git/objects+ are compressed with zlib so you "
378 "should not stare at them directly. Filter them through http://www.zlib.net/"
379 "zpipe.c[zpipe -d], or type:"
381 "Übrigens, die Dateien in +.git/objects+ sind mit zlib komprimiert, Du "
382 "solltest sie also nicht direkt anschauen. Filtere sie durch http://www.zlib."
383 "net/zpipe.c[zpipe -d], oder gib ein:"
386 #: ../en/secrets.txt:97
388 msgid " $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d\n"
389 msgstr " $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d\n"
392 #: ../en/secrets.txt:99
393 msgid "which pretty-prints the given object."
394 msgstr "was Dir das Objekt im Klartext anzeigt."
397 #: ../en/secrets.txt:101
398 msgid "=== Trees ==="
399 msgstr "=== 'Trees' ==="
402 #: ../en/secrets.txt:104
404 "But where are the filenames? They must be stored somewhere at some stage. "
405 "Git gets around to the filenames during a commit:"
407 "Aber wo sind die Dateinamen? Sie müssen irgendwo gespeichert sein. Git kommt "
408 "beim 'Commit' dazu sich um die Dateinamen zu kümmern:"
411 #: ../en/secrets.txt:107
414 " $ git commit # Type some message.\n"
415 " $ find .git/objects -type f\n"
417 " $ git commit # Schreibe eine Bemerkung.\n"
418 " $ find .git/objects -type f\n"
421 #: ../en/secrets.txt:109
423 "You should now see 3 objects. This time I cannot tell you what the 2 new "
424 "files are, as it partly depends on the filename you picked. We'll proceed "
425 "assuming you chose ``rose''. If you didn't, you can rewrite history to make "
426 "it look like you did:"
428 "Du solltest nun drei Objekte sehen. Dieses mal kann ich Dir nicht sagen, wie "
429 "die zwei neuen Dateien heißen, weil es zum Teil vom gewählten Dateiname "
430 "abhängt, den Du ausgesucht hast. Fahren wir fort mit der Annahme, Du hast "
431 "eine Datei ``rose'' genannt. Wenn nicht, kannst Du den Verlauf so "
432 "umschreiben, dass es so aussieht als hättest Du es:"
435 #: ../en/secrets.txt:112
438 " $ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'\n"
439 " $ find .git/objects -type f\n"
441 " $ git filter-branch --tree-filter 'mv DEIN_DATEINAME rose'\n"
442 " $ find .git/objects -type f\n"
445 #: ../en/secrets.txt:116
447 "Now you should see the file +.git/objects/05/"
448 "b217bb859794d08bb9e4f7f04cbda4b207fbe9+, because this is the SHA1 hash of "
451 "Nun müsstest Du die Datei +.git/objects/05/"
452 "b217bb859794d08bb9e4f7f04cbda4b207fbe9+ sehen, denn das ist der SHA1-Hash-"
453 "Wert ihres Inhalts:"
456 #: ../en/secrets.txt:118
458 msgid " \"tree\" SP \"32\" NUL \"100644 rose\" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d\n"
459 msgstr " \"tree\" SP \"32\" NUL \"100644 rose\" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d\n"
462 #: ../en/secrets.txt:120
463 msgid "Check this file does indeed contain the above by typing:"
465 "Prüfe, ob diese Datei tatsächlich dem obigen Inhalt entspricht, durch "
469 #: ../en/secrets.txt:122
471 msgid " $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch\n"
472 msgstr " $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch\n"
475 #: ../en/secrets.txt:124
476 msgid "With zpipe, it's easy to verify the hash:"
477 msgstr "Mit zpipe, ist es einfach den SHA1-Hash-Wert zu prüfen:"
480 #: ../en/secrets.txt:126
482 msgid " $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum\n"
483 msgstr " $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum\n"
486 #: ../en/secrets.txt:129
488 "Hash verification is trickier via cat-file because its output contains more "
489 "than the raw uncompressed object file."
491 "Die SHA1-Hash-Wert Prüfung mit 'cat-file' ist etwas kniffliger, da dessen "
492 "Ausgabe mehr als die rohe unkomprimierte Objektdatei enthält."
495 #: ../en/secrets.txt:135
497 "This file is a 'tree' object: a list of tuples consisting of a file type, a "
498 "filename, and a hash. In our example, the file type is 100644, which means "
499 "`rose` is a normal file, and the hash is the blob object that contains the "
500 "contents of `rose'. Other possible file types are executables, symlinks or "
501 "directories. In the last case, the hash points to a tree object."
503 "Diese Datei ist ein 'Tree'-Objekt: eine Liste von Datensätzen, bestehend aus "
504 "dem Dateityp, dem Dateinamen und einem SHA1-Hash-Wert. In unserem Beispiel "
505 "ist der Dateityp 100644, was bedeutet, dass `rose` eine normale Datei ist "
506 "und der SHA1-Hash-Wert entspricht dem 'Blob'-Objekt, welches den Inhalt von "
507 "`rose` enthält. Andere mögliche Dateitypen sind ausführbare Programmdateien, "
508 "symbolische Links oder Verzeichnisse. Im letzten Fall zeigt der SHA1-Hash-"
509 "Wert auf ein 'Tree'-Objekt."
512 #: ../en/secrets.txt:139
514 "If you ran filter-branch, you'll have old objects you no longer need. "
515 "Although they will be jettisoned automatically once the grace period "
516 "expires, we'll delete them now to make our toy example easier to follow:"
518 "Wenn Du 'filter-branch' aufrufst, bekommst Du alte Objekte, welche nicht "
519 "länger benötigt werden. Obwohl sie automatisch über Bord geworfen werden, "
520 "wenn ihre Gnadenfrist abgelaufen ist, wollen wir sie nun löschen, damit wir "
521 "unserem Beispiel besser folgen können."
524 #: ../en/secrets.txt:143
527 " $ rm -r .git/refs/original\n"
528 " $ git reflog expire --expire=now --all\n"
531 " $ rm -r .git/refs/original\n"
532 " $ git reflog expire --expire=now --all\n"
536 #: ../en/secrets.txt:150
538 "For real projects you should typically avoid commands like this, as you are "
539 "destroying backups. If you want a clean repository, it is usually best to "
540 "make a fresh clone. Also, take care when directly manipulating +.git+: what "
541 "if a Git command is running at the same time, or a sudden power outage "
542 "occurs? In general, refs should be deleted with *git update-ref -d*, though "
543 "usually it's safe to remove +refs/original+ by hand."
545 "Für reale Projekte solltest Du solche Anweisungen üblicherweise vermeiden, "
546 "da Du dadurch Datensicherungen zerstörst. Wenn Du ein sauberes 'Repository' "
547 "willst, ist es am besten, einen neuen Klon anzulegen. Sei auch vorsichtig, "
548 "wenn Du +.git+ direkt manipulierst: was, wenn zeitgleich ein Git Kommando "
549 "ausgeführt wird oder plötzlich der Strom ausfällt? Generell sollten "
550 "Referenzen mit *git update-ref -d* gelöscht werden, auch wenn es gewöhnlich "
551 "sicher ist +refs/original+ von Hand zu löschen."
554 #: ../en/secrets.txt:152
555 msgid "=== Commits ==="
556 msgstr "=== 'Commits' ==="
559 #: ../en/secrets.txt:156
561 "We've explained 2 of the 3 objects. The third is a 'commit' object. Its "
562 "contents depend on the commit message as well as the date and time it was "
563 "created. To match what we have here, we'll have to tweak it a little:"
565 "Wir haben nun zwei von drei Objekten erklärt. Das dritte ist ein 'Commit'-"
566 "Objekt. Sein Inhalt hängt von der 'Commit'-Beschreibung ab, wie auch vom "
567 "Zeitpunkt der Erstellung. Damit alles zu unserem Beispiel passt, müssen wir "
568 "ein wenig tricksen:"
571 #: ../en/secrets.txt:166
574 " $ git commit --amend -m Shakespeare # Change the commit message.\n"
575 " $ git filter-branch --env-filter 'export\n"
576 " GIT_AUTHOR_DATE=\"Fri 13 Feb 2009 15:31:30 -0800\"\n"
577 " GIT_AUTHOR_NAME=\"Alice\"\n"
578 " GIT_AUTHOR_EMAIL=\"alice@example.com\"\n"
579 " GIT_COMMITTER_DATE=\"Fri, 13 Feb 2009 15:31:30 -0800\"\n"
580 " GIT_COMMITTER_NAME=\"Bob\"\n"
581 " GIT_COMMITTER_EMAIL=\"bob@example.com\"' # Rig timestamps and authors.\n"
582 " $ find .git/objects -type f\n"
584 " $ git commit --amend -m Shakespeare # Ändere die Bemerkung.\n"
585 " $ git filter-branch --env-filter 'export\n"
586 " GIT_AUTHOR_DATE=\"Fri 13 Feb 2009 15:31:30 -0800\"\n"
587 " GIT_AUTHOR_NAME=\"Alice\"\n"
588 " GIT_AUTHOR_EMAIL=\"alice@example.com\"\n"
589 " GIT_COMMITTER_DATE=\"Fri, 13 Feb 2009 15:31:30 -0800\"\n"
590 " GIT_COMMITTER_NAME=\"Bob\"\n"
591 " GIT_COMMITTER_EMAIL=\"bob@example.com\"' # Manipuliere Zeitstempel und Autor.\n"
592 " $ find .git/objects -type f\n"
595 #: ../en/secrets.txt:170
597 "You should now see +.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+ "
598 "which is the SHA1 hash of its contents:"
600 "Du solltest nun +.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+ "
601 "finden, was dem SHA1-Hash-Wert seines Inhalts entspricht:"
604 #: ../en/secrets.txt:177
607 " \"commit 158\" NUL\n"
608 " \"tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9\" LF\n"
609 " \"author Alice <alice@example.com> 1234567890 -0800\" LF\n"
610 " \"committer Bob <bob@example.com> 1234567890 -0800\" LF\n"
612 " \"Shakespeare\" LF\n"
614 " \"commit 158\" NUL\n"
615 " \"tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9\" LF\n"
616 " \"author Alice <alice@example.com> 1234567890 -0800\" LF\n"
617 " \"committer Bob <bob@example.com> 1234567890 -0800\" LF\n"
619 " \"Shakespeare\" LF\n"
622 #: ../en/secrets.txt:179
623 msgid "As before, you can run zpipe or cat-file to see for yourself."
625 "Wie vorhin, kannst Du 'zpipe' oder 'cat-file' benutzen um es für Dich zu "
629 #: ../en/secrets.txt:182
631 "This is the first commit, so there are no parent commits, but later commits "
632 "will always contain at least one line identifying a parent commit."
634 "Das ist der erste 'Commit' gewesen, deshalb gibt es keine Eltern-'Commits'. "
635 "Aber spätere 'Commits' werden immer mindestens eine Zeile enthalten, die den "
636 "Eltern-'Commit' identifiziert."
639 #: ../en/secrets.txt:184
640 msgid "=== Indistinguishable From Magic ==="
641 msgstr "=== Von Magie nicht zu unterscheiden ==="
644 #: ../en/secrets.txt:186
646 "Git's secrets seem too simple. It looks like you could mix together a few "
647 "shell scripts and add a dash of C code to cook it up in a matter of hours: a "
648 "melange of basic filesystem operations and SHA1 hashing, garnished with lock "
649 "files and fsyncs for robustness. In fact, this accurately describes the "
650 "earliest versions of Git. Nonetheless, apart from ingenious packing tricks "
651 "to save space, and ingenious indexing tricks to save time, we now know how "
652 "Git deftly changes a filesystem into a database perfect for version control."
654 "Git's Geheimnisse scheinen zu einfach. Es sieht so aus als müsste man nur "
655 "ein paar Kommandozeilenskripte zusammenmixen, einen Schuß C-Code hinzufügen "
656 "und innerhalb ein paar Stunden ist man fertig: eine Mischung von "
657 "grundlegenden Dateisystemoperationen und SHA1-Hash-Berechnungen, garniert "
658 "mit Sperrdateien und Synchronisation für Stabilität. Tatsächlich beschreibt "
659 "dies die früheste Version von Git. Nichtsdestotrotz, abgesehen von "
660 "geschickten Verpackungstricks um Speicherplatz zu sparen und geschickten "
661 "Indizierungstricks um Zeit zu sparen, wissen wir nun, wie Git gewandt ein "
662 "Dateisystem in eine Datenbank verwandelt, das perfekt für eine "
663 "Versionsverwaltung geeignet ist."
666 #: ../en/secrets.txt:194
668 "For example, if any file within the object database is corrupted by a disk "
669 "error, then its hash will no longer match, alerting us to the problem. By "
670 "hashing hashes of other objects, we maintain integrity at all levels. "
671 "Commits are atomic, that is, a commit can never only partially record "
672 "changes: we can only compute the hash of a commit and store it in the "
673 "database after we already have stored all relevant trees, blobs and parent "
674 "commits. The object database is immune to unexpected interruptions such as "
677 "Angenommen, wenn irgendeine Datei in der Objektdatenbank durch einen "
678 "Laufwerksfehler zerstört wird, dann wird sein SHA1-Hash-Wert nicht mehr mit "
679 "seinem Inhalt übereinstimmen und uns sagen, wo das Problem liegt. Durch "
680 "Bilden von SHA1-Hash-Werten aus den SHA1-Hash-Werten anderer Objekte, "
681 "erreichen wir Integrität auf allen Ebenen. 'Commits' sind elementar, das "
682 "heißt, ein 'Commit' kann niemals nur Teile einer Änderung speichern: wir "
683 "können den SHA1-Hash-Wert eines 'Commits' erst dann berechnen und speichern, "
684 "nachdem wir bereits alle relevanten 'Tree'-Objekte, 'Blob'-Objekte und "
685 "Eltern-'Commits' gespeichert haben. Die Objektdatenbank ist immun gegen "
686 "unerwartete Unterbrechungen wie zum Beispiel einen Stromausfall."
689 #: ../en/secrets.txt:205
691 "We defeat even the most devious adversaries. Suppose somebody attempts to "
692 "stealthily modify the contents of a file in an ancient version of a project. "
693 "To keep the object database looking healthy, they must also change the hash "
694 "of the corresponding blob object since it's now a different string of bytes. "
695 "This means they'll have to change the hash of any tree object referencing "
696 "the file, and in turn change the hash of all commit objects involving such a "
697 "tree, in addition to the hashes of all the descendants of these commits. "
698 "This implies the hash of the official head differs to that of the bad "
699 "repository. By following the trail of mismatching hashes we can pinpoint the "
700 "mutilated file, as well as the commit where it was first corrupted."
702 "Wir können sogar den hinterhältigsten Gegnern widerstehen. Stell Dir vor, "
703 "jemand will den Inhalt einer Datei ändern, die in einer älteren Version "
704 "eines Projekt liegt. Um die Objektdatenbank intakt aussehen zu lassen, "
705 "müssten sie außerdem den SHA1-Hash-Wert des korrespondierenden 'Blob'-Objekt "
706 "ändern, da die Datei nun eine geänderte Zeichenfolge enthält. Das heißt "
707 "auch, dass sie jeden SHA1-Hash-Wert der 'Tree'-Objekte ändern müssen, welche "
708 "dieses Objekt referenzieren und demzufolge alle SHA1-Hash-Werte der 'Commit'-"
709 "Objekte, welche diese 'Tree'-Objekte beinhalten, zusätzlich zu allen "
710 "Abkömmlingen dieses 'Commits'. Das bedeutet auch, dass sich der SHA1-Hash-"
711 "Wert des offiziellen HEAD von dem des manipulierten 'Repository' "
712 "unterscheidet. Folgen wir dem Pfad der differierenden SHA1-Hash-Werte, "
713 "finden wir die verstümmelte Datei, wie auch den 'Commit', in dem sie "
714 "erstmals auftauchte."
717 #: ../en/secrets.txt:208
719 "In short, so long as the 20 bytes representing the last commit are safe, "
720 "it's impossible to tamper with a Git repository."
722 "Kurz gesagt, so lange die 20 Byte, welche den SHA1-Hash-Wert des letzen "
723 "'Commit' repräsentieren sicher sind, ist es unmöglich ein Git 'Repository' "
727 #: ../en/secrets.txt:214
729 "What about Git's famous features? Branching? Merging? Tags? Mere details. "
730 "The current head is kept in the file +.git/HEAD+, which contains a hash of a "
731 "commit object. The hash gets updated during a commit as well as many other "
732 "commands. Branches are almost the same: they are files in +.git/refs/heads+. "
733 "Tags too: they live in +.git/refs/tags+ but they are updated by a different "
736 "Was ist mit Git's berühmten Fähigkeiten? 'Branching'? 'Merging'? 'Tags'? Nur "
737 "Kleinigkeiten. Der aktuelle HEAD wird in der Datei +.git/HEAD+ gehalten, "
738 "welche den SHA1-Hash-Wert eines 'Commit'-Objekts enthält. Der SHA1-Hash-Wert "
739 "wird während eines 'Commit' aktualisiert, genauso bei vielen anderen "
740 "Anweisungen. 'Branches' sind fast das selbe: sie sind Dateien in +.git/refs/"
741 "heads+. 'Tags' ebenso: sie stehen in +.git/refs/tags+ aber sie werden durch "
742 "einen Satz anderer Anweisungen aktualisiert."