SVN יצירה, שימוש ובעיות נפוצות

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

בכתיבת מדריך זה אני עובד עם MacBook Pro, ואני עובד מול Versions שהוא ה SVN CLIENT שלי. השרת הוא שרת מקומי ואני משתמש בשורת הפקודות כדי להריץ את הפקודות ההכרחיות (בשרת לא יהיה svn client לכן תצטרכו להריץ פקודות כדי ליצור repository).

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

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

שלב ראשון יהיה להתקין את ה subversion כדי שנוכל להריץ פקודות svn בשרת. כדי לבצע זאת יש להתחבר לשרת באמצעות ssh בצורה הבאה:

[sourcecode]
// Login to the server using ssh
ssh domain.com -l root

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
לאחר יהיה צורך בלהזין סיסמא, זוהי סיסמאת ה root אם התחברתם עם המשתמש root ברגע שהקשתם את הסיסמא הוא יציג לכם שהינכם מחוברים משהו דומה לזה:
[sourcecode]
Vadim-Gabriels-MacBook-Pro:~ vadimgabriel$ ssh domain.com -l root
rootxdoamin.com's password:
Linux ip-10-228-66-255 2.6.21.7-2.fc8xen-ec2-v1.0 #1 SMP Tue Sep 1 10:25:30 EDT 2009 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Amazon EC2 Debian 5.0.3 lenny AMI built by Eric Hammond
http://alestic.com  http://ec2debian-group.notlong.com
You have new mail.
Last login: Fri Aug 20 16:03:34 2010 from 79.180.47.102
ip-10-xxx-66-xxx:~#

כעת יש להתקין את ה subversion באמצעות הפקודה הבאה:

[sourcecode]

$ apt-get install subversion

1
2
3
4
5
6
7
8
9
10
ברגע זה הוא מתקין את הsubversion, אמור לקחת כמה שניות.
שלב שני יהיה כמובן ליצור את התיקיה בה אנו נאחסן את כל הפרוייקטים שלנו, בעצם את כל ה repositories שאנו נאחסן כדי לנהל את הקבצים שלנו. בדרך כלל התיקיה שאנו נאחסן את הקבצים תיהיה תיקיה סגורה ופרטית, כמו כן עדיף לא לשים אותה כמובן בתיקית השרת של Apache שמריץ קבצים, ככה שגם אם משהו נגש לקובץ ישירות דרך הדפדפן הוא יראה את התוכן שלו (אם יש לו הרשאות לגשת לתיקיה הוא יצטרך להזין שם משתמש וסיסמא) במקום להריץ אותו כקובץ (html , php תלוי בסוג הקובץ).
התיקיה שאני בדרך כלל מאחסן בה את הקבצים היא תחת
[sourcecode]
/home/svn/

אם היא עדיין לא קיימת אפשר ליצור אותה בצורה הבאה:

[sourcecode]

$ mkdir /home/svn

1
2
3
4
5
6
כעת יש ליצור את התיקיה בה אנו נאחסן את הפרוייקט שלנו, לצורך הדוגמא הזו אנו נשתמש בפרוייקט בשם test ולכן נצור תיקיה בשם test תחת home/svn/test/
[sourcecode]
$ mkdir /home/svn/test

כעת אנו נצור את ה repository תחת התיקיה test שיצרנו קודם לכן, אנו נשתמש ב svnadmin אשר מאפשר לנו לנהל את subversion שהתקנו קודם לכן. בעיקר השימוש בו נעשה כדי ליצור ולמחוק repositories בזמן ש svn x קיים כדי לבצע פעולות על גבי repository קיים (פרטים בהמשך).

אנו משתמשים בפונקציה שנקראת create אשר יוצרת repository תחת תיקיה מסויימת, חשוב לדעת שהתיקיה צריכה להיות ריקה, ואי אפשר להוסיף repository ל repository קיים.

[sourcecode]

$ svnadmin create /home/svn/test

1
2
3
4
5
6
7
כעת יצרנו את ה repository אך עדיין אי אפשר להשתמש בזה, מה שאנו צריכים לעשות הוא לתת הרשאות לתיקיה הזו כדי שיהיה ניתן לגשת אליה. אנו נעשה זאת בצורה הבאה:
[sourcecode]
$ chown -R www-data /home/svn/test
$ chmod -R g+rws /home/svn/test

כעת יש לתיקיה הרשאות מתאימות , אך אנו עדיין לא יכולים לגשת אליו, בישביל לאפשר גישה דרך הדפדפן או דרך כל client אחר צריך להגדיר קישור מסויים שיריץ את ה svn מהתיקיה. בישביל לעשות זאת אנו נעזר ב Apache עלינו לערוך את הקובץ:

[sourcecode]

$ nano /etc/apache2/mods-available/dav_svn.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* nano הינה פונקציה לעריכת קבצים ישירות בשורת הפקודות.
בעת פתיחת הקובץ אנו נראה המון טקסט, פשוט לרדת עם הסמן הכי למטה ולהוסיף את הקוד הבא:
[sourcecode]
<Location /svn/test>
DAV svn
SVNPath /home/svn/test
AuthType Basic
AuthName "subversion repository"
AuthUserFile /etc/subversion/passwd
Require valid-user
</Location>

הקוד למעלה בעצם אומר לשרת Apache שברגע שנכנסים לקישור לנתיב http://domain.com/svn/test שבעצם יריץ את התוכן של הקבצים מהנתיב שמוגדר ב SVNPath.

ככה אנו יכולים ליצור עוד ועוד פרוייקטים וליצור לכל פרוייקט נתיב משלו, היתרון בזה שאנו יכולים להגביל משתמשים מסויימים לפרוייקטים מסויימים ולא לאפשר לכל משתמש לגשת לכל פרוייקט. כמובן שהקוד למעלה גם מגדיר קובץ שקורא את הסיסמאות שרק אותם משתמשים עם סיסמא יכולים לגשת לנתיב. השורה Require valid-user קובעת שאי אפשר לצפות בקבצים ללא הכנסה של שם משתמש וסיסמא תקינים, ואותו שם משתמש צריך להיות בקובץ etc/subversion/passwd/ כדי שיהיה אפשרות לגשת.

ברגע שיש לנו את הקוד בקובץ אנו צריכים לשמור אותו, בדרך כלל זה נעשה על ידי CTRL + X הוא ישאל אם לשמור את השינויים צריך לבחור ב Y ואז ללחוץ אנטר כדי לשמור על אותו השם. כרגע השינויים נשמרו אך שרת Apache לא מודע לכך, לכן אנו נאתחל אותו

[sourcecode]

$ /etc/init.d/apache2 restart

1
2
3
4
5
6
לבסוף יש ליצור שם משתמש וסיסמא שניתן יהיה לגשת לקבצים תחת התיקיה.
[sourcecode]
$ sudo htpasswd -c /etc/subversion/passwd user_name

כמובן שמבקום user_name יש לכתוב את שם המשתמש הרצוי, לאחר מכן הוא יבקש סיסמא פעמיים.

  • לגבי ה c- יש להוסיף את זה בפעם הראשונה שאתם מריצים את הפקודה, זה בעצם אומר ליצור את הקובץ etc/subversion/passwd/ אחרי ההרצה הראשונה אין צורך בזה.

אם אתם לא בטוחים אילו שמות משתמשים ישנם תוכלו להריץ את הפקודה הבאה שתציג את התוכן של הקובץ של הסיסמאות:

[sourcecode]

$ cat /etc/subversion/passwd

1
2
3
4
5
6
7
8
כעת אפשר לגשת לקבצים ישירות דרך הדפדפן תחת http://domain.com/svn/test הוא כמובן יקפיץ הודעה לשם משתמש וסיסמא שאותם אתם צריכים להזין.
או דרך שורת הפקודות:
[sourcecode]
$ svn co http://domain.com/svn/test test --username user_name
  • הפקודה svn co אומרת לבצע checkout של ה repository לתיקיה test בנתיב בו אנו נמצאים כרגע, לכן רצוי לעשות זאת תחת התקייה בה אתם עובדים כשרת.

כעת יצרתם repository ואתם יכולים לגשת אליה. כל מה שנותר לעשות זה לדעת מה בידיוק אפשר לעשות עם זה.

אז שיטת העבודה היא פשוטה, כל משתמש מבצע checkout לתיקיה בשרת הביתי שלו ב localhost ועובד כרגיל, בכל תיקיה תחת test שיצרנו קודם לכן יהיו תיקיות וקבצים מוסתרים כמו svn. שקיים בכל תיקיה. אותם קבצים לא מפריעים לפעילות העבודה וצריך להתעלם מהם.

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

כל הקבצים והתיקיות תחת הפרוייקט הם מאונדקסים, השם, המיקום, וכן הלאה. לכן אסור למחוק או לשנות את שמם של תיקיות וקבצים תחת הפרוייקט. כל שינוי של שם או מחיקה של קובץ או תיקיה צריך להתבצע ישירות מה client שיש לכם מותקן במחשב. client טוב הינו http://tortoisesvn.tigris.org/

ברגע שתפתחו אותו תצטרכו להוסיף קישור שמכיל repository בתוכו, לאחר מכן הוא מאפשר לכם לקבוע לאן לבצע את ה checkout, כמובן שיש לבצע זאת לתיקיה בה אפשר להריץ את הקבצים כקבצים רגילים (זאת אומרת תחת התיקיה בה אתם מריצים את הסקריפטים שלכם).

כעת אתם יכולים לעבוד על הקבצים, ברגע שבצעתם שינוי בקבצים כלשהם אתם יכולים לעדכן את ה repository על ידי ביצוע commit פשוט סמנו את התיקיה הראשית ובחרו באפשרות של commit, הוא מציג את הקבצים שהשתנו ואת הקבצים החדשים במידה והוספתם ואתם מעוניינים להוסיף אותם גם כן ל repository, ומאפשר לכם להוסיף הערה, תמיד טוב לכתוב משהו כמו “added x file, changed y file” כדי שיהיה מושג מה בידיוק השינוי שבוצע. בכל פעם שמבצעים commit מספר הגרסא של ה repository עולה, מספר זה נקרא revision שזה בעצם אומר גרסא, מה שטוב ב svn הוא שהוא שומר את כל הגרסאות אחורה, אם נעשה שינוי שלא טוב לכם עכשיו אתם יכולים לחזור אחורה לגרסא מסויימת, בנוסף לשלל אפשרויות נוספות כמו לצפות בשינויים שנעשו לכל קובץ לאחרונה, השוואה בין קובץ בגרסא הנוכחית לבין גרסאות קודמות וכן הלאה.

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

לכן זה כל כך חשוב לשנות שם ולמחוק קבצים ותיקיות ישירות דרך התוכנה ולא בעצמכם אחרת יהיו בעיות או כמו שה svn אוהב להציג אותם כ conflicts.

בהרבה מקרים שני משתמשים יעבדו על אותו הקובץ, ברגע שאחד מבצע commit ומעדכן את ה repository השני שעדיין לא בצע commit לא יוכל לבצע עד שלא יבצע update, אם הם עבדו על אותו הקובץ זה שיבצע update יקבל שגיאה בקובץ שהינה conflict, כדי לפתור אותה יש ללחוץ קליק ימני על הקובץ דרך תוכנת ה svn ולבחור ב edit conflicts הוא מציג מסך עם שני הגרסאות, מה שיש למשתמש כרגע במחשב ומה שיש ב repository בשרת, כעת הוא צריך לבחור קטעי קוד שצריך להשתמש בהם בקובץ הסופי שיאוחד, הוא יכול לבחור את הקובץ המלא שלו או החדש או לבחור קטעי קוד. בסיום יש ללחוץ על כפתור השמירה ואז על כפתור V שבעצם אומר resolve conflicts או resolved .

כעת הוא יכול לבצע commit לשינויים שלו הכוללים גם את השינויים שהוא קיבל מה repository שנעשו על ידי המשתמש השני. ככה הוא מאחד את שני הקבצים לאחד ושומר קובץ אחד עם כל השינויים של כולם. שוב זה יקרה רק במידה ושני משתמשים עבדו על אותו הקובץ ואחד עשה commit, בזמן שהשני עשה update .

לסיום, בסופו של דבר אנו רוצים להוציא את כל הקבצים ולעלות לשרת, מה שאני בדרך כלל עושה הוא פשוט עושה checkout בשרת ואז הכל עובד, ובעת הצורך אני מבצע update בשרת כדי לקבל את כל השינויים שעשיתי לוקאלית חוסך לי את הפעולה של ה export שאני יסביר.

** חשוב!! אם הינכם עובדים בשיטה של לבצע checkout בשרת לפרוייקטים ולעדכן בעת הצורך יש להוסיף פקודה ל Apache שלא יציג תוכן של קבצי svn. תחת הנתיב של קבצי השרת (בדרך כלל var/www/) כי אם משהו יגש לנתיב הבא לדוגמא http://domain.com/svn/test/.svn הוא יראה תוכן של ה svn ובחלק מהקבצים שמורים הסיסמאות של אותם משתמשים שנכנסו בעבר לפרוייקט. לדוגמא אם תנסו לגשת לכאן http://he.yiiframework.co.il/.svn/ הוא יציג שגיאה שלא ניתן.

Export או ייצוא מאפשר להוציא את כל הקבצים של הפרוייקט ללא כל התיקיות והקבצים של ה svn (אותם תיקיות svn. שהוזכרו קודם לכן). אם פשוט מעלים את כל התקיה כמו שהיא אז קודם כל המשקל שלה יהיה כפול בגלל כל תיקיות svn. ודבר שני הוא מה שכתבתי פסקה למעלה ב** .

אלו הם בעצם השימושים העיקריים והמרכזיים ב svn לעיתים הוא יכול להיות קצת מטרד אם הרבה עובדים על אותם הקבצים ונוצרים conflicts אבל ברוב המקרים הוא עושה עבודה טובה ומקל על עדכון הקבצים בין השרת הלוקאלי שבו מתבצעת העבודה השוטפת לבין השרת בו הקבצים רצים.

מקווה שזה עזר לכמה מכם שמעוניינים לעבוד בצורה שוטפת יותר.

Share Comments