ניהול גרסאות עם Subversion

ממש לאחרונה עברנו לנהל את הגרסאות עם Subversion. למי שלא יודע, ניהול גרסאות (או ניהול תצורה) הינה מערכת ששומרת את קוד המקור של התוכנות של הפרוייקט. מה שמיוחד בו לעומת סתם מגירה עם הקבצים זה שניהול הגרסאות שומר את כל הגרסאות, לא רק את האחרונה.

קשה קצת להסביר עד כמה הדבר הזה חזק למי שמעולם לא עבד איתו. המערכת זוכרת את כל ההיסטוריה של כל הקבצים, בד”כ החל משלב הקובץ הריק. ניתן לעקוב אחורה על ההיסטוריה של הקובץ, לראות מה השתנה בכל שינוי, ולקבל את התיאור שהכנסתם לכל שינוי כזה. היכולת לשחזר איפה נעשתה טעות, מה גרם לה, ומה היו ההשלכות שלה לא תסולא בפז.

עד עכשיו עבדתי באופן כמעט בלעדי עם מערכת שנקראת “CVS”. זוהי מערכת ותיקה, מאוד אמינה ומאוד פשוטה. חסרונה המרכזי של המערכת הוא בדבר אחד פשוט – היא עובדת על כל קובץ בנפרד. שינויים שהם שינויים לרוחב הפרוייקט, כמו שינוי שם של קובץ או שינוי בכמה קבצים בו-זמנית, CVS מפרק לשינויים בכל קובץ בנפרד ושומר בהתאם.

לצורך הדוגמא – rsyncrypto התחיל את דרכו עם קבצים בסיומת “cc”, שהיא הדרך המקובלת לציין קבצי C++‎ ביוניקס. בגרסה 0.14 של הפרוייקט עלה הצורך לייצר לו גרסת חלונות. בחלונות מקובל לסמן קבצי C++‎ באמצעות הסיומת cpp. מכיוון שיוניקס (ולינוקס) מסתדרים הרבה יותר טוב עם הסיומת cpp לקבצי C++‎ מאשר חלונות עם הסיומת cc, הייתי צריך לשנות את שמם של על קבצי קוד המקור של הפרוייקט. מי שמסתכל היום על קובץ בפרוייקט (למשל, main.cpp) יכול לקבל את הרושם שהקובץ לא היה קיים לפני גרסה 0.14. זוהי הגרסה הראשונה שמופיעה במערכת ניהול הגרסאות. רק מי שמבקש חתכים של כל הפרוייקט יגלה שלפני גרסה זו היה קובץ בשם main.cc, שהיא בעצם אותו הקובץ תחת שם אחר. ההיסטוריה (אותה אפשר לראות אם לוחצים על הקישורים שנתתי) לא עברה מהקובץ הישן לקובץ החדש. מי שרוצה לדעת מה קרה לקובץ טרם היותו בשם האחרון שלו עלול לא למצוא את הקובץ הקודם, ולא לדעת מה ההיסטוריה.

כל זה לא אומר ש-CVS הוא מוצר לא טוב. ההיפך הוא הנכון. זהו מוצר מצויין. אם האופציה היא לא להשתמש בכלום או לייצר בשתי פקודות מאגר CVS ולהשתמש בו, אתם יכולים לנחש מה התשובה שלי לגבי מה כדאי לעשות.

מכיוון שבעיותיו של CVS ידועות, אנשים בקהילת התוכנה החופשית עובדים על חלופות. כמובן שיש גם פתרונות בתחום התוכנה הקניינית. הידוע ביותר מבניהם הוא כלי של IBM (לשעבר rational) בשם “ClearCase”. אני חייב להודות שנסיוני עם המוצר מועט הוא אבל כואב. יש לו יכולות מאוד מפותחות בתחום של התפצלויות ואיחודים של העבודה, אבל הוא סובל מבעיות מבעיות שונות. הבעיה החמורה ביותר, מבחינתי, היא שגרסאות שורת הפקודה שלו לא חזקות כמו הגרסאות הגרפיות. במילים אחרות, יש דברים שאם רוצים לעשות עם ClearCase, חייבים להשתמש בכלים הגרפיים. במקום שבו אני נתקלתי בו היו לו גם בעיות ביצועים די קשות, אבל בהחלט ייתכן ששם אלו היו חבלי לידה. כמו כן, גם במקום אחר שבו רצו שאשתמש בו היו לו בעיות שנבעו באופן ישיר מהעובדה שצריך רשיונות. אנשים רבים שם על הרשיונות הצפים. באותו המקרה, נתתי רשימה של דרישות ממערכת ניהול תוכן, וכאשר אנשי ה-ClearCase של החברה אמרו שהם לא יכולים לעמוד בדרישות, הסברתי להם בתקיפות אך בנימוס שאני מתכוון להשתמש ב-CVS, תודה. זה שאני הייתי איש הפיתוח על לינוקס היחידי בחברה שמפתחת כולה בחלונות גם עזר קצת.

אבל עכשיו התחלנו לעבוד פנימית בלינגנו עם מערכת שנקראת SubVersion. מכל המערכות החופשיות שמחליפות את CVS, זו המערכת הבשלה והסטנדרטית ביותר. אני חייב להגיד שאני לא עובד איתו הרבה מידי זמן, וכבר מאוד מאוד מרוצה. מעבר לתמיכה בדברים שחסרים ב-CVS, הדבר המרכזי שטוב הוא זה – הוא לא מדבר עם השרת אלא אם צריך מידע מעודכן. CVS נהג לדבר עם השרת על כל פעולה – בדיקת מה השתנה אצלך, השוואות עם המקור, גרסאות – הכל. Subversion כמעט ולא מדבר אף פעם. כל הנ”ל הן שאילתות שאפשר לעשות על לאפטופ שמנותק מהרשת (או, במקרה שלי, מחובר לרשת, אבל מופרד מהשרת בפיירוול שבו ה-VPN עוד לא עובד :-). הכל קורה מהר ובצורה טובה.

אם להוסיף את דבר טוב, בימים אלו sourceforge (אתר גדול לאירוח פרוייקטי קוד פתוח) התחיל להציע שירותי Subversion לפרוייקטים שמתארחים אצלו. ברגע שיהיה לי זמן אני בפירוש מתכוון להעביר את rsyncrypto למערכת החדשה. יש עוד כמה דברים שאני צריך ללמוד איך עושים, אבל חוץ מזה, אפשר להגיד שהשתכנעתי.

שחר

Bear