2010-11-14 9 views
18

Ich machte einen Commit vor ungefähr einem Monat, der mich verursachte, neue Ordner und Unterverzeichnisse zu verursachen und meine Quellcodedateien zwischen ihnen zu verschieben. Ich habe gerade meine Geschichte zum ersten Mal seit dieser Zeit durchgesehen und festgestellt, dass Git 'Geschichte verloren hat, seit die Originaldateien gelöscht und dann wieder hinzugefügt wurden, nehme ich an - dh wenn ich eine Datei in meiner GUI-GUI anschaue unter NDA, so kann ich es nicht direkt diskutieren, aber zum Beispiel ist dieses Repository auch auf GitHub defekt. GitHub zeigt eindeutig, dass es das Commit als eine Reihe von Zügen erkennt.) Es zeigt nur den Verlauf für jede Datei zurück bis zum Projektordner wurde neu organisiert.Verlorene Git-Geschichte nach dem Reorganisieren des Projektordners

Nach dem Lesen ein paar Fragen (Getting Git to Acknowledge Previously Moved Files, How to make git mark a deleted and a new file as a file move?), bin ich einfach mehr verloren als zu Beginn. Es klingt wie aus diesen Antworten, dass ich das überhaupt nicht beheben kann? Ich würde wirklich jede Hilfe hier schätzen.

+3

@JUST: Ihre Meinung ist diesmal falsch. SO ist genau der richtige Ort für Fragen zur Versionskontrolle. Sicherlich deuten die Links des OP zu früheren Git-Fragen darauf hin? Schauen Sie sich einfach die FAQ an: "Software-Tools, die von Programmierern häufig verwendet werden". Ich nehme an, das ist deine enge Stimme - vielleicht solltest du dir die FAQ und die Seite mit den Privilegien ansehen, bevor du dieses Privileg erneut ausübst. – Cascabel

+0

@Jefromi: Ich höre dich, aber da "Tag Sets" kam, habe ich diese Art von Kampf gestoppt;) Siehe http://blog.stackoverflow.com/2010/11/stack-overflow-homepage-changes/#comment -51797. Sie können diese Fragen ziemlich genau nachfragen, wo immer sie wollen ... Ich werde sie * sehen *) – VonC

+0

@VonC: Ich würde argumentieren, wir sollten immer noch versuchen, die Fragen an einem Ort zu halten, wenn nicht für uns, für die Leute Suche nach Antworten. – Cascabel

Antwort

9

In Git gibt es nicht das Konzept der Datei verschieben.

Einige Tools, wie GitHub, betrachten ein Commit, das eine Datei namens X enthält, die gelöscht wurde, und eine Datei mit dem Namen X, für die eine Dateiverschiebung erstellt wurde.

Laut Linus Torvalds ist File Move nur ein Spezialfall des Refactorings; Aus diesem Grund wird Git es nicht anders behandeln. Die Behandlung dieses speziellen Falles ist, wie viele andere auch, den übergeordneten Werkzeugen (wie Frontends) überlassen.

Für weitere Informationen zu diesem Thema, überprüfen Sie this answer von Linus Torvalds.

+2

Ich weiß nichts über Git im Allgemeinen, aber Github verliert den Verlauf einer Datei, wenn Sie es verschieben. Ich sehe dieses Problem in einem meiner Github-Repos, wo ich jetzt eine komplette Verzeichnisstruktur verschoben habe und alle darin enthaltenen Dateien nun mit 1 Element in ihrem Verlauf angezeigt werden. – Powerlord

+0

Der Link in Ihrer Antwort ist tot, haben Sie eine andere Quelle? Oder können Sie einfach das ganze Zitat posten? – ProgrammerAtWork

+0

Keine andere Quelle als der angegebene Link. Scheint, dass das ganze http://permalink.gmane.org/ nicht wie erwartet funktioniert –

0

Wenn Sie Revisionen aus Ihrer Geschichte wirklich vermissen (es ist nicht ganz klar aus Ihrer Frage, was eigentlich fehlt) und es ist nur etwa einen Monat, haben Sie wahrscheinlich noch Zeit - schauen Sie sich den Reflog an; Es behält eine Kopie von jeder Referenz, die Sie ausgecheckt haben. Wenn Sie also einen Fehler machen, können Sie zurückbekommen, was Sie vorher hatten.

Die Standardeinstellung ist, dass die Einträge für das erneute Auflisten 90 Tage lang beibehalten werden. Sie sind durch git gc abgelaufen.

git help reflog 
+0

Ich hätte klarer sein sollen - Ich vermisse keine Daten, aber wenn ich versuche, den Verlauf einer bestimmten Datei in meiner git-GUI zu sehen, wird nur mein "Reorganisations" -Commit angezeigt – refulgentis

2

Haben Sie versucht, Einstellungen config diff.renames?

diff.renames 

Tells git Umbenennungen zu erkennen. Wenn auf einen booleschen Wert gesetzt, wird die grundlegende Erkennung von Umbenennungen aktiviert. Wenn "Kopieren" oder "Kopieren" eingestellt ist, werden auch Kopien erkannt.

Hinweis: Um den Verlauf einer einzelnen Datei in Umbenennungen zu verfolgen, müssen Sie "git log -p --follow file" verwenden.

+0

Es scheint, dass TC tatsächlich eine Datei gelöscht hat und diese dann später (oder so ähnlich) wiederhergestellt hat, was bedeutet, dass Git sie nicht als Umbenennung erkennt. – erjiang

+0

Ich habe - kein Würfel. Dieses Repository ist auch auf GitHub "kaputt", wenn ich GitHub nur dazu bringen kann, es korrekt zu lesen, werde ich glücklich sein. – refulgentis

0

Ich würde ein Skript ausführen, das alle Objekte durchläuft. Sie müssten zuerst alle Paketdateien entpacken. Das Skript würde den Typ überprüfen, wenn es sich um einen Commit handelt, den Sie sehen würden, wenn Sie der Autor sind. Dann überprüfen Sie das Datum. Listen Sie diese und grep für den gewünschten Dateinamen. Sobald Sie die von Interesse verpflichten haben, erstellen Sie einen Zweig mit

git branch RecoveredWork hash-of-your-commit 

und sehen Sie, wenn Sie alle haben, die Sie mit

wollen
git log RecoveredWork --graph --decorate 

von hier aus können Sie einige Filter Verzweigung tun wollen, Pfropfen und/oder Rebasing, um die Geschichte erneut zu verknüpfen.

2

Soweit ich es sehen Sie wollen:

git log --follow some_file.cpp 

Siehe http://git-scm.com/docs/git-log für weitere Einzelheiten. Ich bin mir nicht sicher, ob du das willst. aber im Falle von Git, git verfolgt Inhalt nicht Dateien. Das Problem ist, dass die Bestimmung, dass Informationen wirklich teuer sind, und es wird angenommen, dass Sie normalerweise nicht brauchen ...

0

Ich kann mir ein paar Möglichkeiten vorstellen. Wenn Dinge nur herumgeschlurft wurden, aber nicht verfolgt werden, nehme ich an, dass dies in zwei verschiedenen Commits getan wurde ... eines zum Entfernen und dann eines zum erneuten Hinzufügen. Erstellen Sie zuvor einen neuen Zweig im Commit, laden Sie die nächsten beiden Commits als einen Commit, und hängen Sie danach alles an.

Wenn das nicht der Fall ist, müssen Sie möglicherweise mit git log -M -C

2

an den Festschreibungen sehen Wenn Sie Ordner bewegen in git möchten, können Sie git mv verwenden.

Ich hatte eine Reihe von Ordnern im Stammverzeichnis meines Repositorys und wollte sie in zwei Unterverzeichnisse verschieben, also habe ich die beiden neuen Verzeichnisse mit ** mkdir erstellt.

Dann zog ich Dateien und Ordner einer nach dem anderen in die neuen Verzeichnisse wie folgt aus:

git mv folder1/ newDirectory1/ 
git mv file1.txt newDirectory2/ 

usw.

Ich hatte einen Fall, wo ich wollte src eines der Verzeichnisse umbenennen und ich habe es wie folgt aus:

git mv folder2 newDirectory1/src 

Dies in einer Reihe von Dateien geführt, die so aussah:

Nachdem ich fertig war, erstellte ich einen neuen Zweig namens "reorganisiert", so dass ich nicht die Arbeit stören würde, die ein anderer Entwickler in der Master-Branche machte. Er fuhr fort, an den Akten zu arbeiten, und als er neue Änderungen an den Meister schob, zog ich die Änderungen an und fusionierte sie in meinen Zweig, und alles funktionierte so, wie ich es mir erhofft hatte. Dateien, die verschoben wurden, wurden ordnungsgemäß von ihren ursprünglichen Speicherorten referenziert und ihre Commits erhalten.

Verwandte Themen