cvs2svn schlägt mit „xxx ist keine gültige, v Datei“
Frage
ich endlich eine Antwort auf meine Frage gefunden, wenn ich es schreiben wollte! Ich werde jedoch immer noch veröffentlichen, einschließlich meiner Antwort, falls es hilft jemand anderes:
Bei der Konvertierung von CVS auf Subversion cvs2svn auf einigen Dateien mit der Meldung fehlgeschlagen
"xxx is not a valid ,v file"
Was ist das Problem?
Lösung
Wie sich herausstellt CVSNT lässt die letzte 0xa von einigen Dateien, in denen cvs2svn sie braucht. Dies kann leicht mit dem folgenden C # -Code festgelegt werden:
static void Main(string[] args)
{
foreach (string file in Directory.GetFiles(args[0], "*,v", SearchOption.AllDirectories))
{
using (FileStream sin=File.Open(file, FileMode.Open, FileAccess.ReadWrite))
{
sin.Position=sin.Length-1;
if (sin.ReadByte()==0x40)
{
Console.WriteLine("fixed "+file);
sin.WriteByte(0xa);
}
}
}
}
Andere Tipps
In meinem Fall gibt es Korruption in dem symbols
Abschnitt der xxx,v
Datei. Das erwartete Format ist tag_name:tag_rev
, aber es gab Fälle:
- Missing
:tag_rev
z.B.tag_name
behoben, indem die Linie zu löschen. - Mehrere
tag_name
z.B.tag_name1:tag_name2:tag_rev
behoben, indem den zweiten Tag-Namen zu entfernen (die man Sie wahrscheinlich entfernen hängen davon ab, was sie sind). - Ungültige Name / Revision Begrenzer. In meinem Fall wurden die ungültigen Zeichen immer
z
(zwischen ASCII:
undz
nur 1-Bit-Differenz ist).
z.B.tag_nameztag_rev
Fest durch diez
mit:
ersetzt werden.
Um während meiner Untersuchung zu helfen, habe ich eine print
Linie cvs2svn_rcsparse\common.py
. Wenn die Symbole Parsing fehlschlägt, gedruckt der letzte Tag ist die Ursache.
def _parse_admin_symbols(self, token):
while 1:
tag_name = self.ts.get()
# WileCau print the token and tag_name
print 'token=|%s| tag_name=|%s|' % (token, tag_name)
if tag_name == ';':
break
self.ts.match(':')
tag_rev = self.ts.get()
self.sink.define_tag(tag_name, tag_rev)
Der zusätzliche Druck fügt ziemlich viel Lärm auf den Ausgang, so dass es schöner sein könnte, nur zu drucken, wenn eine Ausnahme geschieht, aber das war gut genug für meine Bedürfnisse.
Ich fand auch diese Verbindung, die nicht mein Problem entpuppte aber kann jemand anders helfen. Credit Christian Haarmann für sie zu dokumentieren.
Falls der Link ungültig wird, ist die Zusammenfassung, dass jemand die xxx,v
Datei bearbeitet hatte und deren Redakteur hatte 0x0A (LF) mit 0x0D / 0x0A (CR / LF) ersetzt, und die zusätzlichen Zeichen verursacht der Parser die Datei denken korrupt war.
Ich habe auch einen solchen Fehler. Wenn ich cvs2git verwenden, um ein CVS-Repository migriert werden für mehrere Dateien git, tritt dieser Fehler auf. Ich habe festgestellt, dass es fehlt ein Schließen 0x40 (@) am Ende der Datei.
Also meine Lösung ist:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
Wenn dies das Problem nicht beheben, dann vergleichen Sie den Inhalt der beschädigten Datei mit dem RCS-Dateiformat: rcs_man_page
Eine Möglichkeit, dies zu beheben ist rcs log *file,v*
laufen, die Ihnen einen kleinen Einblick bieten können.
In meinem Fall hatte ich einige Dateien fehlen @ 's, einige Dateien ein Semikolon fehlt, und das Werkzeug, ich meine alte Repository importieren auf die cvspserver in einer nicht referenzierten Version geworfen hatten.
Viel Glück!