فشل cvs2svn مع "xxx ليس ملف صالح، V"
سؤال
أخيرا وجدت إجابة على سؤالي عندما أردت نشرها! ومع ذلك، سأظل نشرها، بما في ذلك إجابتي، في حالة مساعدة شخص آخر:
عند التحويل من CVS إلى Subversion CVS2SVN فشل في بعض الملفات مع الرسالة
"xxx is not a valid ,v file"
ما هي المشكلة؟
المحلول
نظرا لأن الأمر اتضح CVSNT إغسل آخر 0xa من بعض الملفات التي يحتاجها CVS2SVN إليهم. يمكن إصلاح ذلك بسهولة مع رمز C # التالي:
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);
}
}
}
}
نصائح أخرى
في حالتي كان هناك فساد في symbols
قسم من xxx,v
ملف. التنسيق المتوقع هو tag_name.:tag_rev.
, ، ولكن كانت هناك حالات:
- مفقود
:tag_rev.
على سبيل المثالtag_name.
ثابت عن طريق حذف الخط. - مضاعف
tag_name.
على سبيل المثالTAG_NAME1.:TAG_NAME2.:tag_rev.
تم إصلاحه عن طريق إزالة اسم العلامة الثاني (الذي تزيله ربما يعتمد على ما هي). - اسم غير صالح / محدد المراجعة. في حالتي كانت الشخصية غير صالحة دائما
z
(هناك فرق 1 بت فقط بين ASCII:
وz
).
على سبيل المثالtag_name.ztag_rev.
ثابت عن طريق استبدالz
مع:
.
للمساعدة خلال التحقيق الخاص بي أضفت print
خط cvs2svn_rcsparse\common.py
. وبعد في حالة فشل تحليل الرموز، فإن العلامة الأخيرة المطبوعة هي السبب.
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)
يضيف الطباعة الإضافية الكثير من الضوضاء إلى الإخراج حتى يكون من أجمل فقط طباعة فقط إذا حدث استثناء، ولكن هذا كان جيدا بما يكفي لاحتياجاتي.
لقد وجدت أيضا هذا الرابط الذي اتضح أنه لم يكن مشكلتي ولكن قد يساعد شخصا آخر. الائتمان للمسيحي هارمان لتوثيقها.
في حال تصبح الرابط غير صالح، فإن الملخص هو أن شخصا ما قد حرر xxx,v
تم استبدال الملف ومحرره 0x0A (LF) مع 0x0d / 0x0a (cr / lf)، والشخصية الإضافية تسبب المحلل في الاعتقاد بالملف كان تالفا.
أنا أيضا مثل هذا الخطأ. عندما أستخدم CVS2GIT من أجل ترحيل مستودع CVS إلى GIT، يحدث هذا الخطأ لعدة ملفات. لقد اكتشفت أن هناك اختتام 0x40 (@) في نهاية الملف.
لذلك حلاي هو:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
إذا لم يصل هذا إلى حل المشكلة، فقم بمقارنة محتوى الملف التالف بتنسيق ملف RCS: rcs_man_page.
طريقة واحدة لاستكشاف هذا هو الركض rcs log *file,v*
, والتي قد توفر لك بعض البصيرة.
في حالتي، كان لدي بعض الملفات مفقودة @، بعض الملفات مفقودة فاصلة منقوطة، والأداة التي اعتدت استيراد مستودعي القديم على cvspserver قد ألقيت في نسخة غير مجهولة.
حظ سعيد!