Quelle était la publication hebdomadaire
5 choses à faire pour la scène / désétape ligne par ligne
1. Sortie diff comme le patch d'origine
2. Sélectionnez la ligne que vous souhaitez mettre en scène / désinstaller
3. Modifier le corps du morceau `4. Recalculez l'en-tête du morceau
«5. Appliquer le patch final»
Je ne pouvais pas utiliser JGit, alors j'ai parlé d'utiliser git.exe.
3. Modifier le corps du morceau``
4. Recalculez l'en-tête du morceau``
`1. Sortie diff comme le patch d'origine
Il est facile d'obtenir un diff.
git diff -p
git diff -p --cached
Cela n'inclura pas les fichiers non suivis nouvellement ajoutés. Donc cela demande un petit effort
git ls-files -o --exclude-standard
Vous pouvez obtenir la liste avec> et obtenir le diff avec la commande suivante.
git diff --no-index /dev/null [untracked file name]
Soyez assuré que même Windows se comparera à / dev / null. Si vous voulez juste voir la différence, c'est un nouveau fichier, donc vous pouvez regarder le fichier lui-même, Dans le contexte actuel, ce que je veux, c'est un diff de format de patch qui puisse être appliqué, je l'ai donc présenté ici.
Cependant, non seulement le diff lui-même, mais également le nom du fichier sont nécessaires dans diverses situations.
git diff --name-status
git diff --name-status --cached
Il est pratique de connaître l'état (nouvel ajout, changement, renommer, supprimer)
--Name-status
est meilleur que l'option --name-only
.
Le nom du fichier est inclus dans le diff lui-même, mais cela peut être difficile.
Le début du diff ressemble à ceci
diff --git a/target.txt b/target.txt
index 0b669b6..5c30060 100644
--- a/target.txt
+++ b/target.txt
Cela semble facile à comprendre même à partir de diff.
En cas de nouvel ajout, cela ressemble à ceci.
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
Comme vous pouvez le voir dans cet exemple, s'il y a un espace dans le nom du fichier, c'est un peu ennuyeux de l'obtenir à partir de la première ligne.
Il est donc plus facile d'utiliser le nom de fichier sur la ligne +++ b /
.
Renommer est comme ça, et c'est une victoire facile car il y a plus d'informations.
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
Le changement de nom apparaît essentiellement comme un diff du fichier dans l'index.
Pour les fichiers de l'arbre de travail qui ne sont pas répertoriés dans l'index, c'est-à-dire avec la commande git diff
Apparaît sous la forme de.
Si vous spécifiez deux noms de fichiers et que vous les comparez, vous pourrez peut-être obtenir un diff qui sera traité comme un changement de nom,
Je ne sais pas comment trouver ces deux fichiers.
Dans le cas de git diff --cached
, git le trouvera pour vous.
Au fait, cela ressemble à ceci en binaire.
On dit que renommer de
renommer vers
n'est pas fixe et dépend de l'environnement du langage,
Nous n'avons pas confirmé les spécifications en particulier.
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
En cas de suppression, cela ressemble à ceci. Enfin, le nom du fichier n'est que la première ligne.
diff --git a/src/main/java/NewView.java b/src/main/java/NewView.java
deleted file mode 100644
index e69de29..0000000
+++ b /
facilite l'obtention de +++ b /
+++ b /
et qu'il y a un rename from`` rename to
, prenez-le à partir de làdiff --git
, mais vous devez vous tordre un peu la tête au cas où il y aurait des espaces dans les noms de fichier et de répertoire.C'est pourquoi je ne veux pas me tordre la tête, alors j'obtiens tranquillement le nom du fichier.
Ce que je veux créer, c'est une application qui peut être mise en scène / non mise en scène ligne par ligne. Cependant, il est difficile de tout faire ligne par ligne.
S'il s'agit d'une unité de morceau, extrayez le morceau de diff et «git apply». Ceci est pour l'étape / unstage ligne par ligne
3. Modifier le corps du morceau``
4. Recalculez l'en-tête du morceau``
Est simplement omis, donc il ne devrait y avoir aucun problème. En tant qu'interface graphique, nous avons préparé la fonction depuis le début.
Avec ce gif, Cliquez sur l'en-tête du morceau (fond noir)
Chacun est un stage / un stage.
Lors du développement pendant que le chien cagoule dans le référentiel git de cette application, Je ne l'ai pas remarqué, S'il s'agit d'un nouveau projet, le nombre de fichiers sera raisonnable dans un premier temps, Dans la plupart des cas, vous souhaitez mettre en scène l'intégralité du fichier nouvellement ajouté. Vous voudrez mettre en scène chaque fichier ou tous à la fois.
Alors, utilisez le nom de fichier que vous avez obtenu précédemment. C'est une commande normale, mais
git add -- [file paths]
git reset -- [file paths]
Le nom du fichier peut contenir des espaces, donc
Mettez toujours chaque nom de fichier entre guillemets doubles " "
.
Il y a plusieurs phases pour travailler avec git.
Je ne pense pas (trop) qu'une application devrait gérer toutes les opérations de git. De plus, quelle unité l'application (ou une partie de celle-ci) doit-elle supprimer de la fonction? Je pense que c'est un problème difficile (et en général).
Bien que, Les étapes / désétapes doivent être effectuées dans une seule application, y compris celles qui ne sont pas ligne par ligne.
J'espère que je pourrai obtenir une belle différence, mais cela semble difficile, alors À tout le moins, je veux simplement afficher et organiser les images.
ImageIO.read semblait facile en Java, donc je l'utilise. Vous pouvez obtenir une BufferedImage en passant un InputStream ou un fichier.
S'il existe actuellement en tant que fichier, il suffit de Fichier pour ce fichier.
Cependant, si vous le modifiez ou supprimez l'image, L'image avant modification ou suppression n'existe pas sous forme de fichier.
Le fait que git détecte des changements ou des suppressions signifie que Puisqu'il existe en tant qu'objet git, vous pouvez l'obtenir si vous connaissez le hachage. Et puisque le hachage est contenu dans le diff, utilisez-le.
git cat-file -p [hash]
Cette commande permet de parcourir les objets git (compressés)
Avec l'option -p
, le contenu du fichier (extrait) sera obtenu tel quel.
Je frappe la commande git de Java comme ça, Je viens de passer le InputStreme obtenu par ce process.getInputStream () à ImageIO.read.
final Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command, null, workingDir.toFile());
similarity index 100%
Cependant, dans le cas d'un simple changement de nom, le diff n'inclut pas le hachage pour une raison quelconque. Ce qui suit est le même diff que dans l'exemple précédent.
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
Par conséquent, utilisez la commande suivante pour obtenir le hachage du nom de fichier, puis obtenir l'image.
git ls-files -s [file path]
Parce qu'il existe en tant qu'objet git après et avant de renommer Il devrait être acceptable d'utiliser l'un ou l'autre nom. (Pour une raison quelconque, j'ai utilisé le nom renommé.)
Par exemple, l'image ne change pas avant et après l'étape / unstage, donc je voudrais la mettre en cache. Bien sûr, la base de la mise en cache est le hachage. Sauf dans le cas d'un changement de nom, vous devriez toujours pouvoir obtenir le hachage de diff.
Mais était-ce confus, était-ce un vestige de quelque chose ou ne pensait-il à rien? Dans mon code, j'obtiens le hachage d'un fichier nouvellement ajouté. Pour référence, je présenterai la commande.
git hash-object [file path]
Pour les applications en cours de développement La spécification est de "n'afficher que le diff du fichier sélectionné". Ainsi, si vous n'utilisez pas le cache, l'image sera chargée et créée à chaque fois que vous sélectionnez un fichier.
Dans l'environnement actuel, si vous supprimez le cache, La différence est que vous pouvez voir le sablier qui s'affiche lorsque vous attendez une commande externe pendant un moment. En fonction des performances de la machine et du nombre d'images, j'ai l'impression que ce sera difficile sans mise en cache.
L'écran est en cours de développement. Cela peut différer des spécifications réelles.
Ce sera peut-être «2. Sélectionnez la ligne que vous voulez mettre en scène / désinstaller». J'ai beaucoup oublié, donc je veux l'écrire tôt.
Swing
Au fait, je l'ai écrit dans Swing.
Au départ, j'ai utilisé JList pour l'affichage et la sélection de Diff, Il semble que JList ne puisse pas être mis à jour cellule par cellule, je l'ai donc changé en JTable. Après avoir chargé l'image, je voulais changer l'affichage et la hauteur des seules cellules de l'image.
C'était un peu compliqué de rendre l'affichage et le traitement des événements qui étaient effectués dans JList exactement de la même manière dans JTable, Heureusement, la version JTable a éliminé le scintillement de l'affichage semblable à un scintillement qui accompagne l'affichage de l'image sur la JList. (En raison du gaspillage et de l'anxiété, j'ai également rendu possible le passage à la version JList avec un seul drapeau. Je viens de vérifier à nouveau l'opération. )
RxJava/RxSwing
De plus, je suis un homme Rx, donc j'utilise également RxJava. Je n'avais pas RxSwing pour RxJava2.0, donc je n'ai fait que Scheduler par moi-même. Un planificateur qui s'exécute sur EDT, le thread Swing UI. J'ai fait référence à RxSwing pour RxJava1.0 et RxAndroid.