#!jade °³¹ßÀÚ Á¤º¸ Subversion ´Â open sourceÀÇ ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®·Î, Apache ½ºÅ¸ÀÏÀÇ ¼ÒÇÁÆ®¿þ¾î ¶óÀ̼¾½º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®´Â Ķ¸®Æ÷´Ï¾Æ¿¡ º»°ÅÁö°¡ ÀÖ´Â ¼ÒÇÁÆ®¿þ¾î °³¹ß ȸ»ç CollabNet, Inc., ÀÇ °æÁ¦ÀûÀÎ Áö¿øÀ» ¹Þ°í ÀÖ½À´Ï´Ù. ÀÌ Ä¿¹Â´ÏƼ´Â SubversionÀÇ °³¹ßÀ» µÑ·¯½Î°í ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù¸¸, ÀÌ ÇÁ·ÎÁ§Æ®¿¡ ½Ã°£À» ÇÒ¾ÖÇØ Áְųª ÁÖÀǸ¦ ÇâÇÏ¿© ¹ÞÀ» ¼ö ÀÖ´Â °Í °°Àº ÇüÅ·Π¹«»ó ¿øÁ¶ÇØ ÁÖ´Â »ç¶÷À» Ç×»ó ȯ¿µÇØ ÀÖ½À´Ï´Ù. ÀÚ¿øºÀ»ç´Â ¾î¶² ÇüÅÂÀÇ ¿øÁ¶µµ ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀº, ¹ö±×¸¦ ã¾Æ³»°Å³ª Å×½ºÆ®Çϰųª ¹ú½á ÀÖ´Â Äڵ带 °³·®Çϰųª ¿ÏÀüÈ÷ »õ·Î¿î ±â´ÉÀ» Ãß°¡Çϰųª¶ó°í ÇÑ °ÍÀ» Æ÷ÇÔÇÕ´Ï´Ù. ÀÌ ÀåÀº ¿ø½Ã Äڵ忡 ÀÚ½ÅÀÇ ¼ÕÀ» ½ÇÁ¦·Î ºÓÈ÷´Â °Í¿¡ ÀÇÇØ Subversion ÀÇ Áö±Ý È®½ÇÈ÷ ÀϾ°í ÀÖ´Â ÁøÈ­¸¦ ¿øÈ£ÇÏ·Á°í ÇÏ´Â »ç¶÷À» ÇâÇÑ °ÍÀÔ´Ï´Ù. ¼ÒÇÁÆ®¿þ¾îÀÇ °Í Á» ´õ »ó¼¼ÇÏ°Ô Á¢ÇØ Subversion ÀÚ½ÅÀ» °³¹ßÇϴµ¥ — ȤÀº, Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ ¿ÏÀüÇÏ°Ô »õ·Î¿î ÅøÀ» ¾²±â À§Çؼ­(¶§¹®¿¡) —ÇÊ¿äÇÏ°Ô µÇ´Â ±â¼úÀûÀ¸·Î Áß¿äÇÑ Á¡¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. ¸¸¾à, ±×·± ·¹º§ÀÇ À̾߱⿡ Âü°¡ÇÏ°í ½ÍÁö ¾ÊÀº °ÍÀ̸é, ÀÌ ¾ÆÅ°¶ó´Â ÆÄ°ßÇØ ÁÖ¾î »ó´çÈ÷ ÀÔ´Ï´Ù. SubversionÀÇ À¯Àú·Î¼­ÀÇ °æÇè¿¡´Â ¿µÇâÀ» ÁÖÁö ¾ÊÀ¸¹Ç·Î. °èÃþÈ­ µÈ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ¼³°è SubversionÀº ¸ðµâÈ­µÈ ¼³°è°¡ µÇ¾î ÀÖ¾î, CÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ¸ðÀÓ°ú ÇØ ½ÇÀåµÇ°í ÀÖ½À´Ï´Ù. ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ °¢°¢Àº ÀÚÁÖ(Àß) Á¤ÀÇµÈ ¸ñÀû°ú ÀÎÅÍÆäÀ̽º (À»)¸¦ °¡Áö°í ÀÖ¾î, ´ëºÎºÐÀÇ ¸ðµâÀº ¼¼ °³ÀÇ ÁÖ¿äÇÑ ÃþÀÇ ¾î¶² °ÍÀΰ¡¿¡ ¼ÓÇÕ´Ï´Ù. —ÀúÀå¼Ò(repository)Ãþ, ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþ(RA), ±×¸®°í Ŭ¶óÀ̾ðÆ®ÃþÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Ãþ¿¡ µµÂøÇØ °£´ÜÇÏ°Ô º¸°í °©´Ï´Ù¸¸, ÃÖÃÊ·Î Table 7-1 ¿¡ ÀÖ´Â Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸® À϶÷À» ºÁ ÁÖ¼¼¿ä. ÀÏ°üÇÑ ³íÀÇ¿Í Çϱâ À§ÇÑ(ÇØ), ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â, È®ÀåÀÚ(extension)¸¦ µé¿©´Ù º» Unix ÀÇ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ¸íĪÀ¸·Î ÂüÁ¶Çϱâ·Î ÇÏ°Ú½À´Ï´Ù (¿¹¸¦ µé¾î: libsvn_fs, libsvn_wc, mod_dav_svn). Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ À϶÷ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ¼³¸í libsvn_client Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¿¡ÀÇ ÁÖ¿äÇÑ ÀÎÅÍÆäÀ̽º libsvn_delta Æ®¸®¿Í ÅؽºÆ®ÀÇ Â÷ºÐ routine libsvn_fs SubversionÀÇ ÆÄÀÏ ½Ã½ºÅÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® libsvn_ra ÀúÀå¼Ò(repository) ¾×¼¼½º¸¦ À§ÇÑ °øÅë routine¿Í ¸ðµâ ·Î´õ libsvn_ra_dav WebDAV ÀúÀå¼Ò(repository) ¾×¼¼½º ¸ðµâ libsvn_ra_local ·ÎÄà ÀúÀå¼Ò(repository) ¾×¼¼½º ¸ðµâ libsvn_ra_svn µ¶ÀÚ ÇÁ·ÎÅäÄÝ¿¡ ÀÇÇÑ ÀúÀå¼Ò(repository) ¾×¼¼½º ¸ðµâ libsvn_repos ÀúÀå¼Ò(repository) ÀÎÅÍÆäÀ̽º libsvn_subr ´Ù¾çÇÑ µµ¿òÀÌ µÇ´Â ½áºê·çƾ libsvn_wc ÀÛ¾÷ Ä«ÇÇ °ü¸® ÇÁ·Î±×·¥ ¶óÀ̺귯¸® mod_dav_svn WebDAV Á¶ÀÛÀ» SubversionÀÇ °Í¿¡ ´ëÀÀ Áþ´Â Apache ¸ðµâ
Table 7-1 ¿¡"´Ù¾çÇÑ"¶ó´Â ¸»ÀÌ Çϳª¸¸ ³ª¿Í ÀÖ´Ù´Â °ÍÀº, ÁÁÀº ¼³°èÀÎ Áõ°ÅÀÔ´Ï´Ù. Subversion °³¹ß ÆÀÀº °¢°¢ÀÇ ±â´ÉÀÌ, ¿Ã¹Ù¸£´Ù Ãþ°ú ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡ ÀÖ´Â °ÍÀ» È®ÀÎÇÏ´Â °ÍÀ», Áß¿äÇÑ ÀÏÀ̶ó°í »ý°¢ÇÏ°í ÀÖ½À´Ï´Ù. ¾Æ¸¶, ¸ðµâÈ­ÇÑ ¼³°èÀÇ 1¹ø Å« ÀÌÁ¡Àº °³¹ßÀÚÀÇ °üÁ¡À¸·ÎºÎÅÍ º» º¹ÀâÇÔ (À»)¸¦ ÁÙÀÏ ¼ö°¡ ÀÖ´Â °ÍÀÔ´Ï´Ù. °³¹ßÀڷμ­ ¾Æ¼±¹ÝÀº °ð¹Ù·Î,"À̾߱âÀÇ °³¿ä"¸¦ ¾Ë ¼ö°¡ ÀÖ¾î °Å±â¿¡ µû¶ó ºñ±³Àû °£´ÜÇÏ°Ô ¾î´À ƯÁ¤ÀÇ ±â´ÉÀÇ Àå¼Ò¸¦ ƯÁ¤ ÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. ±×¸®°í, ½ÇÁ¦·Î ´ÜÁö Å« ±×¸²À» ±×¸®´Â °Íº¸´Ùµµ, °³¹ßÀÚ¿¡°Ô"À̾߱âÀÇ °³¿ä"¸¦ ÀüÇÏ´Â µµ¿òÀÌ µÇ´Â °ÍÀº ¹«¾ùÀϱî¿ä? Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®°¡ ¾î¶»°Ô ¼­·Î Á¦ÈÞÇÏ°í ÀÖ´ÂÁö¸¦ ÀÌÇØÇÏ´Â µµ¿òÀ¸·Î¼­ SubversionÀÇ °èÃþµµ, Figure 7-1 ¸¦ ºÁ ÁÖ¼¼¿ä. ÇÁ·Î±×·¥Àº(À¯Àú¿¡ ÀÇÇØ ±âµ¿µÈ µÚ) ÀÌ ±×¸² À§·ÎºÎÅÍ ½ÃÀ۵Ǿî, ¾Æ·¡·Î ÇâÇØ È帨´Ï´Ù.
Subversion ÀÇ °³¿ä
¸ðµâÈ­¿ÜÀÇ ÀÌÁ¡Àº, ÁÖ¾îÁø ¸ðµâÀ» ÄÚµåÀÇ ´Ù¸¥ ºÎºÐ¿¡ ¿µÇâ ÁÖ´Â °Í ¾øÀÌ , °°Àº API¸¦ ½ÇÀåÇÑ »õ·Î¿î ÇÁ·Î±×·¥ ¶óÀ̺귯¸®·Î ¿Å°Ü³õ´Â °ÍÀÌ ÇÒ ¼ö ÀÖ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù. ¾î¶² Àǹ̷ΠÀÌ°ÍÀº Subversion ³»ºÎ¿¡¼­ ¹ú½á ÀϾ ÀÖ´Â °ÍÀÔ´Ï´Ù. libsvn_ra_dav, libsvn_ra_local, ±×¸®°í libsvn_ra_svn ÀÇ ¸ðµç °ÍÀº, °°Àº ÀÎÅÍÆäÀ̽º¸¦ ½ÇÀåÇÏ°í ÀÖ½À´Ï´Ù. ±×¸®°í, ÀÌ 3°³(»ì) ¸ðµÎ ÇÏÁö¸¸, ÀúÀå¼Ò(repository)Ãþ°ú ±³È¯ÇÕ´Ï´Ù. — libsvn_ra_dav ¿Í libsvn_ra_svn ´Â ³×Æ®¿öÅ© ³Ñ¾î·Î ±×·¸°Ô ÇÏ°í, libsvn_ra_local ´Â Á÷Á¢ ÀúÀå¼Ò(repository)¿¡ Á¢¼ÓÇÕ´Ï´Ù. Ŭ¶óÀ̾ðÆ® Àڽŵµ ¶Ç SubversionÀÇ ¼³°è¿¡¼­ÀÇ ¸ðµâ¼ºÀ» ºÐ¸íÈ÷ °¡¸®Å°°í ÀÖ½À´Ï´Ù. SubversionÀº ÇöÀç·Î¼­´Â Ä¿¸àµå ¶óÀΠŬ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¸¸À» ½ÇÀåÇÏ°í ÀÖ½À´Ï´Ù¸¸, SubversionÀ» À§Çؼ­(¶§¹®¿¡) GUI·Î¼­ ÇൿÇÑ´Ù °°Àº ¼­µå ÆÄƼ¿¡ ÀÇÇØ °³¹ßµÇ°í ÀÖ´Â ¸î°³ÀÇ ÇÁ·Î±×·¥ÀÌ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ GUIµµ, ¹ú½á ½ÇÀåµÇ°í ÀÖ´Â Ä¿¸àµå Ŭ¶óÀ̾ðÆ® (¿Í)°ú °°Àº API¸¦ ÀÌ¿ëÇÕ´Ï´Ù. SubversionÀÇ libsvn_client ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â Subversion Ŭ¶óÀ̾ðÆ®¸¦ ¼³°èÇϴµ¥ ÇÊ¿äÇÑ ´ëºÎºÐÀÇ ±â´ÉÀ» À§Çؼ­(¶§¹®¿¡) ÀÌ¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. (ÂüÁ¶). ÀúÀå¼Ò(repository)Ãþ SubversionÀÇ ÀúÀå¼Ò(repository)ÃþÀ» ÂüÁ¶ÇÒ ¶§, ÀϹÝÀûÀ¸·Î, µÎ °³ÀÇ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡ ´ëÇØ ¸»ÇÏ°í ÀÖ½À´Ï´Ù—ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿Í ÆÄÀÏ ½Ã½ºÅÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â ¹öÀü °ü¸®µÈ µ¥ÀÌÅÍÀÇ ´Ù¾çÇÑ ¸®ºñÀü (À»)¸¦ À§ÇÑ °Ý³³°ú º¸°íÀÇ ±¸Á¶¸¦ Á¦°øÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ ÃþÀº ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþ (À»)¸¦ °æÀ¯ÇØ Å¬¶óÀ̾ðÆ®Ãþ°ú ¿¬°áµÇ¾î ÀÖ¾î, Subversion ÀÌ¿ëÀڷκÎÅÍ º¸¸é(ÀÚ), "Åë½ÅÀÇ »ó´ëÆí"¿¡ ÀÖ´Â °ÍÀ¸·Î º¸ÀÔ´Ï´Ù. SubversionÀÇ ÆÄÀÏ ½Ã½ºÅÛÀº libsvn_fs API¿¡ ÀÇÇØ ¾×¼¼½º µÇ¾î operating system¿¡ ÀνºÅç µÇ°í ÀÖ´Â Ä¿³Ú ·¹º§ÀÇ Àǹ̿¡¼­ÀÇ ÆÄÀÏ ½Ã½ºÅÛ(LinuxÀÇ ext2 ³ª, NTFS¿Í °°ÀÌ)ÀÌ ¾Æ´Ï°í, °¡»óÀûÀÎ ÆÄÀÏ ½Ã½ºÅÛÀÔ´Ï´Ù. "ÆÄÀÏ"°ú"µð·ºÅ丮"¸¦ (ÀÚ½ÅÀÌ ÁÁ¾ÆÇÏ´Â Á¶°¡ºñ¸¦ »ç¿ëÇØ Á¶ÀÛÇÒ ¼ö°¡ ÀÖ´Â °Í °°Àº) Çö½ÇÀÇ ÆÄÀÏ°ú µð·ºÅ丮·Î¼­ º¸Á¸ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¿¬±¸ ÃÖÁ¾ ´Ü°èÀÇ º¸Á¸ÀÇ ±¸Á¶·Î¼­ µ¥ÀÌŸº£À̽º ½Ã½ºÅÛÀ» »ç¿ëÇÕ´Ï´Ù. ÇöÀç, ÀÌ¿ëÇÒ ¼ö ÀÖ´Â µ¥ÀÌŸº£À̽º ½Ã½ºÅÛÀº Berkeley DBÀÔ´Ï´Ù. Berkeley DB ÀÇ ¼±ÅÃÀº, Subversion°¡ ÇÊ¿ä·Î ÇÏ°í ÀÖ´Â ¸î°³ÀÇ ÀÚµ¿ÀûÀÎ ±â´ÉÀÌ ÀÖ½À´Ï´Ù. ±×°ÍÀº, µ¥ÀÌÅÍ ÀÏ°ü¼º, ºÒ°¡ºÐÀÇ ±âÀÔ ±â´É, º¹±¸ °¡´É¼º, ¿Â¶óÀÎ ¹é¾÷, µîÀÔ´Ï´Ù. ±×·¯³ª, SubversionÀÇ ÇâÈÄÀÇ ¸±¸®½º Áß(¾È)¿¡¼­ °³¹ß Ä¿¹Â´ÏƼ¿¡ ÀÇÇØ Èï¹Ì¸¦ ´ç±â°í ÀÖ´Â, ´Ù¸¥ ¿¬±¸ ÃÖÁ¾ ´Ü°è µ¥ÀÌŸº£À̽º ½Ã½ºÅÛÀÇ ÀÌ¿ë °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¿ÀÇ µ¥ÀÌŸº£À̽º Ä¿³ØƼºñƼ- (ODBC) µîÀÔ´Ï´Ù. libsvn_fs °¡ Á¦°øÇÏ´Â ÆÄÀÏ ½Ã½ºÅÛ API´Â ´Ù¸¥ ÆÄÀÏ ½Ã½ºÅÛ API ±×·¸Áö¸¸ ±â´ëÇÒ ¼ö ÀÖ´Â °Í °°Àº ±â´ÉÀ» °¡Áö°í ÀÖ´Â: ÆÄÀÏÀ̳ª µð·ºÅ丮ÀÇ ÀÛ¼ºÀ̳ª »èÁ¦¸¦ ÇÒ ¼ö ÀÖ¾î, Ä«Çdzª, À̵¿À» ÇÒ ¼ö ÀÖ¾î ÆÄÀÏÀÇ ³»¿ëÀ» ¼öÁ¤ÇÒ ¼ö°¡ ÀÖ¾î, µî µîÀÔ´Ï´Ù. ³Ê¹« ÀϹÝÀûÀÌÁö ¾Ê´Â °Í °°Àº ±â´Éµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ºÎ¼ö Çß´Ù ¸ÞŸµ¥ÀÌŸ("¼Ó¼º")ÀÇ Ãß°¡, º¯°æ, »èÁ¦, µîÀÔ´Ï´Ù. ÇÑÃþ ´õ Subversion ÆÄÀÏ ½Ã½ºÅÛÀº ¹öÀüÈ­ °¡´ÉÇÑ ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î, ÀÌ°ÍÀº, µð·ºÅ丮 Æ®¸®·Î º¯°æÀ» ´õÇϸé(ÀÚ), SubversionÀº ±× º¯°æ ÀÌÀü¿¡, ±× Æ®¸®°¡ ¾î¶»°Ô º¸Àϱ ±â¾ïÇØ µÐ´Ù°í ÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ±×¸®°í, ÇÑÃþ ´õ ±× ÀüÀÇ º¯°æÀü, ÇÑÃþ ´õ ±× Àü, µîÀÔ´Ï´Ù. ÀÌ¿Í °°ÀÌ ÇØ, ÆÄÀÏ ½Ã½ºÅÛ¿¡ ¹«¾ùÀΰ¡¸¦ ÃÖÃÊ·Î Ãß°¡Çߴµ¥±îÁöÀÇ ¸ðµç ¹öÀüÀ¸·Î µ¹¾Æ¿Ã ¼ö°¡ ÀÖ½À´Ï´Ù. Æ®¸®¿¡ °¡¼¼ÇÑ ¸ðµç º¯°æÀº SubversionÀÇ Æ®·£Àè¼Ç(transaction) Áß(¾È)¿¡¼­ ½ÇÇà µË´Ï´Ù. ÀÌÇÏ´Â, ÆÄÀÏ ½Ã½ºÅÛÀ» ¼öÁ¤Çϱâ À§ÇÑ ´Ü¼øÇÏ°í ÀϹÝÀûÀÎ ¼ö¼ÓÀÔ´Ï´Ù: Subversion Æ®·£Àè¼Ç(transaction)ÀÇ °³½Ã ¼öÁ¤ÀÇ ½ÇÇà(Ãß°¡, »èÁ¦, ¼Ó¼ºÀÇ ¼öÁ¤, µî) Æ®·£Àè¼Ç(transaction)ÀÇ Ä¿¹Ô Æ®·£Àè¼Ç(transaction)¸¦ Ä¿¹ÔÇϸé(ÀÚ), ÆÄÀÏ ½Ã½ºÅÛÀÇ º¯°æÀº ¿ª»ç»óÀÇ »ç°ÇÀ¸·Î¼­ ¿µ±¸È÷ ±â·ÏµË´Ï´Ù. ÀÌ·¯ÇÑ °¢°¢ÀÇ »çÀÌŬÀº Æ®¸®¿¡ »õ·Î¿î ¸®ºñÀüÀ» ¸¸µé¾î, °¢°¢ÀÇ ¸®ºñÀüÀº"ÀÖ´Â °ÍÀÌ ¾î´À °°¾Ò´Â°¡"¶ó°í ÇÏ´Â ¼ø¼öÇÑ snapshot·Î ÇÏ°í ÀÖ°í °³¿¡¼­µµ ¾×¼¼½º ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. Æ®·£Àè¼Ç(transaction)¸¦ ¹æÇØ ÇÏ´Â °Í SubversionÀÇ Æ®·£Àè¼Ç(transaction)¶ó°í ÇÏ´Â °³³äÀº, ƯÈ÷, ±×°Í°ú ¸Å¿ì °¡±î¿î ÀǹÌÀÇ libsvn_fs ¿¡ ÀÖ´Â µ¥ÀÌŸº£À̽ºÀÇ ½ÇÁ¦ÀÇ ÄÚµå (À»)¸¦ º¸¿©Áö¸é(ÀÚ), µ¥ÀÌŸº£À̽º ÀÚ½ÅÀÌ ¼­Æ÷Æ®ÇÏ°í ÀÖ´Â Æ®·£Àè¼Ç(transaction)¿Í ¿ëÀÌÇÏ°Ô È¥¶õÇØ ¹ö¸³´Ï´Ù. ¾çÂÊ ¸ðµÎ, ºÒ°¡ºÐ¼º°ú ºÐ¸®¼ºÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ¹Ù²Ù¾î ¸»Çϸé(ÀÚ), Æ®·£Àè¼Ç(transaction)´Â Àִ ó¸®ÀÇ ¸ðÀÓÀ»,"ÀüÀΰ¡, ¹«Àΰ¡" ±×·¸´Ù°í ÇÏ´Â ÇüÅ·Π½ÇÇàÇÏ´Â ´É·ÂÀ» ÁÝ´Ï´Ù—±× ¸ðÀӾȿ¡ ÀÖ´Â ¸ðµç 󸮴Â, ¿ÏÀüÇÏ°Ô ¼º°øÇÏ´ÂÁö,¾Æ¹«°ÍµµÀϾÁö ¾Ê¾Ò´ÂÁöÀÇ °°°Ô ´Ù·ç¾îÁý´Ï´Ù—±×¸®°í, Æ®·£Àè¼Ç(transaction)Áß¿¡, ±× µ¥ÀÌÅÍ¿¡ ´Ù¸¥ 󸮸¦ ÇÏ´Â ÇÁ·Î¼¼½º¿¡´Â ÀÏÀý °£¼·ÇÏÁö ¾Ê½À´Ï´Ù. µ¥ÀÌÅͺ£ÀÕ Æ®·»¼½¼ÇÀº ÀϹÝÀûÀ¸·Î, µ¥ÀÌŸº£À̽º ÀÚ½ÅÀÇ µ¥ÀÌÅÍÀÇ ¼öÁ¤¿¡ °ü°èÇÑ ÀÛÀº ¸î°³ÀÇ Á¶ÀÛÀ» Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù. (¿¹¸¦ µé¾î, Å×À̺íÇàÀÇ ³»¿ëÀ» ¼öÁ¤ÇÏ´Â °Í µîÀÔ´Ï´Ù). SubversionÀÇ Æ®·£Àè¼Ç(transaction)´Â, Á» ´õ Å« ¹üÀ§ÀÇ °ÍÀ¸·Î, ±×°ÍÀº, ÆÄÀÏ ½Ã½ºÅÛ Æ®¸®ÀÇ ´ÙÀ½ÀÇ ¸®ºñÀüÀ¸·Î¼­ °Ý³³µÇ´Â °ÍÀ» ¸ñÀûÀ¸·Î ÇÑ, ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ´ëÇÑ ¸î°³ÀÇ ¼öÁ¤À» ÇÑ´Ù °°Àº Á¶ÀÛÀ» Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù. È¥¶õÀÌ ¾øÀ» °Í °°´Ù¸é, ÀÌ·¸°Ô »ý°¢ÇØ ÁÖ¼¼¿ä: SubversionÀº Subversion Æ®·£Àè¼Ç(transaction)ÀÇ »ý¼ºÁß¿¡, µ¥ÀÌÅͺ£ÀÕ Æ®·»¼½¼Ç (À»)¸¦ »ç¿ëÇÕ´Ï´Ù(±×·¡¼­, ¸¸¾à Subversion Æ®·£Àè¼Ç(transaction)ÀÇ »ý¼ºÀÌ ½ÇÆÐÇϸé, µ¥ÀÌŸº£À̽º´Â ÃÖÃʺÎÅÍ ±× »ý¼ºÀ» ÇÏÁö ¾Ê´Â °Íó·³ º¸ÀÔ´Ï´Ù) ÆÄÀÏ ½Ã½ºÅÛ API ÀÌ¿ëÀÚ¿¡°Ô ÀÖ¾î Çà¿îÀÇ ÀÏ·Î, µ¥ÀÌŸº£À̽º ½Ã½ºÅÛ Àڽſ¡ ÀÇÇØ ÁغñµÇ¾î ÀÖ´Â Æ®·£Àè¼Ç(transaction) ¼­Æ÷Æ®´Â, ´ëºÎºÐÀÇ °æ¿ì ¼û¾î ÀÖ¾î º¸ÀÌÁö ¾Ê½À´Ï´Ù. (º¸Åë ¸ðµâÈ­µÈ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ¼³°è·ÎºÎÅÍ ±â´ëµÇ´Â °ÍÀÔ´Ï´Ù¸¸). ÆÄÀÏ ½Ã½ºÅÛ ÀÚ½ÅÀÇ ½ÇÀåÀ» °³½ÃÇÏ´Â °æ¿ì¿¡ óÀ½, ±×·¯ÇÑ ÀÏÀÌ º¸ÀÌ°Ô(ȤÀº Èï¹Ì·Ó°Ô »ý°¢µÇ°Ô) µË´Ï´Ù. ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º¿¡ ÀÇÇØ ÁغñµÇ´Â ±â´ÉÀÇ ´ëºÎºÐÀº ÆÄÀÏ ½Ã½ºÅÛ Æнº¿¡ ´ëÇؼ­ ÀϾ´Â Á¶ÀÛÀ¸·Î¼­ Á¦°øµË´Ï´Ù. Áï, ÆÄÀÏ ½Ã½ºÅÛÀÇ ¿ÜºÎ·ÎºÎÅÍ´Â, ÆÄÀÏÀ̳ª µð·ºÅ丮ÀÇ °³º°ÀÇ ¸®ºñÀüÀ» ±â¼úÇØ, ¾×¼¼½º ÇÏ´Â, ÁÖ¿ä ¾øÀ½ ½ÖÀº,/foo/bar (¿Í)°ú °°Àº Æнº ij¸¯ÅÍ ¶óÀÎÀ» »ç¿ëÇÏ´Â °ÍÀ» ÅëÇؼ­ Á¦°øµÇ¾î ±×°ÍÀº Á¤È®È÷, ´ç½ÅÀÌ Á¤µç Á¶°¡ºñ ÇÁ·Î±×·¥À» ÅëÇؼ­ ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ¾×¼¼½º ÇÑ´Ù °°Àº ±âºÐÀÌ µì´Ï´Ù. ÀûÀýÇÑ Æнº ¸íºÐÀ» ¼¼¿ö ÀÖ°í API ÇÔ¼ö¿¡ °Ç³×ÁÖ´Â °Í¿¡ ÀÇÇØ, »õ·Î¿î ÆÄÀÏÀ̳ª µð·ºÅ丮¸¦ Ãß°¡ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. °°Àº ±¸Á¶¸¦ »ç¿ëÇØ ±× ÆÄÀÏ µî¿¡ °ü°èÇÑ Á¤º¸¸¦ ¹®ÀÇÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ ÆÄÀÏ ½Ã½ºÅÛ°ú´Â ´Þ¶ó, Æнº¸¸À» ÁöÁ¤ÇÏ´Â °ÍÀº, Subversion ÀÇ ÆÄÀÏÀ̳ª µð·¹Æ®Å©¸®¸¦ ƯÁ¤Çϴµ¥ ÃæºÐÇÑ Á¤º¸°¡ ¾Æ´Õ´Ï´Ù. µð·ºÅ丮 Æ®¸®¸¦ ÀÌÂ÷¿øÀÇ ½Ã½ºÅÛÀ̶ó°í »ý°¢ÇØ ÁÖ¼¼¿ä. ¿©±â¼­, ¾î´À ³ëµåÀÇ ÇüÁ¦´Â, ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÏ´Â °ÍÀ» Ç¥ÇöÇÏ°í ÀÖ¾î, »çºêµð·¹Æ®Å©¸®¿¡ ³»·Á °£´Ù ÀÇ´Â, ¾Æ·¡·Î ÇâÇÑ À̵¿ÀÌ´Ù°í »ý°¢ÇØ ÁÖ¼¼¿ä. Figure 7-2 ´Â ÀüÇüÀûÀÎ Æ®¸®ÀÇ Ç¥ÇöÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
ÀÌÂ÷¿ø¾ÈÀÇ ÆÄÀÏ°ú µð·ºÅ丮
¹°·Ð SubversionÀÇ ÆÄÀÏ ½Ã½ºÅÛÀº ¼ûÀº Á¦£³ Â÷¿øÀ» °¡Áö°í ÀÖ½À´Ï´Ù¸¸, ±×°ÍÀº ´ëºÎºÐÀÇ ÆÄÀÏ ½Ã½ºÅÛÀÌ °¡Áö°í ÀÖÁö ¾ÊÀº °ÍÀÔ´Ï´Ù—±×°ÍÀº ½Ã°£ÀÇ Â÷¿øÀÔ´Ï´Ù! ¿ì¸®´Â, ½Ã°£Àº ½ÇÁ¦·Î´ÂÁ¦£´ Â÷¿øÀÌ´Ù ±×·¸´Ù°í ÇÏ´Â ÀλóÀ» Âß °¡Áö°í ÀÖ´ø SFÆÄÀÏ¿¡ ¼îÅ©¸¦ Áشٰí ÇÏ´Â °ÍÀ» ÀÌÇØÇÏ°í ÀÖ°í, ´Ù¸¥ ÀÌ·ÐÀ» ¿ì¸®°¡ ¼±¾ðÇÏ´Â °Í¿¡ ÀÇÇØ »ý±ä´Ù ½É¸®ÀûÀÎ Æ®¶ó¿ì¸¶¿¡ ´ëÇؼ­´Â »ç°úÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º·Î,path Àμö¸¦ °¡Áö´Â °ÅÀÇ ¸ðµç ÇÔ¼ö´Â ¶Çroot Àμöµµ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ÀÌsvn_fs_root_t Àμö´Â, ¸®ºñÀüÀΰ¡, SubversionÀÇ Æ®·£Àè¼Ç(transaction)(±×°ÍÀº º¸ÅëÀº ¸®ºñÀü µÇ¾î¾ß ÇÒ ¹°°ÇÀÔ´Ï´Ù)ÀÇ ¾î´À ÂÊÀÎÁö¸¦ ³ªÅ¸³», ¸®ºñÀü 32ÀÇ/foo/bar ¶ó°í ¸®ºñÀü 98ÀÇ °°Àº Æнº¿ÍÀÇ »çÀÌÀÇ Â÷À̸¦ ÀÌÇØÇϴµ¥ ÇÊ¿äÇÏ°Ô µÇ´Â »ïÂ÷¿ø ¹®¸ÆÀ» ÁغñÇÕ´Ï´Ù. Figure 7-3 ´Â Subversion ÆÄÀÏ ½Ã½ºÅÛÀÇ ¿ìÁÖ ¿¡ Ãß°¡µÈ Â÷¿ø¿¡ ´ëÇÑ ¸®ºñÀü È÷½ºÅ丮¸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
¸®ºñÀü ½Ã°¢—Á¦£³ Â÷¿ø!
ÀÌÀü ÁöÀûÇÑ °Íó·³, libsvn_fs API ´Â ´Ù¸¥ ÆÄÀÏ ½Ã½ºÅÛ°ú ¿Ü°üÀº ÀÚÁÖ(Àß)¿¡¼­ ÀÖÁö¸¸, ÀÌ ÈǸ¢ÇÑ ¹öÀü °ü¸® ´É·Â¸¸Àº ¿¹¿ÜÀÔ´Ï´Ù. ±×°ÍÀº ¹öÀü ÆÄÀÏ ½Ã½ºÅÛ¿¡ Èï¹Ì°¡ ÀÖ´Â ¸ðµç ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇØ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï(µíÀÌ) ¼³°èµÇ¾ú½À´Ï´Ù. ¿ì¿¬ÀÇ ÀÏÄ¡°¡ ¾Æ´Õ´Ï´Ù¸¸, Subversion Àڽŵµ ±× ±â´É¿¡ Èï¹Ì°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª, ÆÄÀÏ ½Ã½ºÅÛ API (Àº)´Â ±âº»ÀûÀÎ ÆÄÀÏ°ú µð·ºÅ丮ÀÇ ¹öÀü °ü¸®¸¦ ¼­Æ÷Æ®ÇÏ°í ÀÖ½À´Ï´Ù¸¸ SubversionÀº ÇÑÃþ ´õ ´ëºÎºÐÀ» ¿ä±¸ÇÕ´Ï´Ù—±×¸®°í ±×°ÍÀº libsvn_repos °¡ Á¦°øÇÏ´Â °ÍÀÔ´Ï´Ù. Subversion ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®(libsvn_repos)´Â ±âº»ÀûÀ¸·Î´Â ÆÄÀÏ ½Ã½ºÅÛ ±â´ÉÀÇ ÁÖÀ§¿¡ ÀÖ´Â ·¡ÆÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÔ´Ï´Ù. ÀÌ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â ÀúÀå¼Ò(repository) ·¹À̾ƿôÀÇ ÀÛ¼º, ÆÄÀÏ ½Ã½ºÅÛÀÇ ÃʱâÈ­¸¦ ¿Ã¹Ù¸£°Ô ½ÇÇàÇÏ´Â °Í, µî¿¡ Ã¥ÀÓÀ» °¡Áý´Ï´Ù. Libsvn_repos ´Â ¶Ç ÈÅÀ» ½ÇÀåÇմϴٗƯÁ¤ÀÇ Ã³¸®°¡ ½ÇÇàµÉ ¶§ ÀúÀå¼Ò(repository)ÀÇ Äڵ忡 ÀÇÇØ ½ÇÇàµÇ´Â ½ºÅ©¸³Æ®ÀÔ´Ï´Ù. ÀÌ °°Àº ¶õ ÅëÁö, ÀÎÁõ, ȤÀº ÀúÀå¼Ò(repository) °ü¸®ÀÚ°¡ ¹Ù¶ó´Â °Í °°Àº ´Ù¾çÇÑ ¸ñÀû¿¡ ÀÖ¾î µµ¿òÀÌ µÇ´Â °ÍÀÔ´Ï´Ù. ÀÌ Å¸ÀÔÀÇ ±â´É°ú ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ¿¡ ÀÇÇØ Á¦°øµÇ´Â °Í ¿ÜÀÇ À¯Æ¿¸®Æ¼´Â ¹öÀüÈ­ ÆÄÀÏ ½Ã½ºÅÛ ÀÇ ½ÇÀå¿¡ °­ÇÏ°Ô °ü·ÃÇÏ°í ÀÖ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ±×°ÍÀÌ µ¶ÀÚÀûÀÎ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®·Î¼­ ½ÇÀåµÈ ÀÌÀ¯ÀÔ´Ï´Ù. libsvn_repos API¸¦ »ç¿ëÇÏ·Á°í ÇÏ´Â °³¹ßÀÚ¿¡°Ô´Â, ±×°ÍÀÌ ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º ¿¡ ´ëÇÑ ¿ÏÀüÇÑ ·¡ÆÛ°¡ ¾Æ´Ñ °ÍÀ» ¾Ë°ÚÁö¿ä. Áï, ÆÄÀÏ ½Ã½ºÅÛ Á¶ÀÛÀÇ ÀϹÝÀûÀÎ »çÀÌŬ¿¡ ÀÖ´Â ÁÖ¿äÇÑ À̺¥Æ®¿¡ ºÙ¾î¸¸ ÀúÀå¼Ò(repository) ÀÎÅÍÆäÀ̽º¿¡ ÀÇÇØ ·¦ µË´Ï´Ù. ±× ¾ÈÀÇ ¸î°³Àΰ¡´Â, Subversion Æ®·£Àè¼Ç(transaction)ÀÇ »ý¼ºÀ̳ª Ä¿¹Ô, ¸®ºñÀü ¼Ó¼ºÀÇ ¼öÁ¤ µîÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Æ¯Á¤ÀÇ À̺¥Æ®´Â °Å±â¿¡ °ü·ÃÇÑ ÈÅÀÌ ÀÖ±â (À§ÇØ)¶§¹®¿¡, ÀúÀå¼Ò(repository)Ãþ¿¡ ÀÇÇØ ·¦ µË´Ï´Ù. Àå·¡ÀûÀ¸·Î´Â ´Ù¸¥ À̺¥Æ®µµ ÀúÀå¼Ò(repository) API¿¡ ÀÇÇØ ·¦ µÉÁöµµ ¾Ë·ÁÁöÁö ¾Ê½À´Ï´Ù. ±×·¯³ª, ³ª¸ÓÁöÀÇ ÆÄÀÏ ½Ã½ºÅÛÀÇ ÀÛ¿ëÀÇ ¸ðµç °ÍÀº libsvn_fs API (¿Í)°ú ÇÔ²² Á÷Á¢ ½ÇÇàµË´Ï´Ù. ¿¹¸¦ µé¾î, µð·ºÅ丮°¡ Ãß°¡µÇ´Â ÆÄÀÏ ½Ã½ºÅÛÀÇ »õ·Ó´Ù ¸®ºñÀüÀ» ¸¸µé±â À§ÇÑ, ÀúÀå¼Ò(repository)¿Í ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º ¿¡ ºÙ¾î, »ç¿ë¹ýÀ» ¼³¸íÇÑ Äڵ尡 ÀÖ½À´Ï´Ù. ÀÌ ¿¹·Î(±×¸®°í, ÀÌ º»Àüü¸¦ ÅëÇؼ­ ¸ðµç ´Ù¸¥ ¿¹¿¡¼­µµ), SVN_ERR ¸ÅÅ©·Î´Â ´ÜÁö ·¦ ÇÑ ÇÔ¼ö·ÎºÎÅÍÀÇ ½ÇÆÐÇßÀ» °æ¿ìÀÇ ¿¡·¯ ÄÚµåÀÇ Ã¼Å©ÀÔ´Ï´Ù. ±×¸®°í ±×·¯ÇÑ °Í (ÀÌ)°¡ ÀÖÀ¸¸é ±× ¿¡·¯¸¦ µ¹·ÁÁÝ´Ï´Ù. ÀúÀå¼Ò(repository)ÃþÀÇ ÀÌ¿ë /* Create a new directory at the path NEW_DIRECTORY in the Subversion repository located at REPOS_PATH. Perform all memory allocation in POOL. This function will create a new revision for the addition of NEW_DIRECTORY. */ static svn_error_t * make_new_directory (const char *repos_path, const char *new_directory, apr_pool_t *pool) { svn_error_t *err; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict_str; /* Open the repository located at REPOS_PATH. */ SVN_ERR (svn_repos_open (&repos, repos_path, pool)); /* Get a pointer to the filesystem object that is stored in REPOS. */ fs = svn_repos_fs (repos); /* Ask the filesystem to tell us the youngest revision that currently exists. */ SVN_ERR (svn_fs_youngest_rev (&youngest_rev, fs, pool)); /* Begin a new transaction that is based on YOUNGEST_REV. We are less likely to have our later commit rejected as conflicting if we always try to make our changes against a copy of the latest snapshot of the filesystem tree. */ SVN_ERR (svn_fs_begin_txn (&txn, fs, youngest_rev, pool)); /* Now that we have started a new Subversion transaction, get a root object that represents that transaction. */ SVN_ERR (svn_fs_txn_root (&txn_root, txn, pool)); /* Create our new directory under the transaction root, at the path NEW_DIRECTORY. */ SVN_ERR (svn_fs_make_dir (txn_root, new_directory, pool)); /* Commit the transaction, creating a new revision of the filesystem which includes our added directory path. */ err = svn_repos_fs_commit_txn (&conflict_str, repos, &youngest_rev, txn); if (! err) { /* No error? Excellent! Print a brief report of our success. */ printf ("Directory '%s' was successfully added as new revision " "'%" SVN_REVNUM_T_FMT "'. \n", new_directory, youngest_rev); } else if (err->apr_err == SVN_ERR_FS_CONFLICT)) { /* Uh-oh. Our commit failed as the result of a conflict (someone else seems to have made changes to the same area of the filesystem that we tried to modify). Print an error message. */ printf ("A conflict occurred at path '%s' while attempting " "to add directory '%s' to the repository at '%s'. \n", conflict_str, new_directory, repos_path); } else { /* Some other error has occurred. Print an error message. */ printf ("An error occurred while attempting to add directory '%s' " "to the repository at '%s'. \n", new_directory, repos_path); } /* Return the result of the attempted commit to our caller. */ return err; } ÀÌ ÄÚµå·Î, ÀúÀå¼Ò(repository)¿Í ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽ºÀÇ ¾çÂÊ ¸ðµÎ¿¡ ´ëÇϴ ȣÃâÀÌ ÀÖ½À´Ï´Ù. svn_fs_commit_txn¸¦ »ç¿ëÇØ Æ®·£Àè¼Ç(transaction)¸¦ °£´ÜÇÏ°Ô Ä¿¹ÔÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª, ÆÄÀÏ ½Ã½ºÅÛ API´Â ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ÈÅÀÇ ±¸Á¶¿¡ ´ëÇؼ­´Â ¾Æ¹«°Íµµ ¸ð¸¨´Ï´Ù. ¸¸¾à Subversion ÀúÀå¼Ò(repository)¿¡ Æ®·£Àè¼Ç(transaction)¸¦ Ä¿¹Ô ÇÒ ¶§¸¶´Ù ÀÚµ¿ÀûÀ¸·Î ¾î¶² Á¾·ùÀÇ ºñSubversionÀûÀÎ ÀÛ¾÷À» ½ÇÇà½ÃÅ°°í ½ÍÀº °æ¿ì, (¿¹¸¦ µé¾î, °³¹ßÀÚ ¸ÞÀϸµ¸®½ºÆ®¿¡ ±× Æ®·£Àè¼Ç(transaction)·Î ÀϾ ¸ðµÎ º¯°æÀ» ¼³¸íÇÏ´Â email ¸¦ ¼Û½ÅÇÏ´Â, µî), ±× ÇÔ¼öÀÇ libsvn_repos·Î ·¦ µÈ ¹öÀüÀ» »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù — svn_repos_fs_commit_txn. ÀÌ ÇÔ¼ö´Â ½ÇÁ¦·Î´Â ¸¸¾à Á¸ÀçÇϸé, ÃÖÃÊ·Î"pre-commit"Ç«½º Ŭ¸³Æ®¸¦ ½ÇÇàÇØ, ±×¸®°í Æ®·£Àè¼Ç(transaction)¸¦ Ä¿¹ÔÇØ, ¸¶Áö¸·¿¡"post-commit"Ç«½º Ŭ¸³Æ® (À»)¸¦ ½ÇÇàÇÕ´Ï´Ù. ÈÅÀº, ½ÇÁ¦·Î´Â ÄÚ¾îÀÇ ÆÄÀÏ ½Ã½ºÅÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÀڽŠ¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â Ưº°ÇÑ º¸°íÀÇ ±¸Á¶¸¦ ÁغñÇÕ´Ï´Ù. (SubversionÀÇ ÀúÀå¼Ò(repository) ÈÅ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ °ÍÀº(À»)¸¦ ºÁ ÁÖ¼¼¿ä). ÈÅÀÇ ±¸Á¶´Â, ³ª¸ÓÁöÀÇ ÆÄÀÏ ½Ã½ºÅÛ ÄÚµå·ÎºÎÅÍ µ¶¸³ÇÑ ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ Ãß»óÈ­°¡ ÇϳªÀÇ ÀÌÀ¯ÀÔ´Ï´Ù. libsvn_repos API ´Â ±× ¹Û¿¡µµ ¸î°³ÀÇ Áß¿äÇÑ À¯Æ¿¸®Æ¼¸¦ Subversion¿¡ Á¦°øÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ°Í¿¡´Â ÀÌÇÏ¿Í °°Àº °ÍÀÌ ÀÖ½À´Ï´Ù: Subversion ÀúÀå¼Ò(repository)¿Í °Å±â¿¡ Æ÷ÇԵǴ ÆÄÀÏ ½Ã½ºÅÛ»ó¿¡¼­ÀÇ ÆÄÀÏÀÇ »ý¼º, ¿ÀÇÂ, »èÁ¦, ±×¸®°í ȸº¹ÀÇ ½ºÅÜ µÎ ÆÄÀÏ ½Ã½ºÅÛ Æ®¸®°£ÀÇ ºñ±³ÀÇ Ç¥½Ã ÆÄÀÏ ½Ã½ºÅÛÁß¿¡¼­ ¼öÁ¤µÈ ÆÄÀÏÀÌ ÀÖ´Â ¸ðµÎ(ȤÀº ¸î°³ÀÇ)ÀÇ ¸®ºñÀü¿¡ °áÇÕµÈ Ä¿¹Ô ·Î±× ¸Þ¼¼Áö¿¡ÀÇ ¹®ÀÇ ÆÄÀÏ ½Ã½ºÅÛÀÇ °¡µ¶ÀÎ"´ýÇÁ"ÀÇ »ý¼º, ÆÄÀÏ ½Ã½ºÅÛÁß¿¡ ÀÖ´Ù ¸®ºñÀüÀÇ ¿ÏÀüÇÑ Ç¥Çö ´ýÇÁ Æ÷¸ËÀÇ Çؼ®, ´Ù¸¥ Subversion ÀúÀå¼Ò(repository)¾È¿¡ ´ýÇÁ µÈ ¸®ºñÀüÀ» ·ÎµåÇÏ´Â °Í Subversion°¡ °è¼Ó ÁøÈ­ÇÏ´Â °Í¿¡ µû¶ó, ÀúÀå¼Ò(repository) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â °è¼Ó Áõ°¡ÇÏ´Â ±â´É°ú ¼³Á¤ °¡´ÉÇÑ ¿É¼ÇÀ» ¼­Æ÷Æ®¸¦ Á¦°øÇÑ´Ù À§ÇØ(¶§¹®¿¡), ÆÄÀÏ ½Ã½ºÅÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿Í ÇÔ²² °è¼Ó °ú ÇÔ²² Ä¿Áø´Ù ±×·¸Áö.
ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþ ¸¸¾à Subverson ÀúÀå¼Ò(repository)ÃþÀÌ,"Åë½Å·ÎÀÇ ÀÌÁ¦(¹ú½á) ÇÑÆíÀÇ ´Ü Á¡" ÀÌ´Ù¸é, ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþÀº, ±× Åë½Å·Î±× ÀÚüÀÇ °ÍÀÔ´Ï´Ù. Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿Í ÀúÀå¼Ò(repository) ÀÇ »çÀÌ¿¡ µ¥ÀÌÅ͸¦ »óÈ£ º¯È¯ÇÏ´Â °ÍÀ» ºÎ°úµÈ ÀÌ ÃþÀº libsva_ra¸ðµâ ·Î´õ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®, ±× RA¸ðµâ ÀÚ½Å(ÇöÀç·Î¼­´Â, libsvn_ra_dav, libsvn_ra_local, ±×¸®°í libsvn_ra_svn¸¦ Æ÷ÇÔÇÕ´Ï´Ù), ±×¸®°í Çϳª ÀÌ»óÀÇ RA ¸ðµâ¿¡ ÇÊ¿äÇÑ Ãß°¡ ÀÇ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®, ¿¹¸¦ µé¾î, libsvn_ra_dav °¡ Åë½ÅÇϱâ À§ÇÑ , mod_dav_svn Apache ¸ðµâÀ» Æ÷ÇÔÇÕ´Ï´Ù. mod_dva_svn ¸ðµâÀ» ÀÌ¿ëÇÏÁö ¾ÊÀ» ¶§¿¡´Â, libsvn_ra_svn ÀÇ ¼­¹öÀÎsvnserve°¡ Åë½ÅÇÕ´Ï´Ù. SubversionÀº, ÀúÀå¼Ò(repository) ¸®¼Ò½º¸¦ ƯÁ¤Çϴµ¥ URL¸¦ ÀÌ¿ëÇϹǷÎ, URL schemaÀÇ ÇÁ·ÎÅäÄݺÎ(º¸ÅëÀº,file:, http:, https:, ȤÀº svn:)´Â ¾î´À RA ¸ðµâÀÌ Åë½ÅÀ» ó¸®ÇÒ±î (À»)¸¦ °áÁ¤Çϱâ À§Çؼ­(¶§¹®¿¡) »ç¿ëµË´Ï´Ù. °¢°¢ÀÇ ¸ðµâÀº, ÇÁ·ÎÅäÄÝÀÇ ¸®½ºÆ® (À»)¸¦ µî·ÏÇÕ´Ï´Ù¸¸, ±×°ÍÀº ¾î¶»°Ô À̾߱âÇϸé ÁÁÀº°¡¸¦ ¾Ë°í ÀÖÀ¸¹Ç·Î, RA ·Î´õ°¡ ½ÇÇà½Ã¿¡ ¾î´À RA¸ðµâÀ» ±× 󸮸¦ À§Çؼ­(¶§¹®¿¡) ÀÌ¿ëÇұ °áÁ¤ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¾î´À RA¸ðµâÀÌ Subversion Ä¿¸àµå ¶óÀΠŬ¶óÀ̾ðÆ®¿¡ ÀÌ¿ë °¡´ÉÇÑ°¡¸¦ °áÁ¤ÇÒ ¼ö°¡ ÀÖ¾îsvn --version (À»)¸¦ ½ÇÇàÇÏ´Â °ÍÀ¸·Î, ¾î´À ÇÁ·ÎÅäÄÝÀº ¼­Æ÷Æ®ÇÏ°í ÀÖÁö ¾Ê´Ù°í ¸»ÇØ ¿Ã±î (À»)¸¦ ¾Ë ¼ö°¡ ÀÖ½À´Ï´Ù. : $ svn --version svn, version 0.25. 0 (dev build) compiled Jul 18 2003, 16:25:59 Copyright (C) 2000-2003 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ The following repository access (RA) modules are available: * ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol. - handles 'http' schema * ra_local : Module for accessing a repository on local disk. - handles 'file' schema * ra_svn : Module for accessing a repository using the svn network protocol. - handles 'svn' schema RA-DAV (HTTP/DAV¸¦ »ç¿ëÇÑ ÀúÀå¼Ò(repository) ¾×¼¼½º) libsvn_ra_dav ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â, ¼­¹ö¿Í´Â ´Ù¸¥ ¸Ó½Å»ó¿¡¼­ ½ÇÇàµÇ°í Àִ Ŭ¶óÀ̾ðÆ®¿¡ ÀÇÇØ ÀÌ¿ëµÇµµ·Ï(µíÀÌ) ¼³°èµÇ°í ÀÖ½À´Ï´Ù. Ŭ¶óÀ̾ðÆ®´Â URL¸¦ »ç¿ëÇØ µµ´ÞÇÒ ¼ö°¡ Àִ ƯÁ¤ÀÇ ¸Ó½ÅÀÌ´Ù ±× ¼­¹ö¿Í Åë½ÅÇÕ´Ï´Ù. ¿©±â¼­ ¸»ÇÏ´Â URL´Â,http: ¶Ç´Â https: ÀÇ ÇÁ·ÎÅäÄÝ ºÎºÐÀ» Æ÷ÇÔÇÏ°í ÀÖ´Â °Í °°Àº °ÍÀÔ´Ï´Ù. ¾î¶»°Ô ÀÌ ¸ðµâÀÌ µ¿ÀÛÇÏ´ÂÁö¸¦ ÀÌÇØÇϱâ À§Çؼ­, ÃÖÃÊ·Î ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþÀÇ Æ¯Á¤ÀÇ ¼³Á¤Áß¿¡ ÀÖ´Â °Í ¿ÜÀÇ ¸î°³ÀÇ Å° ÄÄÆÛ³ÍÆ®¿¡ Á¢ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù—±×°ÍÀº °­·ÂÇÑ Apache HTTP ¼­¹ö¿Í Neon HTTP/WebDAV Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÔ´Ï´Ù. SubversionÀÇ ÁÖµÈ ³×Æ®¿öÅ© ¼­¹ö´Â Apache HTTP ¼­¹öÀÔ´Ï´Ù. Apache ´Â ÃæºÐÈ÷ Å×½ºÆ®µÇ¾î È®Àå °¡´ÉÇÑ open sourceÀÇ ¼­¹ö ÇÁ·Î¼¼½º·Î, ±×°ÍÀº ¼º½ÇÇÑ ¿ëµµ¿¡ ÀÌ¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀº ³×Æ®¿öÅ©ÀÇ °íºÎÇÏ¿¡ À¯ÁöÇÒ ¼ö°¡ ÀÖ¾î ¸¹Àº Ç÷§Æû»ó¿¡¼­ µ¿ÀÛÇÕ´Ï´Ù. Apache ¼­¹ö´Â ¸¹Àº ´Ù¸¥ Ç¥ÁØ ÀÎÁõ ÇÁ·ÎÅäÄÝÀ» ¼­Æ÷Æ®ÇØ, ¸¹Àº »ç¶÷µé¿¡ ÀÇÇØ ¼­Æ÷Æ®µÈ ¸ðµâÀ» ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î È®ÀåÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀº ¶Ç ³×Æ®¿öÅ© ÆÄÀÌÇÁ¶óÀÎÀ̳ª ij½Ì (¿Í)°ú °°Àº ÃÖÀûÈ­¸¦ ¼­Æ÷Æ®ÇÏ°í ÀÖ½À´Ï´Ù. ¼­¹ö·Î¼­ Apache ¸¦ ÀÌ¿ëÇÏ´Â °Í¿¡ µû¶ó¼­, SubversionÀº ÀÌ·¯ÇÑ ¸ðµç ±â´ÉÀ» ÀÚÀ¯·Ó°Ô ¼Õ¿¡ ³Ö´Â °ÍÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í, (Á¤µµ)¸¸Å­ ¾î´À ÆÄÀÌ¾î ¿ù(fire wall)´Â HTTPÀÇ Åë½ÅÀ» ÅëÇϵµ·Ï(µíÀÌ) ¼³Á¤µÇ¾î ÀÖÀ¸¹Ç·Î, ½Ã½ºÅÛ °ü¸® Ã¥ÀÓÀÚ´Â, º¸ÅëÀº ÆÄÀÌ¾î ¿ù(fire wall) ¼³Á¤ (À»)¸¦ º¯°æÇÒ ÇÊ¿äÁ¶Â÷ ¾ø°Ô SubversionÀ» µ¿ÀÛ½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù. SubversionÀº HTTP¿Í WebDAV(DeltaV µ¹ÃâÇÏ°í)¸¦ »ç¿ëÇØ, Apache ¼­¹ö¿Í Åë½ÅÇÕ´Ï´Ù. ÀÌ°Í¿¡ ´ëÇؼ­´Â, ÀÌ ÀåÀÇ WebDAVÀÇ ¸¶µð¸¦ ºÒ·¯ ÁÖ¼¼¿ä. ±×·¯³ª, °£´ÜÇÏ°Ô ¸»Çϸé, WebDAV¿Í DeltaV ´Â Ç¥ÁØÀûÀÎ HTTP1. 1 ÇÁ·ÎÅäÄÝ ÀÇ È®ÀåÀ¸·Î, ±×°ÍÀº web»ó¿¡¼­ ÆÄÀÏÀÇ °øÀ¯¿Í ¹öÀüÈ­¸¦ °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù. Apache 2.0 Àº mod_dav °¡ ÁغñµÇ¾î ÀÖ¾î, ÀÌ°ÍÀº HTTP ÀÇ DAV È®ÀåÀ» ÀÌÇØÇÏ´Â ¸ðµâÀÔ´Ï´Ù. Subversion ÀÚ½ÅÀº mod_dav_svn ¸¦ ¼­Æ÷Æ®ÇØ ÀÖ½À´Ï´Ù¸¸, ÀÌ°ÍÀº ´Ù¸¥ Apache ¸ðµâ·Î, mod_dav ¿Í ÇùÁ¶ÇØ µ¿ÀÛÇØ, (½ÇÁ¦·Î´Â ±× ¿¬±¸ ÃÖÁ¾ ´Ü°è·Î¼­) Subversion»ó¿¡¼­ÀÇ ±¸Ã¼ÀûÀÎ WebDAV¿Í DeltaVÀÇ ½ÇÀåÀÌ µÇ°í ÀÖ½À´Ï´Ù. HTTP ³Ñ¾î·Î ÀúÀå¼Ò(repository)¿Í Åë½ÅÇÒ ¶§, RA·Î´õ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â libsvn_ra_dav ¸¦ ¼­¹ö ÇÁ·Î¼¼½º ¸ðµâ·Î¼­ ¼±ÅÃÇÕ´Ï´Ù. Subversion Ŭ¶óÀ̾ðÆ®´Â ÀϹÝÀûÀÎ RA ÀÎÅÍÆäÀ̽º¸¦ È£ÃâÇØ, libsvn_ra_dav ´Â ÀÌ·¯ÇÑ È£ÃâÀ»(±×°ÍÀº ¾ÆÁ÷ ´ë·«ÀûÀÎ SubversionÀÇ µ¿ÀÛÀ» ±¸Ã¼È­ÇÕ´Ï´Ù)À», HTTP/WebDAV ¿ä±¸·Î º¯È¯ÇÕ´Ï´Ù. Neon ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇØ, libsvn_ra_dav (Àº)´Â ÀÌ·¯ÇÑ ¿ä±¸¸¦ Apache ¼­¹ö¿¡ ¼Û½ÅÇÕ´Ï´Ù. Aapche ´Â ÀÌ·¯ÇÑ ¿ä±¸ (À»)¸¦ ¹Þ¾Æ(Web ºê¶ó¿ìÀú°¡ ÇÏ´Â °Í°ú ¿ÏÀüÈ÷ °°Àº ÀϹÝÀûÀÎ HTTP ¿ä±¸ÀÔ´Ï´Ù¸¸), DAV °ü¸®ÀÇ À§Ä¡·Î¼­ ¼³Á¤µÈ URL¿¡ µ¹¸®°í( httpd.confÆÄÀÏÁßÀÇ Location ÀνºÆ®·°¼ÇÀ» »ç¿ëÇÕ´Ï´Ù), ±× ¿ä±¸¸¦ °íÀ¯ÀÇ mod_dav ¸ðµâ¿¡ °Ç³×ÁÝ´Ï´Ù. ÀûÀýÈ÷ ¼³Á¤µÇ¾î ÀÖÀ¸¸é, mod_dav (Àº)´Â Apache ºÎ¼ÓÀÇ ÀϹÝÀûÀÎ mod_dav_fs °¡ ¾Æ´Ï°í, SubversionÀÇ mod_dav_svn ¸¦ ÆÄÀÏ ½Ã½ºÅÛ¿¡ °ü·ÃÇÑ ¿ä±¸¿¡ ´ëÇؼ­ ÀÌ¿ëÇÏ´Â °ÍÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ±×·¡¼­, ¸¶Áö¸·¿¡´Â, ÀÌ Å¬¶óÀ̾ðÆ®´Â mod_dav_svn ¿Í Åë½ÅÇÕ´Ï´Ù¸¸, ÀÌ°ÍÀº Á÷Á¢ Subversion ÀúÀå¼Ò(repository)Ãþ¿¡ ¹­¾î ÷ºÎ ºÙ¾î ÀÖ´Ù ¹°°ÇÀÔ´Ï´Ù. ÀÌ°ÍÀÌ ½ÇÁ¦·Î ÀϾ´Â ±³È¯ÀÇ °£·«È­ÇÑ ¼³¸íÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, Subversion ÀúÀå¼Ò(repository)´Â ApacheÀÇ ÀÎÁõ ÀνºÆ®·°¼Ç¿¡ ÀÇÇØ º¸È£µÇ°í ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. ÀÌ°Í¿¡ ÀÇÇØ, ÀúÀå¼Ò(repository)¿Í ÃÖÃÊ·Î Åë½ÅÇÏ·Á°í ÇÏ´Â ½Ãµµ°¡, ÀÎÁõ ºÙ¾î ÀÖ´Â Apache¿¡ µû¶ó¼­ ½ÇÆп¡ ³¡³¯Áöµµ ¸ð¸¨´Ï´Ù. ÀÌ ½ÃÁ¡¿¡¼­, libsvn_ra_dav´Â ¾ÆÆÄÄ¡·ÎºÎÅÍ, ºÒÃæºÐÇÑ ÀÎÁõ ¹Û¿¡ ¾òÀ» ¼ö ¾ø¾ú±â ¶§¹®¿¡ Ŭ¶óÀ̾ðÆ®Ãþ¿¡ °»½ÅµÈ ÀÎÁõ µ¥ÀÌÅ͸¦ ÃëµæÇϱâ À§Çؼ­ Äݹé Çß´Ù, ¶ó°í ÇÏ´Â ÅëÁö¸¦ ¹Þ½À´Ï´Ù. ¸¸¾à ÀÌ µ¥ÀÌÅÍ°¡ ¿Ã¹Ù¸£°Ô ÃëµæÇÒ ¼ö ÀÖÀ¸¸é, À¯Àú´Â, Çã°¡µÈ ÃÖÃÊÀÇ Á¶ÀÛ (À»)¸¦ ½ÇÇàÇÏ´Â, libsvn_ra_davÀÇ ´ÙÀ½ÀÇ ¾ÆÅä¹ÍÀÎ ¿ä±¸¸¦ ã¾Æ, ¸ðµÎ ÇÏÁö¸¸ Àߵ˴ϴÙ. ¸¸¾à ÃæºÐÇÑ ÀÎÁõ Á¤º¸°¡ ÁÖ¾îÁöÁö ¾ÊÀ¸¸é ¿ä±¸´Â ÃÖÁ¾ÀûÀ¸·Î ½ÇÆÐÇØ, Ŭ¶óÀ̾ðÆ®´Â À¯Àú¿¡°Ô ±× ÃëÁö¸¦ º¸°íÇÕ´Ï´Ù. Neon¿Í Apache¸¦ »ç¿ëÇØ, SubversionÀº ´Ù¸¥ ¿©·¯°¡Áö º¹ÀâÇÑ area¿¡ÀÇ ÀÚÀ¯·Î¿î ±â´ÉÀ» ¾òÀ» ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¸¸¾à Neon°¡ OpenSSL ÇÁ·Î±×·¥ ¶óÀ̺귯¸® (À»)¸¦ ã¾Æ³ÂÀ» °æ¿ì, ±×°ÍÀº Subversion Ŭ¶óÀ̾ðÆ®¿¡ SSL·Î ¾ÏȣȭµÇ¾ú´Ù Åë½ÅÀ», Apache ¼­¹ö·Î ÇÏ´Â °ÍÀ» ÀÎÁ¤ÇÕ´Ï´Ù. (±× °íÀ¯ÀÇ mod_ssl ´Â"±× ¾ð¾î¸¦ À̾߱âÇÕ´Ï´Ù"). ¶Ç, Neon ÀڽŰú ApacheÀÇ mod_deflate´Â"deflate"¾Ë°í¸®ÁòÀ» ÀÌÇØÇÒ ¼ö ÀÖÀ¸¹Ç·Î( PKZIP¿Í gzip ÇÁ·Î±×·¥À¸·Î ÀÌ¿ëµÇ°í ÀÖ´Â °Í°ú °°Àº °ÍÀÔ´Ï´Ù¸¸), ¿ä±¸´Â º¸´Ù ÀÛÀº ¾ÐÃàµÈ µ¢¾î¸®·Î¼­ Åë½Å·Î¸¦ È帨´Ï´Ù. Subversiont°¡ ÇâÈÄ ¼­Æ÷Æ®ÇÏ°í ½Í´Ù°í »ý°¢ÇÏ°í ÀÖ´Â °Í ¿ÜÀÇ º¹ÀâÇÑ ±â´É (À¸)·Î¼­´Â, ÀÚµ¿ÀûÀ¸·Î ¼­¹öÃøÀÇ ¸®µð·ºÆ®¸¦ ó¸®ÇÏ´Â °Í(¿¹¸¦ µé¾î, ÀúÀå¼Ò(repository)°¡ ´Ù¸¥ »õ·Î¿î URL·Î À̵¿ÇÑ °Í °°Àº °æ¿ì)³ª, HTTP ÆÄÀÌÇÁ¶óÀÎ ÀÇ ÇýÅÃÀ» ¹Þ´Â °Í, µîÀÔ´Ï´Ù. RA-SVN (°íÀ¯ÀÇ ÇÁ·ÎÅäÄÝ¿¡ ÀÇÇÑ ÀúÀå¼Ò(repository) ¾×¼¼½º) Ç¥ÁØÀûÀÎ HTTP/WebDAV ÇÁ·ÎÅäÄÝ¿¡ °¡¼¼ÇØ, SubversionÀº °íÀ¯ÀÇ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ´Â RAÀÇ ½ÇÀåµµ ÁغñÇØ ÀÖ½À´Ï´Ù. libsvn_ra_svn ¸ðµâÀº °íÀ¯ÀÇ ³×Æ®¿öÅ© ¼ÒÄÏ Á¢¼ÓÀ» ½ÇÀåÇØ, ÀúÀå¼Ò(repository)°¡ ÀÖ´Â ½ºÅĵå¾ó·Ð ¼­¹ö (¿Í)°ú Åë½ÅÇÏ´Â —svnserveÀÔ´Ï´Ù — Ŭ¶óÀ̾ðÆ®´Âsvn:// schema·Î ÀúÀå¼Ò(repository)¿¡ ¾×¼¼½º·Î ¿É´Ï´Ù. ÀÌ RA ½ÇÀåÀº, ÀüÀÇ ¸¶µð·Î Á¢ÇÑ ApacheÀÇ ÀÌÁ¡ÀÇ ´ëºÎºÐÀÌ ºÎÁ·ÇÏ°í ÀÖ½À´Ï´Ù. ±×·¯³ª, ±×°ÍÀº ¾î¶² Á¾·ùÀÇ ½Ã½ºÅÛ °ü¸® Ã¥ÀÓÀÚ¸¦ ²ø¾î´ç±æÁöµµ ¸ð¸¨´Ï´Ù. ±×°ÍÀº ¸Å¿ì °£´ÜÇÏ°Ô ¼³Á¤ÇØ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. svnserve ÇÁ·Î¼¼½ºÀÇ ¼³Á¤Àº, °ÅÀÇ ¼ø°£ÀûÀ¸·Î ³¡³³´Ï´Ù. ¶Ç ±×°ÍÀº Apacheº¸´Ù (ÄÚµåÇà¼ö¶ó°í ÇÏ´Â Àǹ̷Î) ÈξÀ ÀÛ°í, ½ÃÅ¥·¯Æ¼³ª ´Ù¸¥ »çÁ¤¿¡ ÀÇÇѴ٠üũµµ ÈξÀ ¿ëÀÌÇÕ´Ï´Ù. ÇÑÃþ ´õ ¸î°³ÀÇ ½Ã½ºÅÛ °ü¸® Ã¥ÀÓÀÚ´Â ¹ú½á SSH ÀÇ ½ÃÅ¥·¯Æ¼ ÀÎÇÁ¶ó¸¦ °¡Áö°í ÀÖ¾î, Subversion¿¡µµ ±×°ÍÀ» »ç¿ëÇÏ°Ô ÇÏ°í ½Í´Ù (ÀÌ)¶ó°í »ý°¢ÇÏ°í ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. ra_svn ¸¦ »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®´Â SSH ¸¦ °³ÀÔ½ÃÄÑ ÇÁ·ÎÅäÄÝÀ» °£´ÜÇÏ°Ô ÅͳΠÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. RA-Local (ÀúÀå¼Ò(repository)¿¡ÀÇ Á÷Á¢ÀûÀÎ ¾×¼¼½º) Subversion ÀúÀå¼Ò(repository)¿ÍÀÇ ¸ðµç Åë½ÅÀÌ Å« ¼­¹ö ÇÁ·Î¼¼½º¿Í ³×Æ®¿öÅ©Ãþ (À»)¸¦ ÇÊ¿ä·Î ÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ·ÎÄà µð½ºÅ© ¿ì¿¡³ë ÀúÀå¼Ò(repository)¿¡ ¾×¼¼½º ÇÏ°í ½ÍÀº °Í»ÓÀÇ À¯Àú¿¡°Ô À־´Â,file: ¸¦ »ç¿ëÇÒ ¼ö°¡ ÀÖ¾î libsvn_ra_local°¡ Á¦°øÇÏ´Â ±â´ÉÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ RA ¸ðµâÀº Á÷Á¢ ÀúÀå¼Ò(repository)¿Í ÆÄÀÏ ½Ã½ºÅÛ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿Í °áÇյǹǷÎ, ³×Æ®¿öÅ© Åë½ÅÀº ÀüÇô ÇÊ¿ä ¾ø½À´Ï´Ù. SubversionÀºfile: URLÀÇ ÀϺημ­ localhost Àΰ¡, ÇÏ´ÃÀ» ÀÎ ¼­¹ö ¸íĪÀ» Æ÷ÇÔÇÏ´Â °ÍÀ» ¿ä±¸ÇØ, Æ÷Åä ÁöÁ¤Àº ¾ø½À´Ï´Ù. ¸»Åõ¸¦ ¹Ù²Ù¸é(ÀÚ), URL´Â ¹«¾ùÀΰ¡, file://localhost/path/to/repos Àΰ¡ file:///path/to/repos (¿Í)°ú °°Àº ÇüÅÂÀÇ °ÍÀÌ µË´Ï´Ù. °Ô´Ù°¡ SubversionÀÇfile:URL´Â º¸Åë web ºê¶ó¿ìÀú°¡ file:URL°¡ ÇÏ´Â ¹æ¹ý¿¡¼­´Â ÀÌ¿ëÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. Åë»óÀÇ web ºê¶ó¿ìÀú·Î file:URL¸¦ ¿­¶÷ÇÏ·Á°í ¸»ÇÒ ¶§, ÆÄÀÏ ½Ã½ºÅÛÀ» Á÷Á¢ Á¶»çÇÏ´Â °ÍÀ¸·Î ±× ÀÚ¸®¼Ò¿¡ ÀÖ´Â ÆÄÀÏÀÇ ³»¿ëÀ» Àоîµé¿© Ç¥½ÃÇÕ´Ï´Ù. ±×·¯³ª, SubversionÀÇ ¸®¼Ò½º´Â °¡»ó ÆÄÀÏ ½Ã½ºÅÛÁß¿¡ ÀÖ¾î, (ÂüÁ¶) ´ç½ÅÀÇ ºê¶ó¿ìÀú´Â ±× ÆÄÀÏ ½Ã½ºÅÛÀ» ¾î¶»°Ô ÀÐÀ¸¸é ÁÁÀº°¡ ÀÌÇØÇÒ ¼ö ¾øÀ» °ÍÀÔ´Ï´Ù. Your RA Library Here ÇÑÃþ ´õ ´Ù¸¥ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇØ SubversionÀÇ ÀúÀå¼Ò(repository)¿¡ ¾×¼¼½º ÇÏ°í ½ÍÀ¸¸é ¸»ÇÏ´Â »ç¶÷¿¡°Ô ÀÖ¾î¾ß¸¸, ¾î°¼­ ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþÀÌ ¸ðµâÈ­µÇ°í ÀÖ´Ù ÀϱîÇÏ°í ¸»ÇÏ´Â ÀÌÀ¯°¡ µË´Ï´Ù. °³¹ßÀÚ´Â ´Ù¸¥ ÇÑÂÊÀ¸·Î RA ÀÎÅÍÆäÀ̽º¸¦ ½ÇÀåÇÑ´Ù »õ·Î¿î ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ °£´ÜÇÏ°Ô ¾µ ¼ö°¡ ÀÖ¾î ÀÌÁ¦(¹ú½á) ÇÑÆíÀ¸·Î ±× ÀúÀå¼Ò(repository)¿Í Åë½ÅÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. »õ·Î¿î ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â ÀÌ¹Ì Á¸ÀçÇÏ°í ÀÖ´Â ³×Æ®¿öÅ© ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÒ ¼öµµ ÀÖ°í, ½º½º·Î °³¹ßÇÑ °ÍÀÌ¶óµµ ÁÁ½À´Ï´Ù. ÇÁ·Î¼¼½º°£ Åë½Å(IPC) È£ÃâÀ» »ç¿ëÇÒÁöµµ ¸ð¸£Áö¾Ê°í—Á¶±Ý ¹Ùº¸ ÀÏÁöµµ ¾Ë·ÁÁöÁö ¾Ê½À´Ï´Ù¸¸—e-mail º£À̽ºÀÇ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ´Â °Íµµ ÇÒ ¼ö ÀÖ½À´Ï´Ù. SubversionÀº API¸¦ Á¦°øÇØ, ´ç½ÅÀº ÀÚ½ÅÀÇ »ó»ó¼ºÀ» Á¦°øÇÑ´Ù, ¶ó°í. Ŭ¶óÀ̾ðÆ®Ãþ Ŭ¶óÀ̾ðÆ®Ãø¿¡¼­ º¸¸é(ÀÚ), SubversionÀÇ ÀÛ¾÷ Ä«ÇÇ´Â ¸ðµç 󸮰¡ ÀϾ´Â Àå¼ÒÀÔ´Ï´Ù. Ŭ¶óÀ̾ðÆ®Ãø ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡ ÀÇÇØ ½ÇÀåµÇ´Â ±â´ÉÀº, ÀÛ¾÷ Ä«ÇÇÀÇ °ü¸®¶ó°í ÇÏ´Â ´Ù¸¸ ÇϳªÀÇ ¸ñÀûÀ¸·Î À§ÇØ(¶§¹®¿¡) Á¸ÀçÇÕ´Ï´Ù—·ÎÄÃÀÎ Àå¼Ò¿¡ ÇϵîÀÇ ÇüÅ·ΠÁ¦°øµÈ´Ù ÆÄÀÏ°ú ´Ù¸¥ ¼­ºê µð·ºÅ丮°¡ ÀÖ´Â µð·ºÅ丮°¡, Çϳª ÀÌ»óÀÇ ÀúÀå¼Ò(repository) À§Ä¡¸¦ ¹Ý¿µÇÑ °ÍÀ¸·Î ÇØ, ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþ°úÀÇ »çÀÌÀÇ º¯°æÀ» ÀüÇϰųª ÇÕ´Ï´Ù. SubversionÀÇ ÀÛ¾÷ Ä«ÇÇ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®, libsvn_wc ´Â ÀÛ¾÷ Ä«ÇÇÁßÀÇ µ¥ÀÌÅÍÀÇ °ü¸®¿¡ Á÷Á¢ÀûÀΠåÀÓÀ» Áý´Ï´Ù. ÀÌ°ÍÀ» Çϱâ À§Çؼ­(¶§¹®¿¡), ÀÌ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® (Àº)´Â Ưº°ÇÑ ¼­ºê µð·ºÅ丮¾È¿¡ °¢°¢ÀÇ ÀÛ¾÷ Ä«ÇÇ¿¡ ´ëÇÑ °ü¸® Á¤º¸ (À»)¸¦ °Ý³³ÇÕ´Ï´Ù. ÀÌ ¼­ºê µð ·ºÅä´Â. svn ¶ó°í ÇÑ´Ù À̸§ÀÔ´Ï´Ù¸¸, ¾î´À ÀÛ¾÷ Ä«ÇÇÁß¿¡µµ Á¸ÀçÇØ, °ü¸®¿¡ °ü°èÇÑ µ¿ÀÛÀ» Çϱâ À§ÇÑ »óŸ¦ ±â·ÏÇØ, ÀÛ¾÷ ½ºÆäÀ̽º¸¦ È®º¸Çϱâ À§ÇÑ ´Ù¾çÇÑ ÆÄÀÏÀ̳ª µð·ºÅ丮¸¦ Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù. CVS¿¡ Ä£¼÷ÇÔÀÌ ÀÖ´Â »ç¶÷À̶ó¸é, ÀÌ. svn ¼­ºê µð·ºÅ丮´Â, ±× ¸ñÀûÀ¸·Î ÇØ CVSÀÇ ÀÛ¾÷ Ä«ÇÇ¿¡ ÀÖ´Â °ü¸® µð·ºÅ丮CVS ¿¡ Àß ºñ½ÁÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù°í »ý°¢ÇÕ´Ï´Ù. . svn °ü¸® area¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ °ÍÀº, ÀÌ ÀåÀÇ (À»)¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä Subversion Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸® libsvn_client ´Â ±¤¹üÀ§ÀÇ ¿ªÇÒÀ» Áý´Ï´Ù. ±× ÀÏÀº, ÀÛ¾÷ Ä«ÇÇ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ±â´É°ú ÀúÀå¼Ò(repository) ¾×¼¼½ºÃþ ÀÇ ±â´ÉÀ» ¹­´Â °ÍÀ¸·Î, ÀϹÝÀûÀÎ ¸®ºñÀü Á¦¾î¸¦ ½ÇÇàÇÏ°í ½Í´Ù°í »ý°¢ÇÑ´Ù ¸ðµç ¾îÇø®ÄÉÀ̼ǿ¡ ÃÖ»óÁ¤µµÀÇ API¸¦ Á¦°øÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î svn_client_checkout ÇÔ¼ö´Â Àμö·Î¼­ URL¸¦ ÃëÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â URL¸¦ RAÃþ¿¡ ³ª, ƯÁ¤ÀÇ ÀúÀå¼Ò(repository)¿¡ ÀÎÁõµÇ¾ú´Ù ¼¼¼ÇÀ» ¿±´Ï´Ù. ±×¸®°í ±× ÀúÀå¼Ò(repository)¿¡ ƯÁ¤ÀÇ Æ®¸®¸¦ ÁöÁ¤ÇØ, ÀÌ Æ®¸®¸¦ ÀÛ¾÷ Ä«ÇÇ ¶óÀ̺귯¸®¿¡ º¸³À´Ï´Ù¸¸, À̹øÀº ±× ÇÁ·Î±×·¥ ¶óÀ̺귯¸®°¡ ÀÛ¾÷ Ä«ÇÇ Àüü¸¦ µð½ºÅ©¿¡ ±âÀÔÇÕ´Ï´Ù(. svn µð·ºÅ丮¸¦ Æ÷ÇÔÇÑ ¸ðµç Á¤º¸). Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â ¾î¶°ÇÑ ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅ͵µ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù °°°Ô ¼³°èµÇ°í ÀÖ½À´Ï´Ù. SubversionÀÇ ¿ø½Ã ÄÚµå´Â Ç¥ÁØÀûÀÎ Ä¿¸àµå ¶óÀΠŬ¶óÀ̾ðÆ®¸¦ Æ÷ÇÔÇÏ°í ÀÖÀ¸¹Ç·Î, ±× Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ À§¿¡ ÁÁ¾ÆÇÒ »Ó(¸¸Å­) GUI Ŭ¶óÀ̾ðÆ®¸¦ ¾µ ¼ö°¡ ÀÖ½À´Ï´Ù. SubversionÀÇ »õ·Î¿î GUI(ȤÀº ½ÇÁ¦·Î´Â »õ·Î¿î Ŭ¶óÀ̾ðÆ®)´Â, Ä¿¸àµå ¶óÀΠŬ¶óÀ̾ðÆ®¸¦ Æ÷ÇÔÇÑ ÃÌƼ ÀÖ°í ·¡ÆÛÀÏ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. —±×°ÍÀº, libsvn_client API ¸¦ ÅëÇؼ­ Ä¿¸àµå ¶óÀΠŬ¶óÀ̾ðÆ® ÇÏÁö¸¸ »ç¿ëÇÏ°í ÀÖ´Â °Í°ú °°Àº ±â´É, µ¥ÀÌÅÍ, ÄݹéÀÇ ±¸Á¶¿¡ ¿ÏÀüÇÏ°Ô ¾×¼¼½º ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Á÷Á¢ÀûÀÎ ¹ÙÀεå—Á¤È®ÇÔ¿¡ ´ëÇÑ ¸» ¿Ö GUI ÇÁ·Î±×·¥Àº, Á÷Á¢ libsvn_client ¿¡ ¹ÙÀεå ÇØ, Ä¿¸àµå ¶óÀÎ ÇÁ·Î±×·¥À» °¨½Î´Â ·¡Æ۷μ­ µ¿ÀÛÇÏÁö ¾Ê´Â °ÍÀϱî¿ä? ±×°ÍÀº ´ÜÁöº¸´Ù È¿À²ÀûÀ̱⠶§¹®ÀÌ´Ù¶ó´Â °Í¸¸À¸·Î´Â ¾ø°í, ÀáÀçÀûÀÎ Á¤È®ÇÔ¿¡ ´ëÇÑ ¹®Á¦µµ ÀÖ½À´Ï´Ù. Ä¿¸àµå ¶óÀÎ ÇÁ·Î±×·¥(Subversion°¡ Á¦°øÇÏ°í ÀÖ´Â °Í °°Àº ¹°°Ç)Àº Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡ ÀÌ¾î ºÙ¾î ÀÖ½À´Ï´Ù¸¸, C¾ð¾îÀÇ ÇüŸ¦ °¡Áö´Â Çǵå¹é°ú µ¥ÀÌÅÍ ºñÆ®ÀÇ ¿ä±¸¸¦, Àΰ£ÀÌ ÀÐÀ» ¼ö ÀÖ´Â ÇüÅÂÀÇ Ãâ·Â¿¡ È¿À²ÀûÀ¸·Î º¯È¯ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ ¼ÕÀÇ º¯È¯Àº ºÎÁ¤È®ÇÏ°Ô µÇ±â ½±»óÀÔ´Ï´Ù. Áï, ÇÁ·Î±×·¥Àº API (À¸)·ÎºÎÅÍ ÃëµæÇÑ Á¤º¸ÀÇ ¸ðµç °ÍÀ» Ç¥½ÃÇÏÁö ¾ÊÀ»Áöµµ ¸ð¸£°í, ¿ä¾àÇÑ Ç¥Çö Çü½Ä (ÀÌ)°¡ µÇµµ·Ï(µíÀÌ) Á¤º¸¸¦ ÀÌ¾î ´ë¸é½ÃÅ°°Å³ª ÇÒÁöµµ ¸ð¸¨´Ï´Ù. ±×·¯ÇÑ Ä¿¸àµå ¶óÀÎ ÇÁ·Î±×·¥À» ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î ·¦ Çϸé(ÀÚ), ·¦ ÇÏ´Â ÆíÀÇ ÇÁ·Î±×·¥Àº ¹ú½á ȸ»ç µÇ¾ú´Ù(±×¸®°í ÁÖÀÇÇÑ °Íó·³ ¾Æ¸¶ ºÒ¿ÏÀüÇÑ) Á¤º¸¿¡ ¾×¼¼½º ÇÏ´Â °ÍÀÌ °¡´ÉÇÑ ÇÑÀ¸·Î, ±×°ÍÀº Çѹø ´õ,Àڽſ¡°Ô °íÀ¯ÀÇ Ç¥Çö Çü½ÄÀ¸·Î º¯È¯ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. °¢°¢ÀÇ ·¦ÇÎÀÇ Ãþ ¸¶´Ù, ÃÖÃÊÀÇ µ¥ÀÌÅÍÀÇ Á¤È®ÇÔÀº ÀÚ²ÙÀÚ²Ù ¾ø¾îÁ® °¥ °¡´É¼ºÀÌ ÀÖ¾î, ±×°ÍÀº Á¤È®È÷ ÀÚ½ÅÀÌ ÁÁ¾ÆÇÏ´Â ¿Àµð¿À³ª ºñµð¿ÀÄ«¼¼Æ®¸¦ ¹Ýº¹ÇØ Ä«ÇÇÇÒ °æ¿ì¿¡ ÀϾ´Â °Í °°Àº À̾߱Ⱑ µÇ¾î ¹ö¸³´Ï´Ù.
APIÀÇ ÀÌ¿ë Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸® API¸¦ »ç¿ëÇÑ ¾îÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀº ºñ±³Àû ¼øÁøÇÑ ÇüÅ·ΠÁøÇàµË´Ï´Ù. ¸ðµç ÇØ´õ ÆÄÀÏÀº ¼Ò½º Æ®¸®ÀÇ subversion/include ¿¡ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ÇØ´õ´Â ¿ø½Ã ÄÚµå·ÎºÎÅÍ SubversionÀ» ¸¸µé¾î ÀνºÅç Çϸé(ÀÚ), ±× ¸Ó½ÅÀÇ ½Ã½ºÅÛ ÇØ´õÀÇ µÎ´Â °÷¼Ò¿¡ Ä«Çǵ˴ϴÙ. ÀÌ·¯ÇÑ ÇØ´õ¿¡´Â Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ À¯Àú¿¡ ÀÇÇØ ¾×¼¼½º ÇÒ ¼ö ÀÖ´Â °Í °°Àº ±â´É°ú ÇüÅÂÀÇ ¸ðµÎ°¡ ÀÖ½À´Ï´Ù. ÃÖÃÊ·Î Á¶½ÉÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀº SubversionÀÇ µ¥ÀÌÅÍÇü°ú ÇÔ¼ö´Â °íÀ¯ÀÇ À̸§ °ø°£¿¡ ÀÇÇØ ºÐ¸®µÇ¾î ÀÖ´Â °ÍÀÔ´Ï´Ù. ¸ðµç °ø°øÀûÀÎ Subversion ½Éº¼¸íÀº"svn_"·Î ½ÃÀ۵Ǿî, ±× ½Éº¼ÀÌ Á¤Àǵǰí ÀÖ´Â ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ÂªÀº Äڵ尡 °è¼ÓµÇ¾î, ("wc"¶óµçÁö, "client"¶óµçÁö,"fs"µî), ¾ð´õ ½ºÄھư¡ Çϳª ¿Í, ("_") , ¸¶Áö¸·¿¡ ½Éº¼¸íÀÇ ³ª¸ÓÁöÀÇ ºÎºÐÀÌ ¿É´Ï´Ù. ÇÑÁ¤ÀûÀ¸·Î °ø°øÀûÀÎ ÇÔ¼ö(ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÁßÀÇ ¿ø½Ã ÆÄÀÏ »çÀÌ¿¡¼­´Â ÀÌ¿ëµÇÁö¸¸, ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ¹Û¿¡¼­´Â ÀÌ¿ëµÇÁö ¾Ê°í, ÇÁ·Î±×·¥ ¶óÀ̺귯¸® µð·ºÅ丮 ÀÚ½ÅÀÇ ³»ºÎ¿¡¼­¸¸ ÂüÁ¶ °¡´ÉÇÑ °Í)Àº ÀÌ ¸í¸í ±Ô¾à°ú´Â Â÷ÀÌ, ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÄÚµå ÀÇ ÈÄ¿¡ ¾ð´õ ½ºÄھư¡ Çϳª ¿À´Â ´ë½Å¿¡, µÑ ¿É´Ï´Ù ("__"). ¾î´À ¿ø½Ã ÆÄÀÏ·Î »çÀûÀÎ ÇÔ¼ö´Â Ư¼öÇÑ Á¢µÎ»ç¸¦ °¡ÁöÁö ¾Ê°í,static¼±¾ðµË´Ï´Ù. ¹°·Ð ÄÄÆÄÀÏ·¯´Â ÀÌ·¯ÇÑ ¸í¸í ±Ô¾àÀ» Çؼ®ÇÕ´Ï´Ù¸¸, ¾î´À ÇÔ¼öÀÇ ½ºÄÚÇÁ³ª µ¥ÀÌÅÍÇüÀ» ºÐ¸íÈ÷ Çϴµ¥ Å« µµ¿òÀÌ µË´Ï´Ù. Apache Portable Runtime ÇÁ·Î±×·¥ ¶óÀ̺귯¸® Subversion ÀÚ½ÅÀÇ µ¥ÀÌÅÍÇü°ú ÇÔ²²,"apr_"·Î ½ÃÀ۵Ǵ µ¥ÀÌÅÍÇü¿¡ÀÇ ÂüÁ¶¸¦ ¸¹ÀÌ º¸ÀÌ´Â ÀÏÀÌ ÀÖ´Â — ÀÌ°ÍÀº Apache ÀÇ Portable Runtime (APR) ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÔ´Ï´Ù. APR ´Â Apache ÀÇ °¡¹ÝÀÎ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÔ´Ï´Ù¸¸, ¿ø·¡ ApacheÀÇ ¼­¹ö ÄÚµåÀÇ OSÀÇÁ¸ÀÇ ºÎºÐÀ» OSºñÀÇÁ¸ÀÇ ºÎºÐÀ¸·ÎºÎÅÍ ºÐ¸®Çϱâ À§Çؼ­ ¸¸µé¾îÁ³½À´Ï´Ù. °á°ú´Â, OS ¸¶´Ù, Á¶±Ý, ȤÀº Å©°Ô ´Ù¸¥ Á¶ÀÛÀ» ½ÇÇàÇÑ´Ù À¯ÀÍÀÇ Ãß»óÀûÀÎ API¸¦ Á¦°øÇÏ°Ô µÇ¾ú½À´Ï´Ù. Apache HTTP ¼­¹ö´Â ºÐ¸íÇÏ°Ô APR ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ÃÖÃÊÀÇ ÀÌ¿ëÀÚ¿´Áö¸¸, Subversion °³¹ßÀÚ´Â °ð¹Ù·Î APR¸¦ »ç¿ëÇÏ´Â °ÍÀÇ Á߿伺À» ´«Ä¡Ã«½À´Ï´Ù. ÀÌ°ÍÀº ½ÇÁ¦·Î Subversion ÀÚ½ÅÁß¿¡ ÀüÇô OS¿¡ ÀÇÁ¸ÇÏ°í ÀÖÁö ¾Ê´Â ÄÚµåÀÇ ºÎºÐÀÌ ÀÖ´Â °ÍÀ» ÀÇ¹Ì ÇÕ´Ï´Ù. °Ô´Ù°¡ Subversion Ŭ¶óÀ̾ðÆ®´Â ¼­¹ö°¡ ÄÄÆÄÀÏ ÇØ ½ÇÇà ÇÏ´Â Àå¼ÒÀÌ¸é ¾îµð¿¡¼­¶óµµ ½ÇÇàÇÒ ¼ö ÀÖ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. Çö½ÃÁ¡¿¡¼­´Â ÀÌ·¯ÇÑ OS¿¡´Â, Unix ÁÁ¾ÆÇÏ´Â ¸ðµÎ, Win32, BeOS, OS/2 ±×¸®°í Mac OS X ÇÏÁö¸¸ Æ÷ÇԵ˴ϴÙ. operating system°£¿¡ ´Ù¸¥ ½Ã½ºÅÛ ÄÝÀÇ ÀÏ°üÇß´Ù ½ÇÀåÀ» Á¦°øÇÏ´Â °Í¿¡ ÀÔ¿¡ ¹°¾î, Subversion ´Â ANSI ½Ã½ºÅÛ ÄÝ°ú µ¥ÀÌÅÍÇüÀ» ÇÒ ¼ö ÀÖ´Â ÇÑ ÀÌ¿ëÇÏ°í ÀÖ½À´Ï´Ù. APR ´Â Subversion°¡ ¸¹Àº µ¶ÀÚÀûÀÎ µ¥ÀÌÅÍÇü¿¡ Á÷Á¢ ¾×¼¼½º ÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù¸¸, °Å±â¿¡´Â, µ¿ÀûÀÎ ¹è¿­À̳ª Çؽà Å×À̺íÀÌ ÀÖ½À´Ï´Ù. Subversion ´Â ¿ø½Ã ÄÚµåÁß¿¡¼­ ÀÌ·¯ÇÑ ÇüŸ¦ È®ÀåÇØ ÀÌ¿ëÇÕ´Ï´Ù. ±×·¯³ª, ¾Æ¸¶ °¡Àå ±¤¹üÀ§ÇÏ°Ô ÀÌ¿ëµÇ°í ÀÖ´Â APR µ¥ÀÌÅÍÇüÀº, ´ëºÎºÐ ¸ðµç Subversion API prototype¿¡ ³ªÅ¸³³´Ï´Ù¸¸, apr_pool_tÀÔ´Ï´Ù — APRÀÇ ¸Þ¸ð¸®ÇÁ¸£ÀÔ´Ï´Ù. Subversion ´Â Ç®À» ³»ºÎÀûÀ¸·Î ¸ðµç ¸Þ¸ð¸® È®º¸ ÇÏÁö¸¸ ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ¿ëÇÕ´Ï´Ù. (´Ù¸¸, ¿ÜºÎ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®°¡ ±× API¸¦ ÅëÇؼ­ ÁÖ°í ¹Þ´Â µ¥ÀÌÅÍÀÇ ¸Þ¸ð¸® ¸Þ´ÏÁö¸ÕÆ®¿¡ ÀÌ°Í°ú ´Ù¸¥ Çü½ÄÀ» ¿ä±¸ÇÏÁö ¾Ê´Â ÇÑ¿¡ µÎ¾î, ÀÔ´Ï´Ù. ) Neon ¿Í Berkeley DB ´Â ±×·¯ÇÑ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ ¿¹ÀÔ´Ï´Ù. ±×¸®°í, Subversion API ¿¡ ´ëÇÑ ÄÚµùÀº °°Àº °ÍÀÌ ¿ä±¸µÈ´Ù (¶æ)ÀÌÀ¯°¡ ¾Æ´Õ´Ï´Ù¸¸, ÇÊ¿äÇÑ Àå¼Ò¿¡¼­´Â API ÇÔ¼ö¸¦ À§Çؼ­(¶§¹®¿¡) pool ¸¦ ÁغñÇÑ´Ù (ÀÏ)°ÍÀº ¿ä±¸µË´Ï´Ù. ÀÌ°ÍÀº APR µµ ¸µÅ© ÇÒ ÇÊ¿ä°¡ ÀÖ´Â Subversion API ÀÇ À¯Àú´Âapr_initialize()¸¦ ºÒ·¯ APR ÇϺÎÁ¶Á÷ (À»)¸¦ ÃʱâÈ­ÇÒ ÇÊ¿ä°¡ ÀÖ¾î, ±×¸®°í Subversion API È£ÃâÀ» ÀÌ¿ëÇϱâ À§Çؼ­ pool ¸¦ ÁغñÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â, À̶ó´Â °ÍÀÌ µË´Ï´Ù. ÀÚ¼¼ÇÑ °ÍÀº (À»)¸¦ ºÁ ÁÖ¼¼¿ä. URL ¿Í Path ÀÇ ¿ä±¸ Subversion ÀüüÀÇ ¹®Á¦·Î¼­ÀÇ ¸®¸ðÆ® ¹öÀü °ü¸® Á¶ÀÛ¿¡¼­´Â, ±¹Á¦È­(i18n) ÀÇ ¼­Æ÷Æ®¸¦ µû¶ó°¡´ÂµéÀΰ¡ ÁÖÀÇÇØ µÑ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. °á±¹,"¸®¸ðÆ®"°¡,"¿ÀÇǽº ÀÌ¿ÜÀÇ Àå¼Ò"¸¦ ÀǹÌÇÑ´Ù¸é, ±×°ÍÀº "Àü¼¼°è·ÎºÎÅÍ"¶ó°í ÇÏ´Â ÀǹÌÀ̱⵵ ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ »óȲ¿¡ ´ëÀÀÇϱâ À§Çؼ­ SubversionÀÇ Æнº Àμö¸¦ ÃëÇÏ´Â, ¸ðµç ÆÛºí¸¯ ÀÎÅÍÆäÀ̽º´Â Æнº°¡ Á¤±ÔÈ­µÇ¾î UTF-8À¸·Î encode µÇ°í ÀÖ´Â °ÍÀ¸·Î ÇÕ´Ï´Ù. ÀÌ°ÍÀº ¿¹¸¦ µé¾î, libsvn_client ÀÎÅÍÆäÀ̽º¸¦ È£ÃâÇÏ´Â, »õ·Î¿î Ŭ¶óÀ̾ðÆ® ¹ÙÀ̳ʸ®´Â ¸ðµÎ, Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡ Æнº¸¦ °Ç³×ÁØ´Ù Àü¿¡, ¿ì¼± Æнº¸¦ ·ÎÄà ÄÚµùÀ¸·ÎºÎÅÍ UTF-8À¸·Î º¯È¯ÇÏÁö ¾ÊÀ¸¸é ¾ÈµÇ¾î, Subversion ·ÎºÎÅÍÀÇ °á°ú Æнº¸¦, Subversion ÀÌ¿ÜÀÇ ¸ñÀûÀ¸·Î ÀÌ¿ëÇϱâ Àü¿¡´Â ·ÎÄà ÄÚµù¿¡ À纯ȯÇÏÁö ¾ÊÀ¸¸é ¾È µÈ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù. Çà¿îÀÇ ÀÏ·Î, SubversionÀº ÀÌ·¯ÇÑ º¯È¯ÀÌ ÇÊ¿äÇÑ ÀÓÀÇÀÇ ÇÁ·Î±×·¥ÀÌ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â °Í °°Àº ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù (subversion/include/svn_utf.h¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä). ¶Ç, Subversion API ´Â ¸ðµç URL Àμö°¡ ¿Ã¹Ù¸£°í URI encode µÇ°í ÀÖ´Ù °ÍÀ» ¿ä±¸ÇÕ´Ï´Ù. ±×·¡¼­ My File.txt¶ó´Â À̸§ÀÇ ÆÄÀÏ URL¸¦, file:///home/username/My File.txt (¿Í)°ú °Ç³×ÁÖ´Â ´ë½Å¿¡, file:///home/username/My%20File.txt (¿Í)°ú °Ç³×ÁÖÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ¿ª½Ã SubversionÀº ¾îÇø®ÄÉÀ̼ÇÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ÇïÆÛ ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù — svn_path_uri_encode ¿Í svn_path_uri_decode¸¦ »ç¿ëÇØ °¢°¢ URI ÀÇ encode¿Í µðÄڵ带 ÇÒ ¼ö ÀÖ½À´Ï´Ù. C ¿Í C++ÀÌ¿ÜÀÇ ¾ð¾îÀÇ ÀÌ¿ë C¾ð¾î ÀÌ¿ÜÀÇ °Í°ú Á¶ÇÕÇØ Subversion ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇϴµ¥ Èï¹Ì°¡ Àִٸ闿¹¸¦ µé¾î PythonÀÇ ½ºÅ©¸³Æ®³ª Java ¾îÇø®ÄÉÀÌ¼Ç — SubversionÀº Simplified Wrapper and Interface Generator (SWIG)¶ó°í ÇÏ´Â ÇüÅ ±×¸®°í Á¶±Ý ¼­Æ÷Æ®ÇÏ°í ÀÖ½À´Ï´Ù. Subversion¿ëÀÇ SWIG´Â, subversion/bindings/swig¿¡ ÀÖ¾î, õõÈ÷ ÀÌ¿ë °¡´ÉÇÑ »óÅ·ΠÀÚ¶ó°í ÀÖ½À´Ï´Ù. ÀÌ°ÍÀ» »ç¿ëÇϸé, ½ºÅ©¸³Æ® ¾ð¾î °íÀ¯ÀÇ µ¥ÀÌÅÍÇüÀ», SubversionÀÇ CÇÁ·Î±×·¥ ¶óÀ̺귯¸®·Î ÇÊ¿äÇÑ µ¥ÀÌÅÍÇüÀ¸·Î º¯È¯ÇÏ´Â ³ªÆÈÀ» »ç¿ëÇØ Subversion API ¸¦ °£Á¢ÀûÀ¸·Î È£ÃâÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. ¾ð¾î Á¦ÈÞ¸¦ ÅëÇؼ­ SubversionAPI ¿¡ ¾×¼¼½º ÇÏ´Â °ÍÀº ºÐ¸íÇÏ°Ô ÀÌÁ¡ÀÌ ÀÖ½À´Ï´Ù —´Ü¼øÇÔ, ÀÔ´Ï´Ù. ÀϹÝÀûÀ¸·Î, Python ³ª Perl ¶ó°í ÇÏ´Â ¾ð¾î´Â C ³ª C++ (À»)¸¦ »ç¿ëÇÏ´Â °Íº¸´Ùµµ ÈξÀ À¯¿¬ÇÏ°í ½¬¿î °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¾ð¾î°¡ ÁغñÇØ ÀÖ´Ù °í·¹º§ µ¥ÀÌÅÍÇü°ú ¹®¸Æ ÀÇÁ¸ÀÇ µ¥ÀÌÅÍÇüÀÇ Ã¼Å©¿Í °°Àº °ÍÀº, Á» ´õ Àß À¯Àú·ÎºÎÅÍÀÇ Á¤º¸¸¦ ó¸®ÇÕ´Ï´Ù. ¹ú½á ¾Æ½Ã´Â ¹Ù¿Í °°ÀÌ, Àΰ£¸¸ÀÌ ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ» À߸øÇØ ½ºÅ©¸³Æ®°èÀÇ ¾ð¾î´Â ´ÜÁö ±× »çÀÌ Â÷À̸¦ Á» ´õ Àß Ã³¸®ÇÒ »ÓÀÔ´Ï´Ù. ¹°·Ð, ÀÚÁÖ ÀÌ À¯¿¬¼ºÀº ÆÛÆ÷¸Õ½º¸¦ Èñ»ý¿¡ ¼¶. ÀÌ°ÍÀÌ, ¿Ö °íµµ·Î ÃÖÀûÈ­µÈ Cº£À̽ºÀÇ ÀÎÅÍÆäÀ̽º¿Í ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦, °­·ÂÇÏ°í À¯¿¬ÇÑ ¾ð¾î¿Í Á¶ÇÕÇØ ÀÌ¿ëÇÏ´Â °Í¿¡ »ç¶÷ÀÌ ²ø¾î ´ç±â°í Àΰ¡ÀÇ ÀÌÀ¯ÀÔ´Ï´Ù. SubversionÀÇ Python¿ë SWIG Á¦ÈÞÀÇ ¿¹¸¦ º¾½Ã´Ù. ÀÌ ¿¹´Â ÀüÀÇ ¿¹¿Í °°Àº °ÍÀ» ÇÕ´Ï´Ù. À̹ø ÇÔ¼öÀÇ »çÀÌÁî¿Í º¹ÀâÇÔÀÇ Á¤µµ¿¡ ÁÖÀÇÀÔ´Ï´Ù. Python¸¦ »ç¿ëÇÑ ÀúÀå¼Ò(repository)Ãþ from svn import fs import os.path def crawl_filesystem_dir (root, directory, pool): """Recursively crawl DIRECTORY under ROOT in the filesystem, and return a list of all the paths at or below DIRECTORY. Use POOL for all allocations. """ # Get the directory entries for DIRECTORY. entries = fs.dir_entries(root, directory, pool) # Initialize our returned list with the directory path itself. paths = [directory] # Loop over the entries names = entries.keys() for name in names: # Calculate the entry's full path. full_path = os.path.join(basepath, name) # If the entry is a directory, recurse. The recursion will return # a list with the entry and all its children, which we will add to # our running list of paths. if fs.is_dir(fsroot, full_path, pool): subpaths = crawl_filesystem_dir(root, full_path, pool) paths.extend(subpaths) # Else, it is a file, so add the entry's full path to the FILES list. else: paths.append(full_path) return paths ÀüÀÇ ¿¹¿¡¼­ÀÇ C ¿¡ ÀÇÇÑ ½ÇÀåÀº Á» ´õ ÈξÀ ±ä °ÍÀ̾ú½À´Ï´Ù. C ÀÇ °°Àº routine (Àº)´Â ¸Þ¸ð¸®ÀÇ ÀÌ¿ëÀÇ ¹æ¹ý¿¡ ½Å°æÀ» »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖ¾î, ¿£Æ®¸®ÀÇ ÇØ½Ã¿Í ÆнºÀÇ ¸®½ºÆ®¸¦ Ç¥ÇöÇÏ´Â µ¶ÀÚÀûÀÎ µ¥ÀÌÅÍÇüÀÌ ÇÊ¿äÇß½À´Ï´Ù. Python ´Â ÇØ½Ã¿Í ¸®½ºÆ®(°¢°¢"dictionaries"¿Í"sequences"¶ó°í ÇÏ´Â ¸»Åõ¸¦ ÇÕ´Ï´Ù¸¸)¸¦ ÆíÀÔ µ¥ÀÌÅÍÇüÀ̶ó°í Çصµ´Â ÀÖ¾î, ÀÌ·¯ÇÑ ÇüÅ¿¡ ´ëÇÑ ÈǸ¢ÇÑ Á¶ÀÛ ¹æ¹ý ÇÏÁö¸¸ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ±×¸®°í, Python ´Â ÂüÁ¶ Ä«¿îÆ®¿Í ¾²·¹±â ÄÝ·º¼Ç (À»)¸¦ »ç¿ëÇϹǷÎ, ÀÌ ¾ð¾îÀÇ À¯Àú´Â ¸Þ¸ð¸®ÀÇ È®º¸¿Í °³¹æ¿¡ ´ëÇØ °í¹ÎÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù. ÀÌ ÀåÀÇ ÀüÀÇ ¸¶µð·Î,libsvn_client ÀÎÅÍÆäÀ̽º ¿¡ Á¢ÇØ Subversion Ŭ¶óÀ̾ðÆ®¸¦ ¾²±â À§ÇÑ ³ë·ÂÀ» °æ°¨ÇÑ´Ù°í ÇÏ´Â À¯ÀÏÇÑ ¸ñÀûÀ» À§Çؼ­(¶§¹®¿¡) ÀÖ´Ù°í Çß½À´Ï´Ù. ÀÌÇÏ´Â ÀÌ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¿¡, ¾î¶»°Ô ÇØ SWIG Á¦ÈÞ¸¦ À̶ó°í ´­·¯ ¾×¼¼½º ÇÒ ¼ö°¡ ÀÖÀ»±îÀÇ °£´ÜÇÑ ¿¹ÀÔ´Ï´Ù. Python ÀÇ ¸î ÁÙ±âÀÇ ÄÚµå·Î, ¿ÏÀüÇÏ°Ô ±â´ÉÇÏ´Â SubversionÀÇ ÀÛ¾÷ Ä«ÇǸ¦ üũ ¾Æ¿ô ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÛ¾÷ Ä«ÇǸ¦ üũ¾Æ¿ô ÇÏ´Â ´Ü¼øÇÑ ½ºÅ©¸³Æ® #! /usr/bin/env python import sys from svn import util, _util, _client def usage(): print "Usage: " + sys.argv[0] + " URL PATH\n" sys.exit(0) def run(url, path): # Initialize APR and get a POOL. _util.apr_initialize() pool = util.svn_pool_create(None) # Checkout the HEAD of URL into PATH (silently) _client.svn_client_checkout(None, None, url, path, -1, 1, None, pool) # Cleanup our POOL, and shut down APR. util.svn_pool_destroy(pool) _util.apr_terminate() if __name__ == '__main__': if len(sys.argv) ! = 3: usage() run(sys.argv[1], sys.argv[2]) Çö½ÃÁ¡¿¡¼­, ÀÌ°ÍÀÌ SubversionÀÇ Python Á¦ÈÞÀ̸ç, ±×°ÍÀº °ÅÀÇ ¿Ï¼º µÈ °ÍÀÔ´Ï´Ù. Java Á¦ÈÞ¿¡ ´ëÇؼ­µµ Á¶±Ý Á¢ÇØ µÓ´Ï´Ù. SWIG ÀÎÅÍÆäÀ̽º ÆÄÀÏÀÌ ¿Ã¹Ù¸£°Ô ¼³Á¤µÇ¸é, ¸ðµç SWIG ´ëÀÀ ¾ð¾î(ÇöÀç·Î¼­´Â, Tcl, Python, Perl, Java, Ruby, Mzscheme, Guile, ±×¸®°í PHPÀÔ´Ï´Ù¸¸)ÀÇ Æ¯Á¤ÀÇ ³ªÆÈÀ» »ý¼ºÇÏ´Â °ÍÀº ÀÌ·ÐÀûÀ¸·Î´Â °£´ÜÇÑ ÀÏÀÔ´Ï´Ù. ±×·¯³ª, SWIG°¡ ÀϹÝÈ­ÇÏ´Â µµ¿òÀÌ ÇÊ¿äÇÑ º¹ÀâÇÑ API ¿¡ ´ëÇؼ­´Â, Á» ´õ Ãß°¡ÀÇ ÄÚµù ÇÏÁö¸¸ ÇÊ¿äÇÕ´Ï´Ù. SWIG ÀÚ½ÅÀÇ °Íº¸´Ù ÀÚ¼¼ÇÑ Á¤º¸´Âhttp://www.swig.org¿¡ ÀÖ´Â ÇÁ·ÎÁ§Æ® ÀÇ À¥ »çÀÌÆ®¸¦ ºÁ ÁÖ¼¼¿ä. ÀÛ¾÷ Ä«ÇÇ °ü¸® areaÀÇ ³»ºÎ ÀÌÀü ÁöÀûÇÑ °Íó·³, Subversion ÀÛ¾÷ Ä«ÇÇÀÇ µð·ºÅ丮ÀÇ °¢°¢Àº . svn ¶ó´Â À̸§ÀÇ Æ¯º°ÇÑ ¼­ºê µð·ºÅ丮¸¦ °®°í, °Å±â¿¡ ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮¿¡ °üÇÑ °ü¸® Á¤º¸¸¦ °Ý³³ÇÕ´Ï´Ù. Subversion ´Â. svn ÁßÀÇ Á¤º¸¸¦ ÀÌÇÏ¿Í °°Àº ÀÏÀ» ±â·ÏÇϴµ¥ ÀÌ¿ëÇÕ´Ï´Ù: ¾îµð¿¡ ÀÖ´Â ÀúÀå¼Ò(repository)°¡, ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮ÀÇ ÆÄÀÏÀ̳ª ¼­ºê µð·ºÅ丮 ¿¡ ÀÇÇØ Ç¥ÇöµÇ°í ÀÖ´Â °ÍÀΰ¡. ¾î´À ¸®ºñÀüÀÇ ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ ÇöÀçÀÇ ÀÛ¾÷ Ä«ÇÇ¿¡ ÀÖ´Â °ÍÀΰ¡. ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ÀÌ¾î ºÙÀº À¯Àú Á¤ÀÇÀÇ ¼Ó¼º. ÀÛ¾÷ Ä«ÇÇ ÆÄÀÏÀÇ ¼öÁ¤¿ø(ÆíÁýÀü) Ä«ÇÇ. files. . svn µð·ºÅ丮¿¡ °Ý³³µÈ µ¥ÀÌÅÍ¿¡´Â ±× ¹Û¿¡µµ ¿©·¯ °¡Áö ÀÖ½À´Ï´Ù¸¸, °¡Àå Áß¿äÇÑ ¾ÆÀÌÅÛÀÇ ¸î°³Àΰ¡ÀÎ ¸¸Å­ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. Entries ÆÄÀÏ . svn µð·ºÅ丮¿¡ ÀÖ´Â Á¦ÀÏ Áß¿äÇÑ ÆÄÀÏÀºentries ÆÄÀÏÀÔ´Ï´Ù. ÀÌ ÆÄÀÏÀº XML ¹®¼­·Î ±× ³»¿ëÀº ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮¾ÈÀÇ ¹öÀü °ü¸®ÇÏ¿¡ ÀÖ´Â ¸®¼Ò½º¿¡ ´ëÇÑ °ü¸® Á¤º¸ÀÇ ¸ðÀÓÀÔ´Ï´Ù. ÀúÀå¼Ò(repository) URL, ¼öÁ¤¿ø¸®ºñÀü, ÆÄÀÏÀÇ Ã¼Å© ¼¶, ¼öÁ¤¿ø ÅؽºÆ®¿Í ¼Ó¼ºÀÇ Å¸ÀÓ ½ºÅÆÇÁ, ¿¹°í¿Í Ãæµ¹ »óÅ¿¡ °üÇÑ Á¤º¸, ¸¶Áö¸·¿¡ Ä¿¹ÔÇß´ø °Í¿¡ °üÇÑ Á¤º¸(½ÇÇàÀÚ, ¸®ºñÀü, ŸÀÓ ½ºÅÆÇÁ), ·ÎÄà īÇÇ È÷½ºÅ丮—Subversion Ŭ¶óÀ̾ðÆ®°¡ °ü¸®ÇÏ°í ÀÖ´Â ¸®¼Ò½º ¿¡ ºÙ¾î Èï¹Ì°¡ ÀÖ´Â Á¤º¸´Â ¸ðµÎ ¿©±â¿¡ ±â·ÏµÇ°í ÀÖ½À´Ï´Ù. Subversion¿Í CVSÀÇ °ü¸® areaÀÇ ºñ±³ ÀüÇüÀûÀÎ. svnµð·ºÅ丮ÀÇ ³»ºÎ¸¦ º¸¸é(ÀÚ), ±×°ÍÀºCVS ÀÇ °ü¸® µð·ºÅ丮¿¡¼­ CVS°¡ °ü¸® ÇÏ´Â Á¤º¸º¸´Ù, Á¶±Ý ¸¹Àº °ÍÀ» ¾Ð´Ï´Ù. entries ÆÄÀÏÀº ÇöÀçÀÇ ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮 »óŸ¦ ±â¼úÇÑ XML¸¦ Æ÷ÇÔÇÏ°í ÀÖ¾î, ÀÌ°ÍÀº ±âº»ÀûÀ¸·Î CVSÀÇ Entries¿ÍRepository (À»)¸¦ ÇÔ²² ÇÑ °ÍÀÌ µË´Ï´Ù. ÀÌÇÏ´Â, ½ÇÁ¦ÀÇ entries ÆÄÀÏÀÇ ¿¹ÀÔ´Ï´Ù: ÀüÇüÀûÀÎ<filename>. svn/entries</filename> ÆÄÀÏ <? xml version="1.0" encoding="utf-8"? > <wc-entries xmlns="svn:"> <entry committed-rev="1" name="svn:this_dir" committed-date="2002-09-24T17:12:44. 064475Z" url="http://svn.red-bean.com/tests/.greek-repo/A/D" kind="dir" revision="1"/> <entry committed-rev="1" name="gamma" text-time="2002-09-26T21:09:02. 000000Z" committed-date="2002-09-24T17:12:44. 064475Z" checksum="QSE4vWd9ZM0cMvr7/+YkXQ==" kind="file" prop-time="2002-09-26T21:09:02. 000000Z"/> <entry name="zeta" kind="file" schedule="add" revision="0"/> <entry url="http://svn.red-bean.com/tests/.greek-repo/A/B/delta" name="delta" kind="file" schedule="add" revision="0"/> <entry name="G" kind="dir"/> <entry name="H" kind="dir" schedule="delete"/> </wc-entries> ¾Ëµµ·Ï(µíÀÌ), entries ÆÄÀÏÀº º»ÁúÀûÀ¸·Î´Â ¿£Æ®¸®ÀÇ ¸®½ºÆ®ÀÔ´Ï´Ù. entry ű×ÀÇ °¢°¢Àº 3°³ Áß ¾î¶² °ÍÀÎÁö¸¦ Ç¥ÇöÇÏ°í ÀÖ´Â: ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮 ÀÚ½Å(name ¼Ó¼ºÀ»"svn:this-dir"·Î ¼³Á¤ÇÏ´Â °ÍÀ¸·Î °¡¸®Åµ´Ï´Ù), ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏ(kind ¼Ó¼ºÀ»"file"·Î ¼³Á¤ÇÏ´Â °ÍÀ¸·Î °¡¸®Åµ´Ï´Ù), ȤÀº ÀÛ¾÷ Ä«ÇÇÀÇ ¼­ºê µð·ºÅ丮 (kind °¡ ¿©±â¿¡¼­´Â "dir" (À¸)·Î ¼³Á¤µË´Ï´Ù). ¿£Æ®¸®°¡ ÀÌ ÆÄÀÏ¿¡ °Ý³³µÇ´Â ÆÄÀÏ°ú ¼­ºê µð·ºÅ丮´Â ¹ú½á ¹öÀü °ü¸®ÇÏ¿¡ ÀÖÀ»±î(À§ÀÇ ¿¹ÀÇ zeta ÆÄÀÏ°ú °°ÀÌ), ÀÌ ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮ÀÇ º¯°æÀÌ ´ÙÀ½¿¡ Ä¿¹ÔµÉ ¶§ ¹öÀü °ü¸®ÇÏ¿¡ Ãß°¡ÇÏ´Â °ÍÀÌ ¿¹°íµÇ°í ÀÖ´ÂÁö, ÀÔ´Ï´Ù. ¿£Æ®¸®ÀÇ °¢°¢Àº µ¶Æ¯ÇÑ À̸§À» °®°í, ƯÁ¤ÀÇ ³ëµå Á¾º°À» °¡Áý´Ï´Ù. °³¹ßÀÚ´Â, Subversion °¡entries ÆÄÀÏÀ» ÀÐ°í ¾²±âÇÒ °æ¿ì¿¡ »ç¿ëÇϴ Ưº°ÇÑ ±ÔÄ¢¿¡ ÁÖÀÇÇØ¾ß ÇÕ´Ï´Ù. ¸ðµç ¿£Æ®¸®´Â ÀÚ½ÅÀÇ ¸®ºñÀü°ú ÀÌ¾î ºÙ¾î ÀÖ´Â URL¸¦ °¡Áö°í ÀÖ½À´Ï´Ù¸¸, »ùÇà ÆÄÀÏÁßÀÇ ¸ðµçentry űװ¡ ¸í½ÃÀûÀÎrevision ³ª url ¼Ó¼ºÀ» °¡Áö´Â °ÍÀº ¾Æ´Õ´Ï´Ù. Subversion ´Â ¿£Æ®¸®°¡ ¸í½ÃÀûÀ¸·Î ÀÌ µÎ °³ÀÇ ¼Ó¼ºÀ» °¡ÁöÁö ¾Ê´Â °Íµµ ÀÎÁ¤ÇÏ°í ÀÖ½À´Ï´Ù¸¸, ±×°ÍÀº, ±× °ªÀÌ,"svn:this-dir" ¿£Æ®¸®¿¡ ÀÖ´Â µ¥ÀÌÅÍ¿Í °°Àº°¡, °£´ÜÇÏ°Ô °è»êÇÒ ¼ö ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. Áï, ¿£Æ®¸®ÀÇ URL´Â Ä£µð·ºÅ丮 URL¿Í ¿£Æ®¸® ¸íĪÀ» ¿¬°áÇÑ °Í°ú °°ÀºÀ¸·Î °£ÁÖÇÑ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù. ¶Ç, ¼­ºê µð·ºÅ丮ÀÇ ¿£Æ®¸®¿¡ ´ëÇؼ­´Â, Subversion ´Â Áß¿äÇÑ ¼Ó¼º—À̸§, Á¾º°, url, ¸®ºñÀü, ±×¸®°í ¿¹°í »óȲ ¸¸À» º¸Á¸Çϱâ·Î ÁÖÀÇÇØ ÁÖ¼¼¿ä. Áߺ¹ ÇÏ´Â Á¤º¸¸¦ ÁÙÀ̱â À§Çؼ­(¶§¹®¿¡), Subversion ´Â, ¼­ºê µð·ºÅ丮¿¡ °üÇÑ ¿ÏÀüÇÑ Á¤º¸ (À»)¸¦ °áÁ¤ÇÏ´Â ¹æ¹ýÀ¸·Î¼­ ±× ¼­ºê µð·ºÅ丮¿¡ ³ª¿Í °¡ ±× µð·ºÅ丮 ÀÚ½ÅÀÇ. svn/entries ÆÄÀÏÀÇ "svn:this-dir" ¿£Æ®¸®¸¦ Àеµ·Ï(µíÀÌ) Áö½ÃÇÕ´Ï´Ù. ±×·¯³ª, ¼­ºê µð·ºÅ丮¿¡ÀÇ ÂüÁ¶´Â, ±× ºÎ¸ðÀÇ entries ÆÄÀÏ¿¡ ±â·ÏµÇ°í ÀÖ¾î, ¼­ºê µð·ºÅ丮 ÇÏÁö¸¸ µð½ºÅ©·ÎºÎÅÍ »èÁ¦µÇ¾î ¹ö¸° °Í °°Àº °æ¿ì¿¡¼­µµ ±âº»ÀûÀÎ ¹öÀü °ü¸® Á¶ÀÛÀ» Çϴµ¥´Â ÃæºÐÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. ¼öÁ¤¿øÄ«ÇÇ¿Í ¼Ó¼º ÆÄÀÏ ¾ÕÀ¸·Î ÁÖÀÇÇÑ °Íó·³,. svnµð·ºÅ丮´Â ¶Ç ¼öÁ¤¿øÀÇ"text-base"¹öÀüÀÇ ÆÄÀÏÀ» º¸Á¸ÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº. svn/text-base¿¡ ÀÖ½À´Ï´Ù. ¼öÁ¤¿ø Ä«ÇÇÀÇ ÀÌÁ¡Àº, ¸î°³Àΰ¡ ÀÖ½À´Ï´Ù. —³×Æ®¿öÅ©ÀÇ Åë½Å¾øÀÌ ·ÎÄà ¼öÁ¤À» üũÇØ Â÷ºÐÀ» º¸°íÇϰųª ³×Æ®¿öÅ© Åë½Å¾øÀÌ ¼öÁ¤Çϰųª »èÁ¦ÇÑ ÆÄÀÏÀ» ¹ÙÅÁÀ¸·Î µÇµ¹¸®°Å³ª ¼­¹ö¿¡ÀÇ º¯°æÁ¡ÀÇ ¼Û½Å »çÀÌÁ ÁÙÀ̰ųª ÇÒ ¼ö ÀÖ½À´Ï´Ù—±×·¯³ª, Àû¾îµµ °¢°¢ÀÇ ¹öÀü °ü¸®µÈ ÆÄÀÏÀ» µÑµð½ºÅ©»ó¿¡ º¸Á¸ÇÏ´Â ÄÚ½ºÆ®°¡ ¹ß»ýÇÕ´Ï´Ù. ÃÖ±Ù¿¡´Â, ÀÌ°ÍÀº(Á¤µµ)¸¸Å­ ¾î´À ÆÄÀÏ¿¡ ´ëÇØ ¹«½ÃÇÒ ¼ö ÀÖ´Â Á¤µµÀÇ ¹°°ÇÀÔ´Ï´Ù. ±×·¯³ª, ¹öÀü °ü¸®µÈ ÆÄÀÏÀÌ Ä¿Áö´Â °Í¿¡ µû¶ó´Â ÀÌ »óȲÀº ½ÉÇÑ °Í¿¡ µÇ¾î °©´Ï´Ù. "text-base" ÀǸ¦ ¸¸µå´ÂÁö ¾î¶²Áö¸¦ ¿É¼ÇÀ¸·Î¼­´Â, À̶ó°í ÇÏ´Â ÀÇ°ßµµ ÀÖ½À´Ï´Ù. ±×·¯³ª Áþ±Ä°Ôµµ, ¹öÀü °ü¸®ÇÏ´Â ÆÄÀÏÀÇ »çÀÌÁî°¡ Ä¿Áö´Â¿¡ µû¶ó,"ÅؽºÆ® º£À̽º"ÀÇ Á¸Àçµµ, ±× ¸¸Å­ Áß¿äÇÏ°Ô µÇ¾î °¡´Â — ÆÄÀÏ·Î ÇÑ ¾ÆÁÖ Á¶±ÝÀÇ º¯°æÀ» Ä¿¹ÔÇÏ°í ½ÍÀº °Í»ÓÀε¥, ¾öû³ª°Ô Å©´Ù ÆÄÀÏÀ» ³×Æ®¿öÅ© ³Ñ¾î·Î º¸³»ÀÚ´Â, ´©°¡ »ý°¢ÇÒ±î¿ä? "text-base"ÆÄÀÏ°ú °°Àº ¸ñÀûÀ¸·Î, ¼Ó¼º ÆÄÀÏ°ú ±× ¼öÁ¤¿ø "prop-base"Ä«ÇÇ°¡ ÀÖ½À´Ï´Ù. °¢°¢,. svn/props (¿Í)°ú. svn/prop-base ¿¡ ÀÖ½À´Ï´Ù. µð·ºÅ丮µµ ¼Ó¼ºÀ» °¡Áú ¼ö°¡ ÀÖÀ¸¹Ç·Î, . svn/dir-props ¿Í . svn/dir-prop-base ÆÄÀÏÀÌ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¼Ó¼º ÆÄÀÏÀÇ °¢°¢("ÀÛ¾÷Áß"°ú"¿ø·¡ÀÇ"¹öÀü)Àº ¼Ó¼º¸í°ú ¼Ó¼ºÄ¡¸¦ °Ý³³Çϴµ¥, ´Ü¼øÇÑ"µð½ºÅ©»ó ÇؽÃ"ÆÄÀÏ Çü½Ä (À»)¸¦ »ç¿ëÇÕ´Ï´Ù. WebDAV WebDAV ("Web º£À̽ºÀÇ ºÐ»ê ÆíÁý°ú ¹öÀüÈ­")´Â Ç¥ÁØÀûÀÎ HTTP ÇÁ·ÎÅäÄÝÀÇ È®ÀåÀ¸·Î, ±âº»ÀûÀ¸·Î´Â Àоîµé¿© Àü¿ëÀÇ ¸ÅüÀÎ web¸¦, ÀÐ°í ¾²±â °¡´ÉÇÑ ¸Åü¿Í Çϱâ À§Çؼ­ ¼³°èµÇ¾ú½À´Ï´Ù. »ý°¢À¸·Î¼­´Â, µð·ºÅ丮¿Í ÆÄÀÏÀº —ÀÐ°í ¾²±â °¡´ÉÇÑ ¿ÀºêÁ§Æ®·Î¼­—Web»ó¿¡¼­ °øÀ¯ÇÒ ¼ö ÀÖ´Ù°í ÇÑ´Ù ¹°°ÇÀÔ´Ï´Ù. RFCs 2518 À¸·Î 3253 Àº, HTTP ÀÇ WebDAV/DeltaV È®Àå¿¡ ´ëÇØ ±â¼ú µÇ°í ÀÖ¾î, (´Ù¸¥ À¯¿ëÇÑ Á¤º¸¿Í ÇÔ²²)http://www.webdav.org/·Î ÀÔ¼ö °¡´ÉÇÕ´Ï´Ù. ¸î°³ÀÇ operating systemÀÇ ÆÄÀÏ ºê¶ó¿ìÀú´Â ¹ú½á WebDAV¸¦ »ç¿ëÇÑ ³×Æ®¿öÅ© µð·ºÅ丮¸¦ mount ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Win32¿¡¼­´Â, Windows Explorer ´Â "Web Æú´õ"(±×°ÍÀº È®½ÇÈ÷, WebDAV ÇÏÁö¸¸ ÁغñÇÑ ³×Æ®¿öÅ©ÀÇ Àå¼ÒÀÔ´Ï´Ù¸¸)À̶ó°í ºÎ¸£°í ÀÖ´Â °ÍÀ», ¸¶Ä¡ ±×°ÍÀÌ º¸Åë °øÀ¯ Æú´õÀÎ°Í °°ÀÌ ÂüÁ¶ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Mac OS X µµ ÀÌ ´É·ÂÀÌ ÀÖ¾î, Nautilus ³ª Konqueror ºê¶ó¿ìÀúµµ ±×·¸½À´Ï´Ù. (À̰͵éÀº, GNOME ¿Í KDE »ó¿¡¼­ °¢°¢ ¿òÁ÷ÀÔ´Ï´Ù). ÀÌ°Íµé ¸ðµç °ÍÀº ¾î¶»°Ô ÇØ Subversion ¿¡ Àû¿ëµÇ°í ÀÖ´Â °ÍÀϱî¿ä? mod_dav_svn Apache ¸ðµâÀº ±× ÁÖ¿äÇÑ ³×Æ®¿öÅ© ÇÁ·ÎÅäÄݷμ­ WebDAV¿Í DeltaV·Î È®ÀåµÈ HTTP¸¦ »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. »õ·Î¿î Ưº°ÇÑ ÇÁ·ÎÅäÄÝÀ» ½ÇÀåÇÏ´Â °Íº¸´Ùµµ, ÃʱâÀÇ SubversionÀÇ ¼³°èÀÚ´Â, ´ÜÁö Subversion·Î »ç¿ëÇÑ´Ù ¹öÀü°ú ó¸®ÀÇ °³³äÀ» RFC 2518 À¸·Î 3253 ÀÌ ¿ä±¸ÇÏ´Â °³³ä¿¡ ¸ÂÃß¾ú½À´Ï´Ù. ÀÌÇØ¿Í °°ÀÌ, ¾î·µç Subversion ´Â Á» ´õ ÃÖ±ÙÀÌ µÇ¾î, °íÀ¯ÀÇ ÇÁ·ÎÅäÄÝ¿¡ ÁøÈ­Çß½À´Ï´Ù. libsvn_ra_svn ¸ðµâÀÇ ½ÇÀåÀÌ ÀÌ°ÍÀÔ´Ï´Ù. WebDAVÀÇ °Í Á» ´õ öÀúÇÑ ³íÀÇ, ¾î¶»°Ô µ¿ÀÛÇØ, SubversionÀº ±×°ÍÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö, ¿¡ ´ëÇؼ­´Â,À» ºÁ ÁÖ¼¼¿ä. ´Ù¸¥ È­Á¦¿Í ÇÔ²², Subversion °¡ ¾î´À Á¤µµ ÀϹÝÀûÀÎ WebDAV ÀÇ »ç¾çÀ» °è½ÂÇÏ°í ÀÖ¾î ÀϹÝÀûÀÎ WebDAV Ŭ¶óÀ̾ðÆ® (¿Í)°úÀÇ »óÈ£ ¿î¿ë¼º¿¡ ¾î¶² ¿µÇâÀ» Áٱ ´ëÇÑ ³íÀÇ°¡ ÀÖ½À´Ï´Ù. ¸Þ¸ð¸®ÇÁ¸£¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¡¹Ö C ¾ð¾î¸¦ »ç¿ëÇÑ °ÍÀÌ ÀÖ´Â °ÅÀÇ ¸ðµç °³¹ßÀÚ´Â, ¾î¶² ½ÃÁ¡¿¡ ¸Þ¸ð¸® °ü¸®·Î ÁøÀý¸Ó¸® ³ª°í ÀÖ¾ú´ø ° ÇѼû µ¹¸®´Â ÀÏÀÌ ÀÖ°ÚÁö¿ä. ÀÌ¿ëÇϱâ À§Çؼ­ ÇÊ¿äÇÑ ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ È®º¸ÇØ, ±× ÀÌ¿ë »óȲÀ» ±â·ÏÇØ, ÇÊ¿ä¾ø°Ô µÇ¸é(ÀÚ) ¸Þ¸ð¸®¸¦ ÇعæÇϴ—±×·¯ÇÑ Ã³¸®´Â ¸Å¿ì º¹ÀâÇÕ´Ï´Ù. ±×¸®°í ¹°·Ð, °Å±â¿¡ ½ÇÆÐÇϸé(ÀÚ), ÇÁ·Î±×·¥ÀÌ ¸Á°¡Á® ³¡³», ½ÉÇÒ ¶§¿¡´Â ÄÄÇ»ÅÍ°¡ °íÀ峪 ¹ö¸³´Ï´Ù. Çà¿î¿¡µµ, Subversion°¡ °¡¹Ý¼ºÀ» À§Çؼ­(¶§¹®¿¡) ÀÌ¿ëÇÏ°í ÀÖ´Â APR ÇÁ·Î±×·¥ ¶óÀ̺귯¸® (Àº)´Âapr_pool_tÇüÀ» ÁغñÇØ ÀÖ¾î, ÀÌ°ÍÀº ¸Þ¸ð¸®ÀÇ"Ç®"À» Ç¥ÇöÇÏ´Â °ÍÀÔ´Ï´Ù. ¸Þ¸ð¸®ÇÁ¸£´Â ÇÁ·Î±×·¥¿¡ ÀÇÇØ ÀÌ¿ëÇϱâ À§Çؼ­ È®º¸µÈ ¸Þ¸ð¸® ºí·ÏÀÇ Ãß»óÀûÀΠǥÇöÀÔ´Ï´Ù. Ç¥ÁØÀûÀÎmalloc() ÇÔ¼ö (¿Í)°ú ±× ¾ÆÁ¾À» »ç¿ëÇØ OS·ÎºÎÅÍ Á÷Á¢ ¸Þ¸ð¸®¸¦ ÃëµæÇÏ´Â ´ë½Å¿¡, APR¸¦ ¸µÅ© Çß´Ù ÇÁ·Î±×·¥Àº ´ÜÁö ¸Þ¸ð¸® Ç®À» ¸¸µå´Â ¿ä±¸¸¦ ³»´Â °ÍÀ¸·Î ½Ç½ÃÇÕ´Ï´Ù. (ÀÌ°Í¿¡´Âapr_pool_create() ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù) APR´Â OS·ÎºÎÅÍ ÀÚ¿¬½º·¯¿î »çÀÌÁîÀÇ ¸Þ¸ð¸®¸¦ È®º¸ÇØ, ±× ¸Þ¸ð¸®´Â °ð¹Ù·Î ÇÁ·Î±×·¥ ±×¸®°í »ç¿ëÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. ÇÁ·Î±×·¥ÀÌ Ç® ¸Þ¸ð¸®¸¦ ÇÊ¿ä¿Í ÇÒ °æ¿ì¿¡´Â ¾ðÁ¦¶óµµ,apr_palloc()¿Í °°Àº APR Ç® API ÇÔ¼öÀÇ ¾î¶² °ÍÀÎÁö¸¦ »ç¿ëÇÒ ¼ö°¡ ÀÖ¾î, ±×°ÍÀº Ç®·ÎºÎÅÍ ¹ü¿ëÀûÀÎ ¸Þ¸ð¸®¸¦ È®º¸ÇØ µ¹·ÁÁÝ´Ï´Ù. ÇÁ·Î±×·¥Àº ¿ä±¸ ºñÆ®¿Í Ç®·ÎºÎÅÍÀÇ ¸Þ¸ð¸®¸¦ °è¼Ó ¿ä±¸ÇÒ ¼ö°¡ ÀÖ¾î, APR´Â ±× ¿ä±¸¸¦ °è¼Ó ½ÂÀÎÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Ç®Àº ÇÁ·Î±×·¥¿¡ ¾Æ¿ï·¯ ÀÚµ¿ÀûÀ¸·Î »çÀÌÁî°¡ ¸¹Àº±¸µçÁö, ÃÖÃÊ Ç®¿¡ Æ÷ÇԵǾî ÀÖ¾ú´ø °Íº¸´Ùµµ ¸¹Àº ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ½Ã½ºÅÛ¿¡ ¸Þ¸ð¸®°¡ ¾ø¾îÁú ¶§±îÁö °è¼ÓÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀ¸·Î Ç®ÀÇ À̾߱Ⱑ ¸¶Áö¸·À̶ó¸é, Ưº°ÇÑ ÁÖÀ§¸¦ ±â¿ïÀÏ ÇÊ¿äµµ ¾ø½À´Ï´Ù¸¸. Çà¿î¿¡µµ, ±×·¸Áö´Â ¾Ê½À´Ï´Ù. Ç®Àº ¸¸µé¾îÁö´Â °Í ¸¸À¸·Î´Â ¾Æ´Õ´Ï´Ù: ±×°ÍÀº ¶Ç Ŭ¸®¾î Çϰųª »èÁ¦ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ°Í¿¡´Â apr_pool_clear() ¿Í apr_pool_destroy() ¸¦ °¢°¢ ÀÌ¿ëÇÕ´Ï´Ù. ÀÌ°ÍÀº °³¹ßÀÚ¿¡°Ô ¾ó¸¶µçÁöÀǗȤÀº ¸îõÀÇ—area¸¦ Ç®·ÎºÎÅÍ ÃëµæÇØ, ±× ÈÄ ÇÑ ¹øÀÇ ÇÔ¼ö È£ÃâÇØ, ±× ¸ðµÎ Ŭ¸®¾î ÇÏ´Â À¯¿¬¼ºÀ» ÁÝ´Ï´Ù. °Ô´Ù°¡ Ç®Àº °èÃþÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ¹ú½á ¸¸µé¾îÁø ¾î´À Ç® ¿¡µµ"¼­ºê Ç®"À» ¸¸µé ¼ö°¡ ÀÖ½À´Ï´Ù. Ç®ÀÌ Å¬¸®¾î µÇ¸é(ÀÚ), ±× Ç® ÀÇ ¸ðµç ¼­ºê Ç®Àº »èÁ¦µË´Ï´Ù. ¸¸¾à Ç®À» »èÁ¦Çϸé(ÀÚ), ±× Ç® ÀڽŰú ¼­ºê Ç®ÀÇ ¾çÂÊ ¸ðµÎ°¡ »èÁ¦µË´Ï´Ù. ¸ÕÀú ÁøÇàÇϱâ Àü¿¡, °³¹ßÀÚ´Â Subversion ¿ø½Ã ÄÚµåÁß¿¡, Áö±Ý ¸»ÇÑ °Í °°Àº APR Ç® ÇÔ¼öÀÇ È£ÃâÀÌ, ±×¸¸Å­ ¸¹Áö ¾ÊÀº °Í¿¡ ´«Ä¡Ã¤°ÚÁö¿ä. APR Ç®Àº, ¸î°³ÀÇ È®Àå ¸ÞÄ«´ÏÁòÀ» °®°í ÀÖ¾î, ±×°ÍÀº Ç®¿¡ ±¹À¯ÀÇ À¯Àú µ¥ÀÌÅ͸¦ Á¢¼ÓÇÏ´Â ´É·ÂÀ̳ª, Ç®ÀÌ »èÁ¦µÉ ¶§ ºÒ·Á °¡´Â Ŭ¸° ¾÷ ÇÔ¼ö¸¦ µî·ÏÇÏ´Â ±¸Á¶µîÀÌ ÀÖ½À´Ï´Ù. SubversionÀº ÀÌ·¯ÇÑ È®Àå ±â´ÉÀ», ±×¸¸Å­ ÀÚ¸íÇÏÁö ¾Ê´Â ¹æ¹ýÀ¸·Î ÀÌ¿ëÇÕ´Ï´Ù. ±×·¡¼­ Subversion ´Â(±×¸®°í ±× Äڵ带 »ç¿ëÇÏ´Â »ç¶÷ÀÇ ´ëºÎºÐÀº) ³ªÆÈ ÇÔ¼ö ÀÌ´Ù svn_pool_create(), svn_pool_clear(), ±×¸®°í svn_pool_destroy() (À»)¸¦ Á¦°øÇÏ°í ÀÖ½À´Ï´Ù. Ç®Àº ±âº»ÀûÀÎ ¸Þ¸ð¸® ¸Þ´ÏÁö¸ÕÆ®¿¡µµ µµ¿òÀÌ µË´Ï´Ù¸¸, ·çÇÁ³ª Àç±ÍÀûÀÎ »óȲÀ¸·Î ÀÇ Ç®ÀÇ ±¸ÃàÀº Á¤¸»·Î ÈǸ¢ÇÑ °ÍÀÔ´Ï´Ù. ·çÇÁ´Â ÀÚÁÖ ±× ¹Ýº¹ ȸ¼ö°¡ ºÎÁ¤À̸ç, Àç±ÍÀûÀº ±× ±íÀÌ°¡ ºÎÁ¤ ±×·¡¼­, ÀÌ·¯ÇÑ area¿¡¼­ÀÇ ÄÚµåÀÇ ¸Þ¸ð¸® ¼Òºñ·®Àº ¿¹ÃøÀÏ궖 ¼±. Çà¿î¿¡µµ, ³×½ºÆ® ÇÑ ¸Þ¸ð¸®ÇÁ¸£¸¦ »ç¿ëÇϸé(ÀÚ), ÀÌ·¯ÇÑ ÀáÀçÀûÀÎ ¹«¼­¿î »óȲÀ» °£´ÜÇÏ°Ô °ü¸®ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌÇÏÀÇ ¿¹´Â, ÀÚÁÖ ÀÖ´Â ¸Å¿ì º¹ÀâÇÑ Á¤º¸¿¡¼­ÀÇ ³×½ºÆ® ÇÑ Ç®ÀÇ ±âº»ÀûÀÎ »ç¿ë¹ýÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. —ÀÌ »óȲÀ̶õ, µð·ºÅ丮 Æ®¸®¸¦ Àç±ÍÀûÀ¸·Î ´õµëÀ¸¸é¼­, Æ®¸®ÀÇ ¸ðµç Àå¼ÒÀΠ󸮸¦ ½ÇÇàÇÑ´Ù, ¶ó°í ÇÑ °ÍÀÔ´Ï´Ù. È¿À²ÀûÀÎ Ç®ÀÇ ÀÌ¿ë /* Recursively crawl over DIRECTORY, adding the paths of all its file children to the FILES array, and doing some task to each path encountered. Use POOL for the all temporary allocations, and store the hash paths in the same pool as the hash itself is allocated in. */ static apr_status_t crawl_dir (apr_array_header_t *files, const char *directory, apr_pool_t *pool) { apr_pool_t *hash_pool = files->pool; /* array pool */ apr_pool_t *subpool = svn_pool_create (pool); /* iteration pool */ apr_dir_t *dir; apr_finfo_t finfo; apr_status_t apr_err; apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME; apr_err = apr_dir_open (&dir, directory, pool); if (apr_err) return apr_err; /* Loop over the directory entries, clearing the subpool at the top of each iteration. */ for (apr_err = apr_dir_read (&finfo, flags, dir); apr_err == APR_SUCCESS; apr_err = apr_dir_read (&finfo, flags, dir)) { const char *child_path; /* Skip entries for "this dir" ('. ') and its parent ('..'). */ if (finfo.filetype == APR_DIR) { if (finfo.name[0] == '. ' && (finfo.name[1] == '\0' || (finfo.name[1] == '. ' && finfo.name[2] == '\0'))) continue; } /* Build CHILD_PATH from DIRECTORY and FINFO.name. */ child_path = svn_path_join (directory, finfo.name, subpool); /* Do some task to this encountered path. */ do_some_task (child_path, subpool); /* Handle subdirectories by recursing into them, passing SUBPOOL as the pool for temporary allocations. */ if (finfo.filetype == APR_DIR) { apr_err = crawl_dir (files, child_path, subpool); if (apr_err) return apr_err; } /* Handle files by adding their paths to the FILES array. */ else if (finfo.filetype == APR_REG) { /* Copy the file's path into the FILES array's pool. */ child_path = apr_pstrdup (hash_pool, child_path); /* Add the path to the array. */ (*((const char **) apr_array_push (files))) = child_path; } /* Clear the per-iteration SUBPOOL. */ svn_pool_clear (subpool); } /* Check that the loop exited cleanly. */ if (apr_err) return apr_err; /* Yes, it exited cleanly, so close the dir. */ apr_err = apr_dir_close (dir); if (apr_err) return apr_err; /* Destroy SUBPOOL. */ svn_pool_destroy (subpool); return APR_SUCCESS; } ÀÌ ¿¹´Â ·çÇÁ¿Í Àç±ÍÀûÀÎ »óȲÀǾçÂÊ ¸ðµÎ¿¡¼­ÀÇ È¿À²ÀûÀÎ Ç®ÀÇ ÀÌ¿ë¹ýÀ» ¼³¸íÇÏ´Â °ÍÀÔ´Ï´Ù. °¢°¢ÀÇ Àç±Í´Â ÇÔ¼ö¿¡ °Ç³×ÁÖ´Â Ç® ÀÇ ¼­ºê Ç®À» ¸¸µå´Â °ÍÀ¸·Î ½ÃÀ۵˴ϴÙ. ÀÌ Ç®Àº ·çÇÁÀÇ area·Î ÀÌ¿ë µÇ¾î °¢°¢ÀÇ ¹Ýº¹À¸·Î Ŭ¸®¾î µË´Ï´Ù. ÀÌ °á°ú, ¸Þ¸ð¸®ÀÇ ÀÌ¿ëÀº, ´ë·«ÀûÀ¸·Î ¸»ÇØ Àç±ÍÀÇ ±íÀÌ¿¡¸¸ ºñ·ÊÇØ, ÃÖ»óÁ¤µµ µð·ºÅ丮ÀÇ ¾ÆÀ̷μ­ÀÇ ÆÄÀÏ°ú µð·ºÅ丮ÀÇ ÇÕ°è¼ö¿¡´Â ºñ·ÊÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ Àç±Í ÇÔ¼öÀÇ ÃÖÃÊÀÇ È£ÃâÀÌ Á¾·áÇÑ ½ÃÁ¡¿¡¼­, °Ç³×ÁØ Ç®¿¡ º¸Á¸µÈ µ¥ÀÌÅÍ´Â ½ÇÁ¦·Î´Â ¸Å¿ì ÀÛÀº °ÍÀÌ µË´Ï´Ù. ÀÌ ÇÔ¼ö°¡,alloc() ¿Í free()ÇÔ¼ö¸¦ Çϳª ÇϳªÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇؼ­ È£ÃâÇÏÁö ¾ÊÀ¸¸é ¾È µÈ´Ù°í ÇßÀ» ¶§ÀÇ º¹ÀâÇÔÀ» »ý°¢ÇØ º¸¼¼¿ä! Ç®Àº ¸ðµç ¾îÇø®ÄÉÀ̼ǿ¡ ÀÌ»óÀûÀÎ °ÍÀº ¾Æ´ÒÁöµµ ¸ð¸¨´Ï´Ù¸¸ Subversion¿¡¼­´Â ¸Å¿ì Å¿ì´Â¿¡ ²÷½À´Ï´Ù. Subversion °³¹ßÀڷμ­ Ç®ÀÇ ÀÌ¿ë ¿¡ Ä£ÇØÁ®, ¾î¶»°Ô ±×°ÍÀ» ¿Ã¹Ù¸£°Ô »ç¿ëÇұ Á¤ÅëÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ¸Þ¸ð¸® ÀÌ¿ë¿¡ °ü°èÇÑ ¹ö±×¿Í ¸Þ¸ð¸® ¸®Å©´Â APIÀÇ Á¾·ù¿¡ ÀÇÇÏÁö ¾Ê°í, Áø´ÜÇØ, ¼öÁ¤ÇÏ´Â °ÍÀº ¾î·Á¿î °ÍÀÔ´Ï´Ù¸¸, APR ¿¡ ÀÇÇØ ÁغñµÈ Ç® ÀÇ ÀÛ¼ºÀº, ¸Å¿ì Æí¸®ÇØ, ½Ã°£ÀÇ Àý¾àÀ¸·Î ¿¬°áµÇ´Â ±â´ÉÀ» °¡Áö°í ÀÖ½À´Ï´Ù. Subversion¿¡ÀÇ °øÇå Subversion ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ Á¤º¸ÀÇ °ø½ÄÀûÀÎ ¹®¼­´Â ¹°·Ð, ÇÁ·ÎÁ§Æ® À¥ »çÀÌÆ®ÀÇhttp://subversion.tigris.orgÀÔ´Ï´Ù. °Å±â¿¡ ¿ø½Ã Äڵ忡 ¾×¼¼½º ÇÏ´Â ¹æ¹ýÀ̳ª, ¸ÞÀϸµ¸®½ºÆ®¿¡ Âü°¡ÇÑ´Ù ¹æ¹ý¿¡ ´ëÇÑ Á¤º¸°¡ ÀÖ½À´Ï´Ù. Subversion Ä¿¹Â´ÏƼ´Â ¾ðÁ¦¶óµµ »õ·Î¿î Âü°¡ÀÚ¸¦ ȯ¿µÇÏ°í ÀÖ½À´Ï´Ù. ¸¸¾à ¿ø½Ã Äڵ带 º¯°æÇÑ´Ù°í ÇÏ´Â ÇüÅÂÀÇ °øÇå¿¡ ÀÇÇØ ÀÌ Ä¿¹Â´ÏƼ¿¡ Âü°¡ÇÏ´Â °Í¿¡ Èï¹Ì°¡ ÀÖ´Ù¸é, ¾î¶² ´À³¦¿¡ ½ÃÀÛÇϸé(ÀÚ) ÁÁÀº°¡ÀÇ ÈùÆ®¸¦ µì´Ï´Ù. Ä¿¹Â´ÏƼ¿¡ÀÇ Âü°¡ Ä¿¹Â´ÏƼ¿¡ Âü°¡ÇÏ´Â ÃÖÃÊÀÇ ½ºÅÜÀº ÃÖ½ÅÀÇ Á¤º¸¸¦ ¾ðÁ¦¶óµµ ÀÔ¼öÇÒ ¼ö ÀÖ´Ù ¹æ¹ýÀ» ã¾Æ³»´Â °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀ» Á¦ÀÏ È¿À²ÀûÀ¸·Î ÇÏ·Á¸é , °³¹ßÀÚÀÇ ³íÀǸ¦ À§ÇÑ ¸ÞÀϸµ¸®½ºÆ®¿¡ Âü°¡ÇØ(dev@subversion.tigris.org), Ä¿¹Ô ¸ÞÀϸµ¸®½ºÆ®¿¡ Âü°¡ÇÏ´Â °ÍÀÔ´Ï´Ù (svn@subversion.tigris.org). ÀÌ·¯ÇÑ ¸ÞÀϸµ¸®½ºÆ®¿¡ ÀÖ´Â Á¤µµ ´ë·«ÀûÀ¸·Î µû¶ó°¡´Â °Í¸¸À¸·Îµµ, Áß¿äÇÑ µðÀÚÀλóÀÇ ³íÀÇ¿¡ ¾×¼¼½º ÇÒ ¼ö ÀÖ°í, Subversion ¿ø½Ã Äڵ忡ÀÇ ½ÇÁ¦ÀÇ ¼öÁ¤À» º¼ ¼ö°¡ ÀÖ°í, ÀÌ·¯ÇÑ º¯°æÀÇ »ó¼¼ÇÑ ¸®ºä¿¡ ÀÔȸÇØ, º¯°æÀ» Á¦¾ÈÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ e-mail º£À̽ºÀÇ ³íÀÇÀÇ Àå¼Ò´Â Subversion °³¹ß¿¡¼­ÀÇ ÃÖ´ëÁß¿äÀÎ Ä¿¹Â´ÏÄÉÀÌ¼Ç ¼ö´ÜÀÔ´Ï´Ù. ´Ù¸¥ Èï¹Ì°¡ ÀÖ´Â Subversion °ü·Ã ¸®½ºÆ®¿¡ ´ëÇؼ­´Â, Web »çÀÌÆ®ÀÇ ¸ÞÀϸµ¸®½ºÆ®ÀÇ ¼½¼ÇÀ» ºÁ ÁÖ¼¼¿ä. ±×·¯³ª, ¹«¾ùÀÌ ÇÊ¿äÇÑ°¡¶ó´Â °ÍÀ» ¾î¶»°Ô ¾Ë¸é ÁÁÀº °ÍÀϱî¿ä? ÇÁ·Î±×·¡¸Ó¿¡ ÀÖ¾î, °³¹ßÀ» µ½ÀÚ°í ÇÏ´Â Å« Àǵµ¸¦ °¡Á® ÀÖÁö¸¸, ÁÁÀ¸¸é ´ã´çÀÚ¸¦ ÀâÀ» ¼ö ¾ø´Â °ÍÀº ÀÚÁÖ ÀÖ´Â °ÍÀÔ´Ï´Ù. °á±¹, ±Ü°í ½Í´Ù°í »ý°¢ÇÒ±î ÇØ Àå¼Ò°¡ ¾îµò°¡¸¦ ¹ú½á ¾Ë°í ÀÖ¾î Ä¿¹Â´ÏƼ¿¡ Âü°¡ÇÏ´Â »ç¶÷Àº ±×¸¸Å­ ¸¹Áö´Â ¾Ê½À´Ï´Ù. ±×·¯³ª, °³¹ßÀÚÀÇ ³íÀǸ¦ µÚÂÑ´Â °Í¿¡ ÀÇÇØ, ¹ú½á Á¸ÀçÇÏ°í ÀÖ´Â ¹ö±×³ª, ³­¹«ÇÏ´Â ±â´É ¿ä±¸ ¿¡ ÁÖÀǸ¦ ÇâÇÒ ¼ö°¡ ÀÖ¾î, ±× ¾î¶² °ÍÀΰ¡°¡ ´ç½ÅÀÇ Èï¹Ì¸¦ ´ç±æÁöµµ Áö ¼±. ¶Ç, ¹ÌÇØ°áÀÇ, ÇÒ´çÀÌ Á¤ÇØÁ® ÀÖÁö ¾ÊÀº ÀÛ¾÷À» ã´Â ÁÁÀº Àå¼Ò¿Í ÇØ, Subversion À¥ »çÀÌÆ®»óÀÇ Issue Tracking µ¥ÀÌŸº£À̽º°¡ ÀÖ½À´Ï´Ù. °Å±â¼­ Çö½ÃÁ¡¿¡¼­ ¹ú½á ¾Ë·ÁÁ® ÀÖ´Â ¹ö±×¿Í ±â´É ¿ä±¸ÀÇ À϶÷À» º¸´Â °ÍÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ¹«¾ùÀΰ¡ ÀÛÀº ÀϷκÎÅÍ ½ÃÀÛÇÏ°í ½Í´Ù¸é,"bite-sized" ±×·¸´Ù°í Çϴ ǥ°¡ ºÙÀº ¹®Á¦¸¦ ºÁ ÁÖ¼¼¿ä. ¿ø½Ã ÄÚµåÀÇ Ãëµæ Äڵ带 ÆíÁýÇÏ·Á¸é , ¿ì¼±Àº Äڵ带 ¼Õ¿¡ ³ÖÀ» ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº °ø°³ÀÇ Subversion ¼Ò½º ÀúÀå¼Ò(repository)·ÎºÎÅÍ ÀÛ¾÷ Ä«ÇǸ¦ üũ¾Æ¿ô ÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. °£´ÜÇÏ°Ô µé¸³´Ï´Ù¸¸, ¾à°£ ±â±³ÀûÀÎ ÀÛ¾÷¿¡ µË´Ï´Ù. SubversionÀÇ ¿ø½Ã ÄÚµå´Â, Subversion Àڽſ¡ ÀÇÇØ ¹öÀü °ü¸® µÇ°í ÀÖÀ¸¹Ç·Î, ¹«¾ùÀΰ¡ ´Ù¸¥ ¹æ¹ýÀ¸·Î ¹ú½á µ¿ÀÛÇÏ´Â SubversionÀ» ÃëµæÇÏ´Â °Í¿¡ ÀÇÇØ "ÃÖÃÊÀÇ ´Ü¼­¸¦ ¾òÀ»"ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. Á¦ÀÏ º¸Åë ¹æ¹ýÀº, ÃÖ½ÅÀÇ ¹ÙÀ̳ʸ® ÆÐÅ°Áö¸¦ ´Ù¿î·ÎµåÇÑ´Ù(´ç½ÅÀÇ ¸Ó½ÅÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÀÖ´Â °æ¿ìÀÔ´Ï´Ù¸¸), Àΰ¡, ÃÖ½ÅÀÇ ¿ø½Ã ÄÚµåÀÇ tarball (À»)¸¦ ´Ù¿ì ·ÎµåÇØ, ÀÚ½ÅÀÇ Subversion Ŭ¶óÀ̾ðÆ®¸¦ ¸¸µé±îÀÔ´Ï´Ù. ¸¸¾à ¼Ò½º·ÎºÎÅÍ »ý¼ºÇÏ´Â °ÍÀÏ ¼ö ÀÖ´ÂÀº, ¼ø¼­¿¡ ´ëÇؼ­´Â ¼Ò½º Æ®¸®ÀÇ ÃÖ»óÁ¤µµ¿¡ ÀÖ´Â INSTALL ÆÄÀÏ¿¡ ¹Ýµå½Ã ´ëÃæ ÈȾîºÁ ÁÖ¼¼¿ä. µ¿ÀÛÇÏ´Â Subversion Ŭ¶óÀ̾ðÆ®¸¦ ¼Õ¿¡ ³ÖÀ¸¸é,http://svn.collab.net/repos/svn/trunk ¿¡ ÀÖ´Â SubversionÀÇ ¼Ò½º ÀúÀå¼Ò(repository)ÀÇ ÀÛ¾÷ Ä«ÇǸ¦ üũ¾Æ¿ô ÇÒ Áغñ ÇÏÁö¸¸ µÇ¾î ÀÖ½À´Ï´Ù: ÀÌ ¿¹·Î üũ¾Æ¿ô ÇÏ´Â URL´Â,svn·Î ³¡³ª´Â °ÍÀº ¾ø°í,trunk¶ó°í ÇÏ´Â ¼­ºê µð·ºÅ丮°¡ µÇ¾î ÀÖ½À´Ï´Ù. ÀÌ ÀÌÀ¯¿¡ ´ëÇؼ­´Â, SubversionÀÇ ºê·£Ä¡(branch)¿Í ÅÂ±× ¸ðµ¨ÀÇ ³íÀǸ¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä. $ svn checkout http://svn.collab.net/repos/svn/trunk subversion A HACKING A INSTALL A README A autogen.sh A build.conf ... À§ÀÇ Ä¿¸àµå´Â, ÃÖ÷´ÜÀÇ, ÃֽŠ¹öÀüÀÇ SubversionÀÇ ¿ø½Ã ÄÚµå (À»)¸¦, ÇöÀçÀÇ ÀÛ¾÷ µð·ºÅ丮¿¡subversion ¶ó°í ÇÑ´Ù À̸§ÀÇ ¼­ºê µð·ºÅ丮¸¦ ¸¸µé¾î üũ¾Æ¿ô ÇÕ´Ï´Ù. ºÐ¸íÇÏ°Ô, ¸¶Áö¸· Àμö´Â, °³º°ÀÇ È¯°æ¿¡ ÀÀÇØ Á¶Á¤ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. »õ·Î¿î ÀÛ¾÷ Ä«ÇÇ µð·ºÅ丮¸¦ ¾î´À °Ô ºÎ¸£·Á°í, ÀÌ Á¶ÀÛÀÌ ¿Ï·áÇϸé SubversionÀÇ ¿ø½Ã Äڵ带 Ãëµæ µÇ¾î ÀÖ½À´Ï´Ù. ¹°·Ð, ±× ¹Û¿¡µµ ¸î°³ÀÇ º¸Á¶ÀûÀÎ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÏ°Ô µË´Ï´Ù(apr, apr-util, µî µî) — ÀÚ¼¼ÇÑ °ÍÀº ÀÛ¾÷ Ä«ÇÇÀÇ ÃÖ»óÁ¤µµ¿¡ ÀÖ´Â INSTALL ÆÄÀÏÀ» ºÁ ÁÖ¼¼¿ä. Ä¿¹Â´ÏƼÀÇ ¹æ½Ä¿¡ Á¤ÅëÇÏ´Â °Í ÀÌ°ÍÀ¸·Î Subversion ¿ø½Ã ÄÚµåÀÇ ÃÖ½ÅÆÇÀÌ ÀÖ´Â ÀÛ¾÷ Ä«ÇǸ¦ ¼Õ¿¡ ³Ö¾ú´Ù ÀÇ·Î, ¾Æ¸¶ ÀÛ¾÷ Ä«ÇÇÀÇ ÃÖ»óÁ¤µµ µð·ºÅ丮¿¡ ÀÖ´Â HACKING ÆÄÀÏÀ» º¸¸é¼­ µð·ºÅ丮¾ÈÀ» ÀÌ°ÍÀú°Í Á¶»çÇÏ°í ½Í´Ù°í »ý°¢ÇÏ°ÚÁö¿ä. HACKING ÆÄÀÏÀº Subversion¿¡ °øÇåÇϱâ À§ÇÑ ÀϹÝÀûÀÎ ¼ö¼ÓÀÌ Æ÷ÇԵǾî ÀÖ¾î, °Å±â¿¡´Â ¾î¶»°Ô ÇØ, ³ª¸ÓÁöÀÇ ÄÚµå¿Í ¸ð¼øµÇÁö ¾Ê´Â ÇüÅ·Π´ç½ÅÀÇ ¿ø½Ã Äڵ带 ¿Ã¹Ù¸£°Ô ¾²´ÂÁö¶óµç°¡, Á¦¾ÈÇÏ°í ½ÍÀº º¯°æÁ¡¿¡ ¾î¶°ÇÑ È¿À²ÀûÀÎ º¯°æ ·Î±× ¸Þ¼¼Áö¸¦ Àû´ÂÁö, ¾î¶»°Ô º¯°æÁ¡À» Å×½ºÆ®Çϸé ÁÁÀºÁö, µîÀÌ Æ÷ÇԵ˴ϴÙ. SubversionÀÇ ¼Ò½º ÀúÀå¼Ò(repository) ¿¡ ´ëÇÑ Ä¿¹Ô ±ÇÇÑÀº ȹµæÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù—½Ç·Â º»À§ÀÇ Á¤ºÎ¿¡ ÀÇÇØ. ÀÌ°ÍÀº ¹«¾ùÀΰ¡ÀÇ ¿¤¸®Æ® ÁÖÀÇ¿Í °°ÀÌ º¸ÀÏÁöµµ ¸ð¸£Áö ¾Ê½À´Ï´Ù¸¸,"Ä¿¹Ô ±ÇÇÑÀ» ȹµæÇÑ´Ù"¶ó°í ÇÏ´Â °³³äÀº È¿À²À» °í·ÁÇÑ ÀÏÀÔ´Ï´Ù — ¾ÈÀüÇØ µµ¿òÀÌ µÇ´Â ´©±º°¡ÀÇ º¯°æÀ» °ËÅäÇØ Àû¿ëÇϱâ À§ÇØ(¶§¹®¿¡) ³ë·Â¿¡ °É¸®´Â ½Ã°£°ú À§ÇèÇÑ º¯°æÀ» ¹ÙÅÁÀ¸·Î µÇµ¹¸°´Ù°í ÇÏ´Â ÀáÀçÀûÀÎ ½Ã°£°úÀÇ »çÀÌÀÇ ±ÕÇüÀÔ´Ï´Ù. HACKING ÆÄÀÏÀº ÀÚ½ÅÀÌ Á¦¾ÈÇÏ·Á ÇÏ°í ÀÖ´Â º¯°æÀÌ ±â¼úÀûÀ¸·Î °ÅºÎµÇ´Â °Í ¾ø°Ô ĪÂù¿¡ ÀûÇÕÇÑÁö ¾î¶²Áö¸¦ È®ÀÎÇϱâ À§Çؼ­´Â ÀÌ ÀÌ»ó ¾ø°í ±ÍÁßÇÑ ÀÚ·áÀÔ´Ï´Ù. ÄÚµåÀÇ º¯°æ°ú Å×½ºÆ® ÄÚµå¿Í Ä¿¹Â´ÏƼÀÇ Æú¸®½Ã¸¦ ÀÌÇØÇϸé, º¯°æ¿¡ Âø¼öÇÏ´Â °ÍÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù. Å« ¹®Á¦¿¡ ÀÓÇÏ°í ÀÖ´Â °æ¿ì¿¡¼­µµ, °Å´ëÇÑ, ÀüºÎ ±âÁ¸ÀÇ °Í°ú ¹Ù²Ù¾î ¹ö¸®´Â °Í °°Àº ¼öÁ¤À» ÇÏ´Â ´ë½Å¿¡, ÀÛÀº, ±×·¯³ª °ü·ÃÀÇ ¾î´À º¯°æÀÇ ¸ðÀÓÀ» ¸¸µé·Á°í ÇÏ´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æ¹ýÀÔ´Ï´Ù. ÇÏ·Á ÇÏ°í ÀÖ´Â °Í¿¡ ÇÊ¿äÇÑ ÄÚµåÀÇ ¼öÁ¤À» ÇÒ ¼ö ÀÖ´Â ÇÑ ÀûÀ¸¸é, Á¦¾ÈÇÏÀÚ (À¸)·Î ÇÏ°í ÀÖ´Â º¯°æÀº ±× ¸¸Å­ °£´ÜÇÏ°Ô ÀÌÇصǰÚÁö¿ä(±×¸®°í, °ËÅäÇÏ´Â °Íµµ ÆíÇØ Áû¾îÁø´Ù). ¼öÁ¤¼¼Æ®ÀÇ °¢°¢À» º£Ç¬ ÈÄ¿¡´Â, ´ç½ÅÀÇ Subversion Æ®¸®´Â ÄÄÆÄÀÏ·¯°¡ °æ°í¸¦ Çϳªµµ ³»Áö ¾Ê´Â »óÅ°¡ µÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù. Subversion ¿¡´Â ²Ï öÀúÈ÷ Çß´Ù ¾Æ¸¶, ÆËÄÜÀÌ¶óµµ ¸Ô°í ½Í¾îÁúÁöµµ. ¿©±â¼­ÀÇ"öÀúÇÑ"Àº, ºñ´ëÈ­ÀûÀÎ ¸Ó½ÅÀ¸·Î, ¾à 30ºÐ °É¸°´Ù°í ÇÏ´Â Á¤µµÀÇ Àǹ̷Π¹ø¿ªÇØ ÁÖ¼¼¿ä. µ¥±×·¹ÀÌÆ®¸¦ üũÇϱâ À§ÇÑ Å×½ºÆ® ½ºÀ§Æ®°¡ ÀÖ¾î, Á¦¾ÈÇÏ·Á ÇÏ°í ÀÖ´Â º¯°æÀº, ¾î¶°ÇÑ Å×½ºÆ®¿¡¼­µµ ½ÇÆÐÇÏÁö ¾Ê°Ô µÇ¾î ÀÖ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù. ¼Ò½º Æ®¸®ÀÇ ÃÖ»óÁ¤µµ·Îmake check (À»)¸¦ ½ÇÇàÇÏ´Â(UnixÀÇ °æ¿ì) ÀÏ·Î, ÀÚ½ÅÀÇ º¯°æÀÇ Ã¼Å©¸¦ ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ´ç½ÅÀÇ °øÇåÀÌ °ÅÀýµÇ´Â Á¦ÀÏ ºü¸¥ ¹æ¹ýÀº(ÀûÀýÇÑ ·Î±× ¸Þ¼¼Áö¸¦ ÀûÁö ¾Ê¾Ò´Ù °æ¿ì ÀÌ¿Ü´Â), Å×½ºÆ®°¡ Åë°úÇÏÁö ¾Ê´Â º¯°æÀ» º¸³»´Â °ÍÀÔ´Ï´Ù. Á¦ÀÏ ÁÁÀº ½Ã³ª¸®¿À´Â, ½ÇÁ¦·Î ÀûÀýÇÑ Å×½ºÆ®¸¦, Å×½ºÆ® ½ºÀ§Æ®ÇÏ°Ô Ãß°¡ÇØ, ±×·¡¼­ ´ç½ÅÀÇ º¯°æÁ¡ÀÌ ½ÇÁ¦·Î ±â´ëÇÑ °Íó·³ µ¿ÀÛÇÏ´Â °ÍÀÔ´Ï´Ù. ½ÇÁ¦Á¶»ç ÀÖ°í, °¡²û »ç¶÷ÀÌ °øÇåÇÒ ¼ö ÀÖ´Â ÃÖ¼±´Â »õ·Î¿î Å×½ºÆ®¸¦ ´ÜÁö Ãß°¡ ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¡·¯ÀÇ °è±â°¡ µÇ´Â °Í °°Àº ÇâÈÄÀÇ ¼öÁ¤À¸·ÎºÎÅÍ ÁöÅ°´Â °Í °°Àº Àǹ̸¦ ´ã¾Æ, ÇöÀçÀÇ Subversion·Î µ¿ÀÛÇÏ°í ÀÖ´Â ±â´ÉÀ» À§Çؼ­(¶§¹®¿¡) µ¥±×·¹À̵åÀÇ Å×½ºÆ®¸¦ ¾µ ¼ö°¡ ÀÖ½À´Ï´Ù. ¶Ç, ¹ú½á ¾Ë·ÁÁ® ÀÖ´Â ½ÇÆи¦ º¸À̱â À§ÇÑ »õ·Î¿î Å×½ºÆ®¸¦ ¾²´Â Àϵµ·Î ¿É´Ï´Ù. ÀÌ ¸ñÀûÀ» À§Çؼ­(¶§¹®¿¡)´Â Subversion Å×½ºÆ® ½ºÀ§Æ®´Â, ¾î´À Å×½ºÆ®´Â ½ÇÆÐ ÇÏ´Â °ÍÀÌ ±â´ëµÇ°í ÀÖ´Â °ÍÀ̶ó°í ÁöÁ¤ÇÏ´Â °ÍÀ» ÀÎÁ¤ÇÕ´Ï´Ù. (XFAIL¶ó°í ÇÕ´Ï´Ù), ±×¸®°í Subversion°¡ ±â´ëÇÏ´Â ÇüÅ·Π½ÇÆÐÇÏ´Â ÇÑ, ±× Å×½ºÆ®ÀÇ °á°úÀÎ XFAIL ÀÚü´Â, ¼º°øÇß´Ù°í º¸ÀÔ´Ï´Ù. ¸¶Áö¸·À¸·Î, ÁÁÀº Å×½ºÆ® ½ºÀ§Æ®¸¦ ÁغñÇϸé ÇÒ »Ó(¸¸Å­), ÀÌÇØÇϱ⠾î·Á¿î µ¥±×·¹ÀÌÆ®ÀÇ ¹ö±× (À»)¸¦ Áø´ÜÇϱâ À§Çؼ­ ³¶ºñµÇ´Â ½Ã°£À» ÁÙÀÏ ¼ö°¡ ÀÖ½À´Ï´Ù. º¯°æÁ¡ÀÇ Á¦°ø ¿ø½Ã Äڵ忡 ´ëÇÑ ¼öÁ¤À» ÇÑ ÈÄ, ¸í·áÇØ °áÁ¤µÈ ·Î±× ¸Þ¼¼Áö¸¦ ¸¸µé¾î, ±×·¯ÇÑ º¯°æÀ» ¼³¸íÇØ, ±× ÀÌÀ¯¸¦ ½á ÁÖ¼¼¿ä. ±×¸®°í email¸¦ °³¹ßÀÚ¿ë ¸ÞÀϸµ¸®½ºÆ®¿¡ º¸³», °Å±â¿¡´Â ·Î±× ¸Þ¼¼Áö¿Í svn diffÀÇ Ãâ·Â(ÀÌ°ÍÀº SubversionÀÇ ÃÖ»óÁ¤µµ ÀÛ¾÷ Ä«ÇÇ ±×¸®°í ½ÇÇàÇØ ÁÖ¼¼¿ä)¸¦ Æ÷ÇÔÇØ ÁÖ¼¼¿ä. Ä¿¹Â´ÏƼÀÇ ¸â¹ö°¡ ´ç½ÅÀÇ º¯°æÀÌ ¹Þ¾Æµé¿©Áø´Ù°í ÆÇ´ÜÇßÀ» °æ¿ì, Ä¿¹Ô ±ÇÇÑÀ» °¡Á³´Ù ´©±º°¡(SubversionÀÇ ¼Ò½º ÀúÀå¼Ò(repository)¿¡ »õ·Î¿î ¸®ºñÀüÀ» ¸¸µå´Â Çã°¡¸¦ °¡Áö°í ÀÖ´Â »ç¶÷)ÀÌ, ´ç½ÅÀÇ º¯°æÀÌ °ø°³µÈ ¿ø½Ã ÄÚµå Æ®¸®¿¡ Ãß°¡ÇÕ´Ï´Ù. ÀúÀå¼Ò(repository)¿¡ ´ëÇؼ­ º¯°æÀ» Á÷Á¢ Ä¿¹ÔÇÏ´Â ±ÇÇÑÀº, ÀÌÁ¡ÀÌ ÀÖ´Â °æ¿ì¿¡¸¸ ÀÎÁ¤µË´Ï´Ù—¸¸¾à SubversionÀÇ ÀÌÇسª, ÇÁ·Î±×·¡¹ÖÀÇ ´É·ÂÀ̳ª,"ÆÀ ½ºÇǸ®Æ®"¸¦ ³ªÅ¸³»¸é, ´ç½ÅÀº ¹Ýµå½Ã ±× ±ÇÇÑÀ» ¾òÀ» ¼ö ÀÖ°ÚÁö¿ä.