เหตุมันเกิดจากเมื่อวาน (3/08/2011) กำลังนั่งทำงานกันอยู่ดีๆ เกิดไฟกระชากขึ้นมา ทำให้ Server ที่ใช้ทำ SVN ดับ พอไฟมาก็เดินไปเปิด Server ตามปกติจากนั้นก็ไม่ได้สนใจอะไร พอตอนเย็นๆ น้องๆ ก็มาบอกว่า SVN Commit Code ไม่ได้ ตอนแรกคิดว่าเกิด Conflict กันระหว่างน้องเค้าหรือเปล่า เลยไม่ได้สนใจ
พอเช้ามาจะมา Commit Code ขึ้น SVN พบว่า อ่าว เห้ย Commit ไม่ได้ ใน Eclipse ก็ไม่ได้แจ้งอะไร แจ้งเพียงว่าไม่สามารถ Connect SVN ได้ เลยไป restart SVN services พบว่ายังเหมือนเดิม คราวนี้เลยลองไปเปิด SVN Repository ผ่าน TortoiseSVN ดู พบว่ามัน Connect แล้วมันขึ้น Error มาว่า
file revision property นี้จะอยู่ใน directory ของ repository ของเรา โดยจะอยู่ที่
โดยในแต่ละ directory จะมี file ทั้งหมด 1000 file ในแต่ละ directory จะมีชื่อเป็นหมายเลขที่จะรันไปเรื่อยๆ ตามเลขของ version ที่เราได้ Commit Code ขึ้นไปบน SVN
โดยใน file เหล่านี้จะเป็นที่เก็บข้อมูลว่าใครเป็นคน Commit Code ใน version นั้นๆ ในเวลาไหน
เอาหละมาเข้าเรื่องกัน การแก้ปัญหาของ SVN: Malformed File เราต้องค้นหาในบรรดา file revision property ว่าตัวไหนที่มันเสีย โดยทั่วไป file ที่จะเสียส่วนใหญ่จะเป็น file revision ล่าสุด อย่างกรณีผมที่มันเสียเพราะไฟกระชาก ทำให้ Server SVN ดับตาม - -' ทำให้ file revision property ตัวล่าสุดเจ๊ง วิธีแก้ก็ให้ copy ตัว file revision property ตัวก่อนหน้าเอามาทับตัวที่มันเสีย
วิธีที่จะตรวจว่ามันเสียหรือไม่เสียให้ลองเปิด file revision property ตัวนั้นดู ผ่าน Text Editor ตัวไหนก้ได้ถ้ามันไม่เสียจะต้องเปิดแล้วอ่านได้ตามรูปแบบด้านบน แต่ถ้ามันเสียจริงๆ มันจะเปิดอ่านแล้วไม่รู้เรื่อง
แต่ถ้าเปิดมาแล้วมันคงเป็นรูปแบบตามด้านบนแต่มีตัวอักษรบางตัวที่เน่า อาจจะเป็นเพราะ encoding ผิดให้ลอง convert file นั้นเป็น encoding UTF-8 ถ้ามันหายเพี้ยน ก็จะแก้ปัญหา SVN: Malformed File ได้เช่นกัน โดยปัญหานี้มันจะเกิดตอนที่เราทำการ Back up ย้าย Server อ้างอิงตามนี้ http://www.narisa.com/forums/index.php?app=blog&module=display§ion=blog&blogid=5&showentry=193
แต่ถ้าเกิดว่า file สุดท้ายมันไม่ได้เสียขึ้นมาทำจะยังไง ต้องใช้ command ช่วยหา file ที่มันเสียโดยใช้ command ของ svnadmin โดยเราจะใช้ในส่วน function ของ dump เข้ามาช่วย
พอเช้ามาจะมา Commit Code ขึ้น SVN พบว่า อ่าว เห้ย Commit ไม่ได้ ใน Eclipse ก็ไม่ได้แจ้งอะไร แจ้งเพียงว่าไม่สามารถ Connect SVN ได้ เลยไป restart SVN services พบว่ายังเหมือนเดิม คราวนี้เลยลองไปเปิด SVN Repository ผ่าน TortoiseSVN ดู พบว่ามัน Connect แล้วมันขึ้น Error มาว่า
SVN: Malformed Fileคราวนี้เลยลองไปหาวิธีแก้ดู ไปเจอวิธีนี้มา http://stackoverflow.com/questions/4407638/svn-malformed-file-corrupt-repository เค้าบอกว่าน่าจะเป็นที่ file ของ revision property เสีย
file revision property นี้จะอยู่ใน directory ของ repository ของเรา โดยจะอยู่ที่
repository_path/db/revpropsด้านในจะมี directory ที่ชื่อเป็นตัวเลขเริ่มต้นด้วย 0, 1, 2, ...
โดยในแต่ละ directory จะมี file ทั้งหมด 1000 file ในแต่ละ directory จะมีชื่อเป็นหมายเลขที่จะรันไปเรื่อยๆ ตามเลขของ version ที่เราได้ Commit Code ขึ้นไปบน SVN
โดยใน file เหล่านี้จะเป็นที่เก็บข้อมูลว่าใครเป็นคน Commit Code ใน version นั้นๆ ในเวลาไหน
K 10 svn:author V 3 XXX K 8 svn:date V 27 2011-08-04T09:51:20.252836Z K 7 svn:log V 0 END
เอาหละมาเข้าเรื่องกัน การแก้ปัญหาของ SVN: Malformed File เราต้องค้นหาในบรรดา file revision property ว่าตัวไหนที่มันเสีย โดยทั่วไป file ที่จะเสียส่วนใหญ่จะเป็น file revision ล่าสุด อย่างกรณีผมที่มันเสียเพราะไฟกระชาก ทำให้ Server SVN ดับตาม - -' ทำให้ file revision property ตัวล่าสุดเจ๊ง วิธีแก้ก็ให้ copy ตัว file revision property ตัวก่อนหน้าเอามาทับตัวที่มันเสีย
วิธีที่จะตรวจว่ามันเสียหรือไม่เสียให้ลองเปิด file revision property ตัวนั้นดู ผ่าน Text Editor ตัวไหนก้ได้ถ้ามันไม่เสียจะต้องเปิดแล้วอ่านได้ตามรูปแบบด้านบน แต่ถ้ามันเสียจริงๆ มันจะเปิดอ่านแล้วไม่รู้เรื่อง
แต่ถ้าเปิดมาแล้วมันคงเป็นรูปแบบตามด้านบนแต่มีตัวอักษรบางตัวที่เน่า อาจจะเป็นเพราะ encoding ผิดให้ลอง convert file นั้นเป็น encoding UTF-8 ถ้ามันหายเพี้ยน ก็จะแก้ปัญหา SVN: Malformed File ได้เช่นกัน โดยปัญหานี้มันจะเกิดตอนที่เราทำการ Back up ย้าย Server อ้างอิงตามนี้ http://www.narisa.com/forums/index.php?app=blog&module=display§ion=blog&blogid=5&showentry=193
แต่ถ้าเกิดว่า file สุดท้ายมันไม่ได้เสียขึ้นมาทำจะยังไง ต้องใช้ command ช่วยหา file ที่มันเสียโดยใช้ command ของ svnadmin โดยเราจะใช้ในส่วน function ของ dump เข้ามาช่วย
svnadmin dumpโดยมีวิธีการใช้แบบนี้
svnadmin dump --quiet --revision <start_revision>:<end_revision> <repos_path> > nul
- <start_revision> หมายถึง scope ของ revision เริ่มต้นที่จะ dump ข้อมูล (ในที่นี้หมายถึง scope ที่จะหา error file)
- <end_revision> หมายถึง scope ของ revision สิ้นสุดที่จะ dump ข้อมูล (ในที่นี้หมายถึง scope ที่จะหา error file)
- <repos_path> หมายถึง path ของ repository ที่มีเราต้องการจะหา error
จากนั้นก็รอให้มัน dump เสร็จ เพราะมันใช้เวลานานมา ถ้าอยากจะให้มันหาทั้งหมดก็ไม่ต้องใส่ option --revision เข้าไป ถ้ามันมีปัญหามันจะหยุด ณ ตำแหน่งที่มีปัญหาและ return error ออกมาเป็น SVN: Malformed File
อ้างอิงวิธีการใช้ command svnadmin จาก http://blogs.nuxeo.com/dev/2006/04/dump-load-svn-repositories-using-svnadmin-svndumpfilter.html
Comments
Post a Comment