You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>Wenn Ihre Anwendung für Software-Entwickler gedacht ist, stehen die Chancen gut, dass sie von der Integration mit der Quellcode-Versionsverwaltung profitieren kann.
22
-
Auch Anwendungen, die nicht für Entwickler bestimmt sind, wie z.B. Texteditoren, könnten potenziell von Funktionen der Versionskontrolle profitieren. Das Git-System funktioniert sehr gut für viele unterschiedliche Einsatzszenarien.</p><p>Wenn Sie Git in Ihre Anwendung integrieren müssen, haben Sie im Wesentlichen zwei Möglichkeiten: eine Shell zu erzeugen und damit das Git-Kommandozeilenprogramm aufzurufen oder eine Git-Bibliothek in Ihre Anwendung einzubetten.
21
+
<p>Wenn deine Anwendung für Software-Entwickler gedacht ist, stehen die Chancen gut, dass sie von der Integration mit der Quellcode-Versionsverwaltung profitieren kann.
22
+
Auch Anwendungen, die nicht für Entwickler bestimmt sind, wie z.B. Texteditoren, könnten potenziell von Funktionen der Versionskontrolle profitieren. Das Git-System funktioniert sehr gut für viele unterschiedliche Einsatzszenarien.</p><p>Wenn du Git in deiner Anwendung integrieren musst, hast du im Wesentlichen zwei Möglichkeiten: eine Shell zu erzeugen und damit das Git-Kommandozeilenprogramm aufzurufen oder eine Git-Bibliothek in deine Anwendung einzubetten.
23
23
Hier werden wir die Befehlszeilenintegration und einige der beliebtesten, integrierbaren Git-Bibliotheken behandeln.</p>
<p>Die eine Möglichkeit besteht darin, einen Shell-Prozess zu erzeugen und das Git-Kommandozeilen-Tool zu verwenden, um die Arbeit zu erledigen.
27
27
Das hat den Vorteil, dass es kanonisch ist und alle Funktionen von Git unterstützt werden.
28
-
Außerdem ist dieses Verfahren ganz einfach, da die meisten Laufzeit-Umgebungen eine vergleichsweise unkomplizierte Möglichkeit haben, einen Prozess mit Kommandozeilen-Argumenten aufzurufen.
28
+
Außerdem ist dieses Verfahren sehr einfach, da die meisten Laufzeit-Umgebungen eine vergleichsweise unkomplizierte Möglichkeit haben, einen Prozess mit Kommandozeilen-Argumenten aufzurufen.
29
29
Dieser Weg hat jedoch auch einige Nachteile.</p>
30
30
</div>
31
31
<divclass="paragraph">
32
32
<p>Zum einen ist die gesamte Textausgabe in Klartext.
33
-
Das bedeutet, dass Sie das gelegentlich wechselnde Ausgabeformat von Git analysieren müssen, um Fortschritts- und Ergebnisinformationen zu erfassen, was ineffizient und fehleranfällig sein kann.</p>
33
+
Das bedeutet, dass du das gelegentlich wechselnde Ausgabeformat von Git analysieren musst, um Fortschritts- und Ergebnisinformationen zu erfassen, was ineffizient und fehleranfällig sein kann.</p>
34
34
</div>
35
35
<divclass="paragraph">
36
36
<p>Ein weiterer Nachteil ist die unzureichende Fehlerkorrektur.
37
37
Wenn ein Repository irgendwie beschädigt ist oder der Benutzer einen fehlerhaften Konfigurationswert eingestellt hat, verweigert Git einfach die Durchführung vieler Operationen.</p>
38
38
</div>
39
39
<divclass="paragraph">
40
-
<p>Noch ein anderer ist das Prozessmanagement.
40
+
<p>Ausserdem gibt es noch das Prozessmanagement.
41
41
Git erfordert die Verwaltung einer Shell-Umgebung in einem separaten Prozess, was zu unerwünschter Komplexität führen kann.
42
42
Der Versuch, viele dieser Prozesse zu koordinieren (insbesondere wenn mehrere Prozesse auf das gleiche Repository zugreifen wollen), kann eine ziemliche Herausforderung darstellen.</p>
<p>API-Dokumentation, Tutorials und viele Beispiele, wie bestimmte Aufgaben mit Dulwich erledigt werden können, finden sind auf der offiziellen Homepage unter <ahref="https://www.dulwich.io" class="bare" target="_blank" rel="noopener">https://www.dulwich.io</a>.</p>
66
+
<p>API-Dokumentation, Tutorials und viele Beispiele, wie bestimmte Aufgaben mit Dulwich erledigt werden können, findest du auf der offiziellen Homepage unter <ahref="https://www.dulwich.io" class="bare" target="_blank" rel="noopener">https://www.dulwich.io</a>.</p>
Wenn Sie Git aus einem Java-Programm heraus verwenden möchten, gibt es eine voll funktionsfähige Git-Bibliothek mit der Bezeichnung JGit.
24
+
Wenn du Git aus einem Java-Programm heraus verwenden möchtest, gibt es eine voll funktionsfähige Git-Bibliothek mit der Bezeichnung JGit.
25
25
Dabei handelt es sich um eine vergleichsweise vollständige Implementierung von Git, die ausschließlich in Java geschrieben wurde und in der Java-Community weit verbreitet ist.
26
26
Das JGit-Projekt ist unter dem Dach von Eclipse angesiedelt, und seine Homepage ist unter <ahref="https://www.eclipse.org/jgit/" class="bare" target="_blank" rel="noopener">https://www.eclipse.org/jgit/</a> zu finden.</p>
27
27
</div>
28
28
<divclass="sect3">
29
29
<h3id="_die_einrichtung">Die Einrichtung</h3>
30
30
<divclass="paragraph">
31
-
<p>Es gibt eine Reihe von Möglichkeiten, Ihr Projekt mit JGit zu verbinden und mit dem Schreiben von Code dafür zu beginnen.
32
-
Die wahrscheinlich einfachste ist die Verwendung von Maven – die Integration wird durch das Hinzufügen des folgenden Snippets zum <code><dependencies></code> Tag (dt. Abhängigkeiten) in Ihrer pom.xml Datei erreicht:</p>
31
+
<p>Es gibt eine Reihe von Möglichkeiten, dein Projekt mit JGit zu verbinden und damit Code zu schreiben.
32
+
Die wahrscheinlich einfachste ist die Verwendung von Maven – die Integration wird durch das Hinzufügen des folgenden Snippets zum <code><dependencies></code> Tag (dt. Abhängigkeiten) in deiner pom.xml Datei erreicht:</p>
<p>Die <code>version</code> wird höchstwahrscheinlich schon weiter fortgeschritten sein, wenn Sie das hier lesen. Unter <ahref="https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit" class="bare" target="_blank" rel="noopener">https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit</a>finden Sie aktuelle Informationen zum Repository.
45
-
Sobald dieser Schritt abgeschlossen ist, wird Maven automatisch die von Ihnen benötigten JGit-Bibliotheken herunterladen und verwenden.</p>
44
+
<p>Die <code>version</code> wird höchstwahrscheinlich schon weiter fortgeschritten sein, wenn du das hier liest. Unter <ahref="https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit" class="bare" target="_blank" rel="noopener">https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit</a>findest du aktuelle Informationen zum Repository.
45
+
Sobald dieser Schritt abgeschlossen ist, wird Maven automatisch die von dir benötigten JGit-Bibliotheken herunterladen und verwenden.</p>
46
46
</div>
47
47
<divclass="paragraph">
48
-
<p>Wenn Sie die binären Abhängigkeiten lieber selbst verwalten möchten, sind vorkompilierte JGit-Binärdateien unter <ahref="https://www.eclipse.org/jgit/download" class="bare" target="_blank" rel="noopener">https://www.eclipse.org/jgit/download</a> erhältlich.
49
-
Sie können diese in Ihr Projekt einbauen, indem Sie einen Befehl wie den folgenden ausführen:</p>
48
+
<p>Wenn du die binären Abhängigkeiten lieber selbst verwalten möchtest, sind vorkompilierte JGit-Binärdateien unter <ahref="https://www.eclipse.org/jgit/download" class="bare" target="_blank" rel="noopener">https://www.eclipse.org/jgit/download</a> erhältlich.
49
+
Du kannst diese in deinem Projekt einbauen, indem du bspw. folgenden Befehl ausführst:</p>
Die Terminologie dafür stammt von Git direkt und JGit ist in etwa die gleichen Bereiche unterteilt. Standardbefehl-APIs bieten ein benutzerfreundliches Front-End für allgemeine Funktionen auf Benutzerebene (die Art von Aktionen, für die ein normaler Benutzer das Git-Befehlszeilen-Tool verwenden würde). Die Basisbefehl-APIs dienen der direkten Interaktion mit Repository-Objekten auf der unteren Anwendungsebene.</p>
63
63
</div>
64
64
<divclass="paragraph">
65
-
<p>Der Ausgangspunkt für die meisten JGit-Sitzungen ist die Klasse <code>Repository</code>. Das erste, was Sie tun sollten, ist davon eine Instanz zu erstellen.
65
+
<p>Der Ausgangspunkt für die meisten JGit-Sitzungen ist die Klasse <code>Repository</code>. Das erste, was du tun solltest, ist davon eine Instanz zu erstellen.
66
66
Für ein dateisystem-basiertes Repository (ja, JGit erlaubt andere Speichermodelle) wird das mit dem <code>FileRepositoryBuilder</code> erreicht:</p>
<p>Der Builder verfügt über ein flexibles API, um alle notwendigen Funktionen zum Auffinden eines Git-Repositorys bereitzustellen, unabhängig von der Frage, wo Ihr Programm sich genau befindet.
82
+
<p>Der Builder verfügt über ein flexibles API, um alle notwendigen Funktionen zum Auffinden eines Git-Repositorys bereitzustellen, unabhängig von der Frage, wo dein Programm sich genau befindet.
83
83
Er kann Umgebungsvariablen verwenden (<code>.readEnvironment()</code>), von einem Ort im Arbeitsverzeichnis starten und suchen (<code>.setWorkTree(…).findGitDir()</code>) oder einfach, wie oben beschrieben, ein bekanntes <code>.git</code> Verzeichnis öffnen.</p>
84
84
</div>
85
85
<divclass="paragraph">
86
-
<p>Sobald Sie eine <code>Repository</code> Instanz eingerichtet haben, können Sie alles Erdenkliche damit machen.
86
+
<p>Sobald du eine <code>Repository</code> Instanz eingerichtet hast, kannst du alles Erdenkliche damit machen.
<p>Hier gibt es eine Menge zu sagen, lassen Sie uns die Abschnitte nacheinander durchgehen.</p>
120
+
<p>Hier gibt es eine Menge zu sagen, lasse uns die Abschnitte nacheinander durchgehen.</p>
121
121
</div>
122
122
<divclass="paragraph">
123
123
<p>Die erste Zeile erhält einen Pointer auf die Referenz <code>master</code>.
124
-
JGit erfasst automatisch den <em>aktuellen</em><code>master</code> Ref, der bei <code>refs/heads/master</code> liegt und gibt ein Objekt zurück, mit dem Sie Informationen über die Referenz fetchen können.
125
-
Sie können den Namen (<code>.getName()</code>) und entweder das Zielobjekt einer direkten Referenz (<code>.getObjectId()</code>) oder die Referenz, auf die eine symbolische Referenz zeigt (<code>.getTarget()</code>), erhalten.
126
-
Ref-Objekte werden auch zur Darstellung von Tag-Refs und -Objekten verwendet, so dass Sie abfragen können, ob der Tag „gepeelt“ ist, d.h. ob er auf das endgültige Ziel einer (potenziell langen) Kette von Tag-Objekten zeigt.</p>
124
+
JGit erfasst automatisch den <em>aktuellen</em><code>master</code> Ref, der bei <code>refs/heads/master</code> liegt und gibt ein Objekt zurück, mit dem du Informationen über die Referenz fetchen kannst.
125
+
Du kannst den Namen (<code>.getName()</code>) und entweder das Zielobjekt einer direkten Referenz (<code>.getObjectId()</code>) oder die Referenz, auf die eine symbolische Referenz zeigt (<code>.getTarget()</code>), erhalten.
126
+
Ref-Objekte werden auch zur Darstellung von Tag-Refs und -Objekten verwendet, so dass du abfragen kannst, ob der Tag „gepeelt“ ist, d.h. ob er auf das endgültige Ziel einer (potenziell langen) Kette von Tag-Objekten zeigt.</p>
127
127
</div>
128
128
<divclass="paragraph">
129
129
<p>Die zweite Zeile ermittelt das Ziel der <code>master</code> Referenz, die als ObjectId-Instanz zurückgegeben wird.
130
130
ObjectId repräsentiert den SHA-1-Hash eines Objekts, der in der Objektdatenbank von Git möglicherweise vorhanden sein könnte.
131
-
Die dritte Zeile ist vergleichbar, zeigt aber, wie JGit die Rev-Parse-Syntax behandelt (mehr dazu in <ahref="{{< relurl "book/de/v2/ch00/_branch_references" >}}">Branch Referenzen</a>). Sie können jeden beliebigen Objektbezeichner übergeben, den Git versteht und JGit gibt entweder eine gültige ObjectId für dieses Objekt oder <code>null</code> zurück.</p>
131
+
Die dritte Zeile ist vergleichbar, zeigt aber, wie JGit die Rev-Parse-Syntax behandelt (mehr dazu in <ahref="{{< relurl "book/de/v2/ch00/_branch_references" >}}">Branch Referenzen</a>). Du kannst jeden beliebigen Objektbezeichner übergeben, den Git versteht und JGit gibt entweder eine gültige ObjectId für dieses Objekt oder <code>null</code> zurück.</p>
132
132
</div>
133
133
<divclass="paragraph">
134
134
<p>Die nächsten beiden Zeilen zeigen, wie der Rohinhalt eines Objekts geladen wird.
135
135
In diesem Beispiel rufen wir <code>ObjectLoader.copyTo()</code> auf, um den Inhalt des Objekts direkt nach stdout zu übertragen. Der ObjectLoader verfügt jedoch auch über Funktionen, um den Typ und die Größe eines Objekts zu lesen und es als Byte-Array zurückzugeben.
136
-
Für größere Objekte ( bei denen <code>true</code> den Wert <code>.isLarge()</code> zurückgibt) können Sie<code>.openStream()</code> aufrufen, um ein InputStream-ähnliches Objekt zu erhalten, das die Rohdaten des Objekts lesen kann, ohne alles auf einmal in den Arbeitsspeicher zu ziehen.</p>
136
+
Für größere Objekte ( bei denen <code>true</code> den Wert <code>.isLarge()</code> zurückgibt) kannst du<code>.openStream()</code> aufrufen, um ein InputStream-ähnliches Objekt zu erhalten, das die Rohdaten des Objekts lesen kann, ohne alles auf einmal in den Arbeitsspeicher zu ziehen.</p>
137
137
</div>
138
138
<divclass="paragraph">
139
139
<p>Die nächsten paar Zeilen beschreiben, was man für die Erstellung eines neuen Branchs benötigt.
140
140
Wir generieren eine RefUpdate-Instanz, konfigurieren einige Parameter und rufen <code>.update()</code> auf, um die Änderung anzustoßen.
141
141
Direkt danach folgt der Code zum Löschen desselben Branches.
142
-
Beachten Sie, dass <code>.setForceUpdate(true)</code> erforderlich ist, damit das funktioniert. Ansonsten gibt der Aufruf von <code>.delete()</code> den Wert <code>REJECTED</code> zurück, und es passiert nichts.</p>
142
+
Beachte, dass <code>.setForceUpdate(true)</code> erforderlich ist, damit das funktioniert. Ansonsten gibt der Aufruf von <code>.delete()</code> den Wert <code>REJECTED</code> zurück, und es passiert nichts.</p>
143
143
</div>
144
144
<divclass="paragraph">
145
145
<p>Die letzten Beispielzeilen zeigen, wie der Wert <code>user.name</code> aus den Git-Konfigurationsdateien abgerufen werden kann.
146
146
Diese Config-Instanz verwendet das Repository, das wir zuvor für die lokale Konfiguration geöffnet haben, erkennt auch die Dateien der Global- und System-Konfiguration. Sie übernimmt automatisch die Werte aus diesen Dateien.</p>
147
147
</div>
148
148
<divclass="paragraph">
149
-
<p>Das ist nur ein kleiner Ausschnitt der vollständigen API für die Sanitärtechnik. Es sind noch viele weitere Methoden und Klassen verfügbar.
149
+
<p>Das ist nur ein kleiner Ausschnitt der vollständigen API für die Basisbefehle. Es sind noch viele weitere Methoden und Klassen verfügbar.
150
150
Auch die Art und Weise, wie JGit Fehler behandelt, wird hier nicht aufgezeigt. Das geschieht nämlich über die Verwendung von Exceptions.
151
151
JGit-APIs werfen manchmal Standard-Java-Exceptions aus (wie <code>IOException</code>), aber es gibt eine Vielzahl von JGit-spezifischen Exception-Typen, die ebenfalls zur Verfügung stehen (wie z.B. <code>NoRemoteRepositoryException</code>, <code>CorruptObjectException</code> und <code>NoMergeBaseException</code>).</p>
<p>Das ist ein typisches Muster mit der Git-Klasse. Die Methoden geben ein Befehlsobjekt zurück, mit dem Sie Methodenaufrufe verketten können, um Parameter zu setzen, die beim Aufruf von <code>.call()</code> ausgeführt werden.
186
+
<p>Das ist ein typisches Muster mit der Git-Klasse. Die Methoden geben ein Befehlsobjekt zurück, mit dem du Methodenaufrufe verketten kannst, um Parameter zu setzen, die beim Aufruf von <code>.call()</code> ausgeführt werden.
187
187
Hier befragen wir den <code>origin</code> Remote nach Tags, nicht nach Heads.
188
188
Beachten Sie auch die Verwendung des Objekts <code>CredentialsProvider</code> zur Authentifizierung.</p>
<p>Das ist lediglich ein kleiner Ausschnitt der umfassenden Funktionalität von JGit.
198
-
Wenn Sie Interesse haben und mehr erfahren möchten, finden Sie hier Informationen und Anregungen:</p>
198
+
Wenn du Interesse hast und mehr erfahren möchtest, findest du hier Informationen und Anregungen:</p>
199
199
</div>
200
200
<divclass="ulist">
201
201
<ul>
202
202
<li>
203
203
<p>Die offizielle JGit-API-Dokumentation ist unter <ahref="https://www.eclipse.org/jgit/documentation" class="bare" target="_blank" rel="noopener">https://www.eclipse.org/jgit/documentation</a> zu finden:
204
-
Es handelt sich dabei um Standard-Javadoc, so dass Ihre bevorzugte JVM-IDE in der Lage sein wird, diese auch lokal zu installieren.</p>
204
+
Es handelt sich dabei um Standard-Javadoc, so dass deine bevorzugte JVM-IDE in der Lage sein wird, diese auch lokal zu installieren.</p>
205
205
</li>
206
206
<li>
207
207
<p>Das JGit Cookbook bei <ahref="https://github.com/centic9/jgit-cookbook" class="bare" target="_blank" rel="noopener">https://github.com/centic9/jgit-cookbook</a> enthält viele Beispiele, wie bestimmte Aufgaben mit JGit erledigt werden können.</p>
0 commit comments