2017-05-26 4 views
-1

Ich benutze libgit2 in C++ Projekt für meine benutzerdefinierte Objekte speichern.Umbenennen und aktualisieren Baumeintrag in einem Commit mit libgit2

Ich benutze git_tree_create_updated Funktion von libgit2 für die Aktualisierung von Bäumen.

Es gibt ein Problem für mich, sowohl den Umzug als auch die Aktualisierung für einige Bäume in einem Commit durchzuführen. Wenn ich alten Baum an alter Stelle entferne, und danach einen neuen Baum an einem anderen Ort hinzufüge, sieht es natürlich so aus, als würde man einen Baum löschen und einen weiteren Baum in der Git-Geschichte hinzufügen.

Wenn ich versuche, alten Baum zuerst zu neuen Platz hinzuzufügen, danach alten Baum an neuem Ort mit neuem Baum zu aktualisieren, und danach alten Baum an alter Stelle zu löschen, gibt libgit2 Fehler über doppelte Einträge in der Aktualisierungsliste zurück (für git_tree_create_updated Funktion)). Es passiert, weil ich zwei Operationen für einen Eintrag verwende, aber gibt es eine andere Methode, libgit2 mit umbenennen zu benachrichtigen?

Ich weiß, Git bietet Umbenennen/Update-Operation in einem Commit, aber wie kann ich das gleiche mit libgit2, vor allem mit git_tree_create_updated Funktion tun?

Über duplizieren: Da ich libgit2 benutze, hoffe ich, dass es eine Möglichkeit gibt, die diff-Prozedur anzupassen.

+1

Wenn es C++ ist, warum Tag C? – Marievi

+0

Weil libgit2 "C" ist – Caxa

+0

Mögliches Duplikat von [Wie mache ich git eine gelöschte und eine neue Datei als Datei verschieben?] (Https://stackoverflow.com/questions/433111/how-to-make-git- Mark-a-deleted-und-eine-neue-Datei-als-eine-Datei-move) –

Antwort

0

Git bietet keinen Umbenennungsvorgang in einem Commit: Git speichert keine Metadaten darüber, wie ein Commit geändert wurde, sodass keine Informationen über Umbenennungen gespeichert werden.

Git betrachtet lediglich Ihren Verlauf und vergleicht die gelöschten Objekte mit den hinzugefügten Objekten - wenn sie einander textlich ähnlich sind, dann entscheidet es, dass die Dateien umbenannt wurden. Wenn nicht, wurden sie gelöscht und hinzugefügt.

Da Git diese Information nicht speichert, gibt es in Libgit2 keine Konfiguration beim Ändern des Index oder beim Erstellen eines Commits.

Wenn Sie Ihre eigene, benutzerdefinierte Funktion zur Bestimmung der Ähnlichkeit zwischen Dateien bereitstellen möchten, können Sie Ihre eigenen similarity metric zur Berechnung der Ähnlichkeit zwischen Dateien bereitstellen.

+0

Ich vermutete ein solches Verhalten von Git, danke für Erklärungen. Aber was ist mit Binärdaten vergleichen? Gibt es eine Methode, die durch die libgit2 compare-Methode erklärt werden kann, so dass git undarm ist, dass Objekte ähnlich sind? – Caxa

+0

Ja, ich habe meine Antwort aktualisiert, um die Informationen zu Ähnlichkeitsmetriken zu enthalten. –

0

Da ich keine Möglichkeit gefunden habe, die diff-Prozedur mit libgit2 anzupassen, bin ich zu dem Schluss gekommen, dass ich das Standardgit-Diff-Ergebnis von libgit2 durchlaufen muss, um die Umbenennungs-/Aktualisierungssituation manuell zu bestimmen und mein eigenes Diff einzurichten Liste.

Verwandte Themen