[JAVA] Erstellen Sie einen wöchentlichen Git-GUI-Client [4] diff et al.

Was war die wöchentliche Veröffentlichung

Zusammenfassung bis zum letzten Mal

[\ 1 ] Stage / Unstage-Grundkenntnisse

5 Dinge, die man für Line-by-Line Stage / Unstage tun kann

1. Ausgangsdifferenz als Original-Patch 2. Wählen Sie die Linie aus, die Sie inszenieren / aufheben möchten 3. Bearbeiten Sie den Körper von Hunk`` 4. Berechnen Sie den Hunk-Header neu`` 5. Wenden Sie den letzten Patch an

[\ 2 ] unvollständige Erfassung der Phase / Phase

Ich konnte JGit nicht verwenden, also habe ich über die Verwendung von git.exe gesprochen.

[\ 3 ] Bearbeitung von Stage- / Unstage-Patches

3. Bearbeiten Sie den Körper von Hunk`` 4. Berechnen Sie den Hunk-Header neu``

Diesmal

1. Ausgangsdifferenz als Original-Patch

Diff ist nicht genug

Es ist leicht, einen Unterschied zu bekommen.

git diff -p
git diff -p --cached

Dies schließt die neu hinzugefügten nicht verfolgten Dateien nicht ein. Also es erfordert ein wenig Mühe

git ls-files -o --exclude-standard

Sie können die Liste mit> abrufen und den Diff mit dem folgenden Befehl abrufen.

git diff --no-index /dev/null [untracked file name]

Seien Sie versichert, dass auch Windows mit / dev / null verglichen wird. Wenn Sie nur den Unterschied sehen möchten, handelt es sich um eine neue Datei, sodass Sie sich die Datei selbst ansehen können. Im aktuellen Kontext möchte ich ein Patch-Format-Diff, das angewendet werden kann. Deshalb habe ich es hier vorgestellt.

Analysieren Sie diff, um den Dateinamen zu erhalten (nicht)

In verschiedenen Situationen wird jedoch nicht nur der Diff selbst, sondern auch der Dateiname benötigt.

Holen Sie sich mit Befehl

git diff --name-status 
git diff --name-status --cached

Es ist bequem, den Status zu kennen (neu hinzufügen, ändern, umbenennen, löschen) --Name-status ist besser als die Option --name-only.

Der Dateiname ist im Diff selbst enthalten, kann jedoch schwierig sein.

[M] Ändern

Der Anfang des Diff sieht so aus

diff --git a/target.txt b/target.txt
index 0b669b6..5c30060 100644
--- a/target.txt
+++ b/target.txt

Dies scheint selbst von diff leicht zu verstehen zu sein.

[A] Neuzugang

Im Falle eines Neuzugangs sieht es so aus.

diff --git a/end_with_linebreak/with space.txt b/end_with_linebreak/with space.txt
new file mode 100644
index 0000000..093dc04
--- /dev/null
+++ b/end_with_linebreak/with space.txt	

Wie Sie in diesem Beispiel sehen können, ist es etwas ärgerlich, wenn der Dateiname ein Leerzeichen enthält, ihn aus der ersten Zeile abzurufen. Es ist also einfacher, den Dateinamen in der Zeile +++ b / zu verwenden.

[R] Umbenennen

Das Umbenennen ist so und es ist ein einfacher Gewinn, weil es mehr Informationen gibt.

diff --git a/names.txt b/names_.txt
similarity index 96%
rename from names.txt
rename to names_.txt
index bcfb685..f915764 100644
--- a/names.txt
+++ b/names_.txt

Das Umbenennen wird grundsätzlich als Unterschied der Datei im Index angezeigt. Für Dateien auf dem Arbeitsbaum, die nicht im Index aufgeführt sind, dh mit dem Befehl git diff

Erscheint in Form von. Wenn Sie zwei Dateinamen angeben und diese vergleichen, erhalten Sie möglicherweise einen Unterschied, der als Umbenennung behandelt wird. Ich weiß nicht, wie ich diese beiden Dateien finden soll. Im Fall von "git diff --cached" wird git es für Sie finden.

Übrigens sieht es in Binärform so aus. Es wird gesagt, dass "Umbenennen von" Umbenennen in "nicht festgelegt ist und von der Sprachumgebung abhängt. Insbesondere haben wir die Spezifikationen nicht bestätigt.

diff --git a/src/main/resources/icon.png b/src/main/resources/icon_white.png
similarity index 100%
rename from src/main/resources/icon.png
rename to src/main/resources/icon_white.png

[D] Löschen

Im Falle einer Löschung sieht es so aus. Schließlich ist der Dateiname nur die erste Zeile.

diff --git a/src/main/java/NewView.java b/src/main/java/NewView.java
deleted file mode 100644
index e69de29..0000000

Zusamenfassend

Deshalb möchte ich meinen Kopf nicht verdrehen, damit ich den Dateinamen leise bekomme.

Stage / Unstage nicht Zeile für Zeile

Was ich erstellen möchte, ist eine Anwendung, die Zeile für Zeile bereitgestellt / nicht bereitgestellt werden kann. Es ist jedoch schwierig, alles Zeile für Zeile zu erledigen.

Bühne / Bühne in großen Einheiten

Wenn es sich um eine Hunk-Einheit handelt, extrahieren Sie das Diff-Hunk und "Git Apply". Dies ist für Line-by-Line Stage / Unstage

3. Bearbeiten Sie den Körper von Hunk`` 4. Berechnen Sie den Hunk-Header neu``

Wird einfach weggelassen, sollte es also kein Problem geben. Als GUI haben wir die Funktion von Anfang an vorbereitet.

進捗.gif

Mit diesem GIF, Klicken Sie auf die Hunk-Überschrift (schwarzer Hintergrund)

Jeder ist Bühne / Unstage.

Datei für Datei inszenieren / entfernen

Bei der Entwicklung während der Hundekapuze im Git-Repository dieser Anwendung selbst, Ich habe es nicht bemerkt, Wenn es sich um ein neues Projekt handelt, ist die Anzahl der Dateien zunächst angemessen. In den meisten Fällen möchten Sie die gesamte neu hinzugefügte Datei bereitstellen. Sie möchten jede Datei oder alle gleichzeitig bereitstellen.

Verwenden Sie also den Dateinamen, den Sie zuvor erhalten haben. Es ist ein normaler Befehl, aber

git add -- [file paths]
git reset -- [file paths]

Der Dateiname kann also Leerzeichen enthalten Setzen Sie jeden Dateinamen immer in doppelte Anführungszeichen.

Beiseite

Die Arbeit mit Git besteht aus mehreren Phasen.

Ich denke nicht (zu viel), dass eine Anwendung alle Operationen von git behandeln sollte. Welche Einheit sollte die Anwendung (oder ein Teil davon) die Funktion ausschalten? Ich denke, es ist ein schwieriges Problem (und im Allgemeinen).

Obwohl, Stage / Unstage sollte in einer Anwendung durchgeführt werden, einschließlich solcher, die nicht zeilenweise sind.

Bild

Zumindest möchte ich die Bilder einfach anzeigen und anordnen. ImageIO.read schien in Java einfach zu sein, also benutze ich es. Sie können ein BufferedImage erhalten, indem Sie einen InputStream oder eine Datei übergeben. Nicht vorhandene Datei Wenn es derzeit als Datei vorhanden ist, ist einfach Datei für diese Datei in Ordnung. Wenn Sie es jedoch ändern oder das Bild löschen, Das Bild vor dem Ändern oder Löschen existiert nicht als Datei.

Die Tatsache, dass git Änderungen oder Löschungen erkennt, bedeutet dies Da es als Git-Objekt existiert, können Sie es erhalten, wenn Sie den Hash kennen. Und da der Hash im Diff enthalten ist, verwenden Sie ihn.

git cat-file -p [hash]

Dieser Befehl dient zum Durchsuchen von Git-Objekten (komprimiert) Mit der Option -p wird der Inhalt der Datei (extrahiert) unverändert abgerufen.

Ich drücke den git-Befehl von Java so, Ich habe gerade das InputStreme, das durch diesen process.getInputStream () erhalten wurde, an ImageIO.read übergeben.

final Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command, null, workingDir.toFile());

similarity index 100%

Bei einer einfachen Umbenennung enthält der Diff jedoch aus irgendeinem Grund keinen Hash. Das Folgende ist der gleiche Unterschied wie im vorherigen Beispiel.

diff --git a/src/main/resources/icon.png b/src/main/resources/icon_white.png
similarity index 100%
rename from src/main/resources/icon.png
rename to src/main/resources/icon_white.png

Verwenden Sie daher den folgenden Befehl, um den Hash aus dem Dateinamen abzurufen und dann das Bild abzurufen.

git ls-files -s [file path]

Weil es nach und vor dem Umbenennen als Git-Objekt existiert Es sollte in Ordnung sein, einen der beiden Namen zu verwenden. (Aus irgendeinem Grund habe ich den umbenannten Namen verwendet.)

Speichercache

Zum Beispiel ändert sich das Bild nicht vor und nach dem Stage / Unstage, also möchte ich es zwischenspeichern. Die Basis für das Caching ist natürlich der Hash. Außer beim Umbenennen sollten Sie immer in der Lage sein, den Hash von diff abzurufen.

Aber war es verwirrt, war es ein Überrest von etwas oder dachte er an nichts? In meinem Code erhalte ich den Hash für eine neu hinzugefügte Datei. Als Referenz werde ich den Befehl einführen.

git hash-object [file path]

Für Anwendungen in der Entwicklung Die Spezifikation lautet "nur den Unterschied der ausgewählten Datei anzeigen". Wenn Sie den Cache nicht verwenden, wird das Bild bei jeder Auswahl einer Datei geladen und erstellt.

Wenn Sie in der vorliegenden Umgebung den Cache entfernen, Der Unterschied besteht darin, dass Sie die Sanduhr sehen können, die angezeigt wird, wenn Sie einen Moment auf einen externen Befehl warten. Abhängig von der Leistung der Maschine und der Anzahl der Bilder habe ich den Eindruck, dass es ohne Caching schwierig wird.

Fortschritt

Der Bildschirm befindet sich in der Entwicklung. Es kann von den tatsächlichen Spezifikationen abweichen.

進捗_2.gif

Nachwort

nächstes Mal

Vielleicht ist es "2. Wählen Sie die Linie aus, die Sie inszenieren / aufheben möchten". Ich habe viel vergessen, deshalb möchte ich es früh schreiben.

Swing

Ich habe es übrigens in Swing geschrieben.

Anfangs habe ich JList für den Anzeige- und Auswahlteil von Diff verwendet. Es scheint, dass JList nicht zellenweise aktualisiert werden kann, daher habe ich es in JTable geändert. Nach dem Laden des Bildes wollte ich die Anzeige und Höhe nur der Zellen des Bildes ändern.

Es war ein bisschen mühsam, die Anzeige und Ereignisverarbeitung, die in JList durchgeführt wurde, in JTable genau gleich zu machen. Glücklicherweise konnte die JTable-Version das flackernde Anzeigeflimmern beseitigen, das mit der Bildanzeige auf der JList einhergeht. (Aufgrund der Verschwendung und der Angst habe ich es auch möglich gemacht, mit einer Flagge zur JList-Version zu wechseln. Ich habe gerade die Operation noch einmal überprüft. )

RxJava/RxSwing

Außerdem bin ich ein Rx-Mann, also benutze ich auch RxJava. Ich hatte kein RxSwing für RxJava2.0, also habe ich nur Scheduler selbst erstellt. Ein Scheduler, der auf EDT ausgeführt wird, dem Swing UI-Thread. Ich habe für RxJava1.0 und RxAndroid auf RxSwing verwiesen.

Recommended Posts

Erstellen Sie einen wöchentlichen Git-GUI-Client [4] diff et al.
Erstellen Sie einen wöchentlichen Git-GUI-Client [2] für eine unvollständige Erfassung
Erstellen Sie einen wöchentlichen Git-GUI-Client. [5] Erste Desktop-App
Jetzt ist Git GUI Client selbst gemacht ist sehr beliebt!