Git-Revision eines Arbeitsverzeichnisses finden. Das .git-Verzeichnis fehlt

8

Ich habe a ) ein Arbeitsverzeichnis ohne das Verzeichnis .git und b ) ein Repository. a ist eine Revision in der Mitte des Verlaufs von b .

Wie kann ich herausfinden, welche Version a in b übereinstimmt?

Ich dachte an ein Shellscript, das eine diff aus dem Arbeitsverzeichnis an alle Revisionen macht und wähle diejenige mit den wenigsten (hoffentlich 0) Unterschieden.

Das wäre ein bisschen roh (und ich bin nicht sicher, wie es geht), gibt es einen einfacheren Weg?

    
fabb 15.10.2011, 17:19
quelle

4 Antworten

4

Sie könnten ein Skript schreiben, um diff gitdir workdir | wc -c für jedes Commit auszuführen. Dann könnten Sie die Ergebnisse sortieren und sagen, dass das Commit mit der geringsten Differenz (gemessen als wc -c ) das engste Commit für das bare Arbeitsverzeichnis ist.

So könnte es in Python aussehen:

find_closest_sha1.py :

%Vor%

Beispiel:

%Vor%     
unutbu 15.10.2011, 19:02
quelle
1

Sie können die Anzahl der Revisionen, die Sie überprüfen müssen, mit der Spitzhacke reduzieren. Vergleichen Sie Ihr Arbeitsverzeichnis mit der neuesten Revision und wählen Sie eine abweichende Zeile, die so selten wie möglich aussieht. Angenommen, Ihre letzte Revision enthält eine Zeile mit foobar , aber Ihr Arbeitsverzeichnis nicht; Führen Sie git log -Sfoobar aus, was alle commits ausgibt, die foobar hinzufügen oder entfernen. Sie können nun Ihr Repository auf die erste (neueste) Revision in dieser Liste zurückstellen, da sich alle nachfolgenden Revisionen von Ihrem Arbeitsverzeichnis unterscheiden. Wiederholen Sie den Vorgang mit einem weiteren Unterschied, bis Sie die richtige Revision gefunden haben.

    
Jouni K. Seppänen 15.10.2011 17:28
quelle
1

Da git einen inhaltsadressierbaren Dateispeicher verwendet, sollte es möglich sein, dort irgendwo einen beliebigen Baum zu finden, aber ich kenne die Details nicht. Ich nehme an, Sie könnten die Dateien aus dem freigeschalteten Arbeitsverzeichnis in das Arbeitsverzeichnis des Repositorys kopieren, dann alles festschreiben, den Hash des durch das Commit erzeugten Baumobjekts herausfinden und die vorhandenen Commits nach einem durchsuchen, das auf denselben Baum verweist .

Damit dies funktioniert, muss die Baumstruktur natürlich perfekt übereinstimmen, so dass Sie keine nicht-verfolgten Dateien in die Festschreibung (wie Objektdateien, Editor-Backups usw.) einbinden müssen.

Edit: Ich habe das gerade in einem Repository versucht (mit git cat-file commit HEAD , um das Tree-Objekt bei HEAD anzuzeigen und die Ausgabe von git log --pretty=raw für diesen Tree-Hash zu durchsuchen), und es hat nicht funktioniert (habe ich nicht finde den Hash in der Historie). Ich habe eine Menge Warnungen über die CRLF-Konvertierung erhalten, als ich das Commit durchgeführt habe, also könnte das das Problem gewesen sein, d. H. Sie erhalten wahrscheinlich verschiedene Hashes für dieselbe Baumstruktur, abhängig davon, wie Ihr Git konfiguriert ist, um Textdateien zu manipulieren. Ich markiere dieses Antwort-Community-Wiki, falls jemand weiß, wie man das zuverlässig macht.

    
Jouni K. Seppänen 15.10.2011 17:57
quelle
0

Angenommen, die Einstellungen für In-Tree und b/.git ignore sind so wie beim Erstellen des Commits und es gibt keine nicht ignorierten nicht-verfolgten Dateien in der Arbeitsbaumstruktur. Sie sollten in etwa so etwas ausführen können.

Die Strategie besteht darin, die Git-ID des Arbeitsbaums neu zu erstellen und dann nach einem Commit zu suchen, das diesen Baum enthält.

%Vor%     
Charles Bailey 15.10.2011 20:06
quelle