Was war die wöchentliche Veröffentlichung
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
Ich konnte JGit nicht verwenden, also habe ich über die Verwendung von git.exe gesprochen.
3. Bearbeiten Sie den Körper von Hunk``
4. Berechnen Sie den Hunk-Header neu``
1. Ausgangsdifferenz als Original-Patch
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.
In verschiedenen Situationen wird jedoch nicht nur der Diff selbst, sondern auch der Dateiname benötigt.
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.
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.
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.
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
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
+++ b /
macht es einfach, von +++ b /
zu kommen+++ b /
gibt und es ein Umbenennen von`` umbenennen in
gibt, nimm es von dortdiff --git
erhalten können, aber Sie müssen Ihren Kopf ein wenig drehen, falls in der Datei und im Verzeichnisnamen ein Leerzeichen vorhanden istDeshalb möchte ich meinen Kopf nicht verdrehen, damit ich den Dateinamen leise bekomme.
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.
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.
Mit diesem GIF, Klicken Sie auf die Hunk-Überschrift (schwarzer Hintergrund)
Jeder ist Bühne / Unstage.
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.
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.
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.)
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.
Der Bildschirm befindet sich in der Entwicklung. Es kann von den tatsächlichen Spezifikationen abweichen.
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.