Wie kann ich den Verlauf und den Inhalt einer Datei in Subversion anzeigen, wenn ich sie lösche? Wenn ich versuche zu tun , svn cat
oder svn log
auf eine nicht vorhandene Datei, beschwert sich , dass die Datei nicht existiert.
Wenn ich die Datei wiederbeleben wollte, sollte ich sie dann einfach svn add
zurückgeben?
(Ich habe speziell nach Subversion gefragt, aber ich würde auch gerne erfahren, wie Bazaar, Mercurial und Git auch mit diesem Fall umgehen.)
quelle
Wenn Sie sich alte Dateien ansehen möchten, sollten Sie wirklich den Unterschied kennen zwischen:
und
Die erste Version untersucht den Pfad, der jetzt als http: // server / svn / project / file verfügbar ist, und ruft diese Datei wie in Revision 1234 ab. (Diese Syntax funktioniert also nach dem Löschen einer Datei nicht.)
Die zweite Syntax wird die Datei , die als verfügbar war http: // server / svn / Projekt / die Datei in Revision 1234. Also diese Syntax DOES Arbeit auf gelöschte Dateien.
Sie können diese Methoden sogar kombinieren, um eine Datei abzurufen, die in Revision 2345 als http: // server / svn / project / file verfügbar war, aber den Inhalt wie 1234 mit:
quelle
./local/file
wenn das./local
Verzeichnis nicht vorhanden war. Dies ist möglicherweise kein Problem für neuere Versionen von SVN.^
Notation praktisch: Sie bezieht sich auf das Repository-Stammverzeichnis, sodass Sie sagen könnensvn cat ^/local/file@REV
(abhängig von der Entfernung zwischen dem Repository-Stammverzeichnis und der URL).svn: E200009: Could not cat all targets because some targets are directories
Suchen Sie zunächst die Versionsnummer, unter der die Datei gelöscht wurde:
Dann suchen Sie in log.txt (kein SVN-Guru, daher kenne ich keinen besseren Weg) nach einer Zeile mit
und sehen, welche Revision das war. Stellen Sie dann wie in den anderen Antworten die Datei mit der vorherigen Version wieder her.
quelle
Es ist nichts Besonderes in Git. Wenn Sie den Namen der Datei kennen, können Sie die Änderung, durch die sie entfernt wurde, mit log herausfinden:
Mit diesem Commit können Sie dann die Datei abrufen, wie sie vor dem Löschen vorhanden war.
Beispiel:
Beachten Sie, dass dadurch die Datei nicht wieder in die Revisionskontrolle versetzt wird. Die Datei, wie sie im Endzustand vorhanden war, wird einfach am aktuellen Speicherort abgelegt. Sie können es dann hinzufügen oder einfach inspizieren oder was auch immer von diesem Punkt an.
quelle
Eine Lösung, die nur die GUI verwendet:
Wenn Sie den Namen der Datei kennen, aber nicht die letzte Versionsnummer oder den Pfad kennen:
Dies zeigt dann nur die Revisionen an, bei denen die Datei hinzugefügt / geändert / gelöscht wurde. Dies ist Ihr Verlauf der Datei.
Beachten Sie, dass die Datei, wenn sie durch Löschen eines ihrer übergeordneten Ordner gelöscht wurde, keinen "gelöschten" Eintrag im Protokoll enthält (und daher die Lösung von mjy nicht funktioniert). In diesem Fall entspricht der letzte Eintrag im gefilterten Protokoll dem Inhalt beim Löschen.
quelle
Wird Ihnen den Weg und die Überarbeitung bringen. In git (prüft auch auf Umbenennungen):
quelle
Zusätzlich zu Dustins Antwort können Sie in seinem Beispiel Folgendes tun, wenn Sie nur den Inhalt untersuchen und nicht überprüfen möchten:
Das: trennt eine Revision und einen Pfad in dieser Revision und fragt effektiv nach einem bestimmten Pfad bei einer bestimmten Revision.
quelle
Verwenden Sie diesen Befehl:
Dadurch werden alle Revisionen aufgelistet, bei denen jemals Dateien gelöscht wurden, die dem Muster entsprechen. Das heißt, wenn Sie auf der Suche nach Datei README, dann alle
/src/README
,/src/README.first
und/some/deeply/hidden/directory/READMENOT
wird gefunden und aufgelistet werden.Wenn Ihr Dateiname Schrägstriche (Pfad), Punkte oder andere Regex-Sonderzeichen enthält, vergessen Sie nicht, diese zu maskieren, um Fehlanpassungen oder Fehler zu vermeiden.
quelle
Wenn Sie den Pfad zur gelöschten Datei nicht kennen, können Sie ihn mit dem ansonsten allzu schweren Befehl suchen
svn log
:Der Befehl hämmert den Server wahrscheinlich genauso wie ohne die Suchoption, aber zumindest der Rest der beteiligten Ressourcen (einschließlich Ihrer Augäpfel) wäre etwas entlastet, da dies Ihnen sagt, in welcher Revision diese Datei gelöscht wurde. Anschließend können Sie den anderen Tipps folgen (hauptsächlich mit demselben
svn log
Befehl, jedoch bereits auf einem definierten Pfad).quelle
svn log --search _test2.php -v
... svn: ungültige Option: --search ... :(Das Poster hat hier tatsächlich 3 Fragen gestellt:
Alle Antworten, die ich hier sehe, beziehen sich auf die Fragen 2 und 3.
Die Antwort auf Frage 1 lautet:
Sie müssen noch die Revisionsnummer für den Zeitpunkt des letzten Bestehens der Datei abrufen, die hier von anderen eindeutig beantwortet wird.
quelle
Ah, da ich lerne, Bazaar zu benutzen, habe ich es versucht. Ohne Erfolg können Sie derzeit möglicherweise keine entfernten Dateien protokollieren und mit Anmerkungen versehen ... :-(
Versucht:
aber neugierig (und zum Glück) kann ich tun:
und:
und wie im obigen Fehler vorgeschlagen:
( Parameter
-B
(--before-context
) nach Bedarf anpassen ).quelle
Sie müssten eine Revision angeben.
quelle
Wenn Sie den Verlauf einer Datei vor dem Umbenennen anzeigen möchten, können Sie sie wie in einem Kommentar hier erwähnt verwenden
quelle
Ich wollte selbst eine Antwort. Versuchen Sie Folgendes, um nur Löschvorgänge auszugeben
svn log
.Dies filtert die Protokollausgabe durch awk . awk puffert jede gefundene Revisionszeile und gibt sie nur aus, wenn ein Löschdatensatz gefunden wird. Jede Revision wird nur einmal ausgegeben, sodass mehrere Löschvorgänge in einer Revision zusammengefasst werden (wie bei der Standardausgabe
svn log
).Sie können a angeben
--limit
, um die Anzahl der zurückgegebenen Datensätze zu verringern. Sie können auch die entfernen--stop-on-copy
bei Bedarf .Ich weiß, dass es Beschwerden über die Effizienz des Parsens des gesamten Protokolls gibt. Ich denke, dies ist eine bessere Lösung als grep und die
-B
Option "Cast a Wide Net" . Ich weiß nicht, ob es effizienter ist, aber ich kann mir keine Alternative dazu vorstellensvn log
. Es ähnelt der Antwort von @Alexander Amelkin, benötigt jedoch keinen bestimmten Namen. Es ist auch mein erstes awk- Skript, daher könnte es unkonventionell sein.quelle
Angenommen, Ihre Datei wurde als ~ / src / a / b / c / deleted.file bezeichnet
Beispielausgabe, fand es bei r90440
Kopieren Sie es zurück in die vorherige Version (90439 = 90440-1)
quelle
Sie können die letzte Revision finden, die die Datei mithilfe der binären Suche bereitstellt. Ich habe dafür ein einfaches
/bin/bash
Skript erstellt:quelle
Ich habe ein PHP-Skript geschrieben, das das SVN-Protokoll aller meiner Repositorys in eine MySQL-Datenbank kopiert. Ich kann jetzt meine Kommentare oder Dateinamen im Volltext durchsuchen.
quelle