8.2
Ç¨ÒÆµ½ Git
Èç¹ûÔÚÆäËû°æ±¾¿ØÖÆÏµÍ³Öб£´æÁËijÏîÄ¿µÄ´úÂë¶øºó¾ö¶¨×ª¶øÊ¹Óà Git£¬ÄÇô¸ÃÏîÄ¿±ØÐë¾ÀúijÖÖÐÎʽµÄÇ¨ÒÆ¡£±¾½Ú½«½éÉÜ
Git Öаüº¬µÄһЩÕë¶Ô³£¼ûϵͳµÄµ¼Èë½Å±¾£¬²¢½«Õ¹Ê¾±àд×Ô¶¨ÒåµÄµ¼Èë½Å±¾µÄ·½·¨¡£
µ¼Èë
Ä㽫ѧϰµ½ÈçºÎ´Ó×¨ÒµÖØÁ¿¼¶µÄ°æ±¾¿ØÖÆÏµÍ³Öе¼ÈëÊý¾Ý¡ª¡ª Subversion
ºÍ Perforce ¡ª¡ª ÒòΪ¾ÝÎÒËùÖªÕâ¶þÕßµÄÓû§ÊÇ£¨Ïò Git£©×ª»»µÄÖ÷ҪȺÌ壬¶øÇÒ Git Ϊ´Ë¶þÕ߸½´øÁ˸ßÖÊÁ¿µÄת»»¹¤¾ß¡£
Subversion
¶Á¹ýǰһ½ÚÓÐ¹Ø git svn µÄÄÚÈÝÒÔºó£¬ÄãÓ¦¸ÃÄÜÇá¶øÒ׾ٵĸù¾ÝÆäÖеÄÖ¸µ¼À´
git svn clone Ò»¸ö²Ö¿âÁË£»È»ºó£¬Í£Ö¹ Subversion µÄʹÓã¬ÏòÒ»¸öРGit server
ÍÆËÍ£¬²¢¿ªÊ¼Ê¹ÓÃËü¡£Ïë±£ÁôÀúÊ·¼Ç¼£¬Ëù»¨µÄʱ¼äÓ¦¸Ã²»¹ý¾ÍÊÇ´Ó Subversion ·þÎñÆ÷ÀÈ¡Êý¾ÝµÄʱ¼ä£¨¿ÉÄÜÒªµÈÉϺÃÒ»»á¾ÍÊÇÁË£©¡£
È»¶ø£¬ÕâÑùµÄµ¼Èë²¢²»ÍêÃÀ£»¶øÇÒ»¹Òª»¨ÄÇô¶àʱ¼ä£¬²»Èç¸É´àÒ»´Î°ÑËü×ö¶Ô£¡Ê×µ±Æä³åµÄÈÎÎñÊÇ×÷ÕßÐÅÏ¢¡£ÔÚ
Subversion£¬Ã¿¸öÌá½»ÕßÔÚ¶¼ÔÚÖ÷»úÉÏÓÐÒ»¸öÓû§Ãû£¬¼Ç¼ÔÚÌá½»ÐÅÏ¢ÖС£ÉϽÚÀý×ÓÖжദÏÔʾÁËschacon
£¬±ÈÈç blame µÄÊä³öÒÔ¼° git svn log¡£Èç¹ûÏëÈÃÕâÌõÐÅÏ¢¸üºÃµÄÓ³Éäµ½ Git ×÷ÕßÊý¾ÝÀÔòÐèÒª
´Ó Subversion Óû§Ãûµ½ Git ×÷ÕßµÄÒ»¸öÓ³Éä¹ØÏµ¡£½¨Á¢Ò»¸ö½Ð×öuser.txt µÄÎļþ£¬ÓÃÈçϸñʽ±íʾӳÉä¹ØÏµ£º
schacon = Scott Chacon <schacon@geemail.com> selse = Someo Nelse <selse@geemail.com> |
ͨ¹ý¸ÃÃüÁî¿ÉÒÔ»ñµÃ SVN ×÷ÕßµÄÁÐ±í£º
$ svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /' |
Ëü½«Êä³ö XML ¸ñʽµÄÈÕÖ¾¡ª¡ªÄã¿ÉÒÔÕÒµ½×÷Õߣ¬½¨Á¢Ò»¸öµ¥¶ÀµÄÁÐ±í£¬È»ºó´Ó
XML ÖгéÈ¡³öÐèÒªµÄÐÅÏ¢¡££¨ÏÔ¶øÒ×¼û£¬±¾·½·¨ÒªÇóÖ÷»úÉϰ²×°ÁËgrep£¬sort ºÍperl.£©È»ºó°ÑÊä³öÖØ¶¨Ïòµ½
user.txt Îļþ£¬È»ºó¾Í¿ÉÒÔÔÚÿһÏîµÄºóÃæÌí¼ÓÏàÓ¦µÄ Git Óû§Êý¾Ý¡£
Ϊ git svn Ìṩ¸ÃÎļþ¿ÉÒÔÈ»Ëü¸ü¾«È·µÄÓ³Éä×÷ÕßÊý¾Ý¡£Ä㻹¿ÉÒÔÔÚ
clone »òÕß initºóÃæÌí¼Ó--no-metadata À´×èÖ¹ git svn °üº¬ÄÇЩ Subversion
µÄ¸½¼ÓÐÅÏ¢¡£ÕâÑù import ÃüÁî¾Í±ä³ÉÁË£º
$ git-svn clone http://my-project.googlecode.com/svn/ \ --authors-file=users.txt --no-metadata -s my_project |
ÏÖÔÚ my_project Ŀ¼Ïµ¼ÈëµÄ Subversion Ó¦¸Ã±ÈÔÀ´Õû½à¶àÁË¡£ÔÀ´µÄ
commit ¿´ÉÏÈ¥ÊÇÕâÑù£º
commit 37efa680e8473b615de980fa935944215428a35a Author: schacon
<schacon@4c93b258-373f-11de-be05-5f7a86268029> Date: Sun May |
ÏÖÔÚÊÇÕâÑù£º
commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2 Author: Scott Chacon
<schacon@geemail.com> Date: Sun May 3 00:12:22 2009 +00 |
²»½ö×÷ÕßÒ»Ïî¸É¾»Á˲»ÉÙ£¬git-svn-id Ò²¾Í´ËÏûʧÁË¡£
Ä㻹ÐèÒªÒ»µã post-import£¨µ¼Èëºó£© ÇåÀí¹¤×÷¡£×îÆðÂëµÄ£¬Ó¦¸ÃÇåÀíÒ»ÏÂ
git svn ´´½¨µÄÄÇЩ¹ÖÒìµÄË÷Òý½á¹¹¡£Ê×ÏÈÒªÒÆ¶¯±êÇ©£¬°ÑËüÃÇ´ÓÆæ¹ÖµÄÔ¶³Ì·ÖÖ§±ä³Éʵ¼ÊµÄ±êÇ©£¬È»ºó°ÑʣϵķÖÖ§ÒÆ¶¯µ½±¾µØ¡£
Òª°Ñ±êÇ©±ä³ÉºÏÊ浀 Git ±êÇ©£¬ÔËÐÐ
$ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ $ rm -Rf .git/refs/remotes/tags |
¸ÃÃüÁԱ¾ÒÔ tag/ ¿ªÍ·µÄÔ¶³Ì·ÖÖ§µÄË÷Òý±ä³ÉÕæÕýµÄ£¨ÇáÇɵ쩱êÇ©¡£
½ÓÏÂÀ´£¬°Ñ refs/remotes ÏÂÃæÊ£ÏµÄË÷Òý±ä³É±¾µØ·ÖÖ§£º
$ cp -Rf .git/refs/remotes/* .git/refs/heads/ $ rm -Rf .git/refs/remotes |
ÏÖÔÚËùÓеľɷÖÖ§¶¼±ä³ÉÕæÕýµÄ Git ·ÖÖ§£¬ËùÓеľɱêǩҲ±ä³ÉÕæÕýµÄ Git
±êÇ©¡£×îºóÒ»Ï×÷¾ÍÊǰÑн¨µÄ Git ·þÎñÆ÷Ìí¼ÓΪԶ³Ì·þÎñÆ÷²¢ÇÒÏòËüÍÆËÍ¡£ÏÂÃæÊÇÐÂÔöÔ¶³Ì·þÎñÆ÷µÄÀý×Ó£º
$ git remote add origin git@my-git-server:myrepository.git |
ΪÁËÈÃËùÓеķÖÖ§ºÍ±êÇ©¶¼µÃµ½ÉÏ´«£¬ÎÒÃÇʹÓÃÕâÌõÃüÁ
ËùÓеķÖÖ§ºÍ±êÇ©ÏÖÔÚ¶¼Ó¦¸ÃÕûÆë¸É¾»µÄÌÉÔÚÐ嵀 Git ·þÎñÆ÷ÀïÁË¡£
Perforce
Ä㽫Á˽⵽µÄÏÂÒ»¸ö±»µ¼ÈëµÄϵͳÊÇ Perforce. Git ·¢ÐеÄʱºòͬʱҲ¸½´øÁËÒ»¸ö
Perforce µ¼Èë½Å±¾£¬²»¹ýËüÊǰüº¬ÔÚÔ´ÂëµÄ contrib ²¿·Ö¡ª¡ª¶ø²»Ïñgit svn ÄÇÑùĬÈÏ¿ÉÓá£ÔËÐÐËü֮ǰ±ØÐë»ñÈ¡
Git µÄÔ´Â룬¿ÉÒÔÔÚ git.kernel.org ÏÂÔØ£º
$ git clone git://git.kernel.org/pub/scm/git/git.git $ cd git/contrib/fast-import |
ÔÚÕâ¸ö fast-import Ŀ¼Ï£¬Ó¦¸ÃÓÐÒ»¸ö½Ð×ö git-p4 µÄ
Python ¿ÉÖ´Ðнű¾¡£Ö÷»úÉϱØÐë×°ÓÐ Python ºÍp4 ¹¤¾ß¸Ãµ¼Èë²ÅÄÜÕý³£½øÐС£ÀýÈ磬ÄãÒª´Ó Perforce
¹«¹²´úÂë²Ö¿â£¨Òë×¢£º Perforce Public Depot£¬Perforce ¹Ù·½ÌṩµÄ´úÂë¼Ä´æ·þÎñ£©µ¼Èë
Jam ¹¤³Ì¡£ÎªÁËÉ趨¿Í»§¶Ë£¬ÎÒÃÇÒª°Ñ P4PORT »·¾³±äÁ¿ export µ½ Perforce ²Ö¿â£º
$ export P4PORT=public.perforce.com:1666 |
ÔËÐÐ git-p4 clone ÃüÁ´Ó Perforce ·þÎñÆ÷µ¼Èë
Jam ÏîÄ¿£¬ÎÒÃÇÐèÒª¸ø³ö²Ö¿âºÍÏîÄ¿µÄ·¾¶ÒÔ¼°µ¼ÈëµÄÄ¿±ê·¾¶£º
$ git-p4 clone //public/jam/src@all /opt/p4import Importing from
//public/jam/src@all into /opt/p4import Reinitialized exist |
ÏÖÔÚÈ¥ /opt/p4import Ŀ¼ÔËÐÐһϠgit log £¬¾ÍÄÜ¿´µ½µ¼ÈëµÄ³É¹û£º
$ git log -2 commit 1fd4ec126171790efd2db83548b85b1bbbc07dc2 Author:
Perforce staff <support@perforce.com> Date: Thu Aug 19 1 |
ÿһ¸ö commit Àï¶¼ÓÐÒ»¸ö git-p4 ±êʶ·û¡£Õâ¸ö±êʶ·û¿ÉÒÔ±£Áô£¬ÒÔ·ÀÒÔºóÐèÒªÒýÓÃ
Perforce µÄÐ޸İ汾ºÅ¡£È»¶ø£¬Èç¹ûÏëɾ³ýÕâЩ±êʶ·û£¬ÏÖÔÚÕýÊÇʱºò¡ª¡ªÔÚ¿ªÆôвֿâ֮ǰ¡£¿ÉÒÔͨ¹ýgit
filter-branch À´ÅúÁ¿É¾³ýÕâЩ±êʶ·û£º
$ git filter-branch --msg-filter ' sed -e "/^\[git-p4:/d"
' Rewrite 1fd4ec126171790efd2db83548b85b1bbbc07dc2 (123/123) Ref ' |
ÏÖÔÚÔËÐÐһϠgit log£¬Äã»á·¢ÏÖÕâЩ commit µÄ SHA-1
УÑéÖµ¶¼·¢ÉúÁ˸ı䣬¶øÄÇЩ git-p4 ×Ö´®Ôò´ÓÌá½»ÐÅÏ¢ÀïÏûʧÁË£º
$ git log -2 commit 10a16d60cffca14d454a15c6164378f4082bc5b0 Author:
Perforce staff <support@perforce.com> Date: Thu Aug 19 |
ÖÁ´Ëµ¼ÈëÒѾÍê³É£¬¿ÉÒÔ¿ªÊ¼ÏòÐ嵀 Git ·þÎñÆ÷ÍÆËÍÁË¡£
×Ô¶¨µ¼Èë½Å±¾
Èç¹ûÏÈǰµÄϵͳ²»ÊÇ Subversion »ò Perforce Ö®Ò»£¬ÏÈÉÏÍøÕÒÒ»ÏÂÓÐûÓÐÓëÖ®¶ÔÓ¦µÄµ¼Èë½Å±¾¡ª¡ªµ¼Èë
CVS£¬Clear Case£¬Visual Source Safe£¬ÉõÖÁ´æµµÄ¿Â¼µÄµ¼Èë½Å±¾ÒѾ´æÔÚ¡£¼ÙÈçÕâЩ¹¤¾ß¶¼²»ÊÊÓ㬻òÕßʹÓõŤ¾ßºÜÉÙ¼û£¬ÒÖ»òÄãÐèÒªµ¼Èë¹ý³Ì¾ßÓиü¶à¿ÉÖÆ¶¨ÐÔ£¬ÔòÓ¦¸ÃʹÓÃgit
fast-import¡£¸ÃÃüÁî´Ó±ê×¼ÊäÈë¶ÁÈ¡¼òµ¥µÄÖ¸ÁîÀ´Ð´Èë¾ßÌåµÄ Git Êý¾Ý¡£ÕâÑù´´½¨ Git ¶ÔÏó±ÈÔËÐд¿
Git ÃüÁî»òÕßÊÖ¶¯Ð´¶ÔÏóÒª¼òµ¥µÄ¶à£¨¸ü¶àÏà¹ØÄÚÈݼûµÚ¾ÅÕ£©¡£Í¨¹ýËü£¬Äã¿ÉÒÔ±àдһ¸öµ¼Èë½Å±¾À´´Óµ¼ÈëÔ´¶ÁÈ¡±ØÒªµÄÐÅÏ¢£¬Í¬Ê±ÔÚ±ê×¼Êä³öÖ±½ÓÊä³öÏà¹ØÖ¸Ê¾¡£Äã¿ÉÒÔÔËÐиýű¾²¢°ÑËüµÄÊä³ö¹ÜµÀÁ¬½Óµ½git
fast-import¡£
ÏÂÃæÑÝʾһÏÂÈçºÎ±àдһ¸ö¼òµ¥µÄµ¼Èë½Å±¾¡£¼ÙÉèÄãÔÚ½øÐÐÒ»Ï×÷£¬²¢ÇÒ°´Ê±Í¨¹ý°Ñ¹¤×÷Ŀ¼¸´ÖÆÎªÒÔʱ¼ä´Á
back_YY_MM_DD ÃüÃûµÄĿ¼À´½øÐб¸·Ý£¬ÏÖÔÚÄãÐèÒª°ÑËüÃǵ¼Èë Git ¡£Ä¿Â¼½á¹¹ÈçÏ£º
$ ls /opt/import_from back_2009_01_02 back_2009_01_04 back_2009_01_14 back_2009_02_03 current |
ΪÁ˵¼Èëµ½Ò»¸ö Git Ŀ¼£¬ÎÒÃÇÊ×ÏȻعËһϠGit ´¢´æÊý¾ÝµÄ·½Ê½¡£Äã¿ÉÄÜ»¹¼ÇµÃ£¬Git
±¾ÖÊÉÏÊÇÒ»¸ö commit ¶ÔÏóµÄÁ´±í£¬Ã¿Ò»¸ö¶ÔÏóÖ¸ÏòÒ»¸öÄÚÈݵĿìÕÕ¡£¶øÕâÀïÐèÒª×öµÄ¹¤×÷¾ÍÊǸæËßfast-import
ÄÚÈÝ¿ìÕÕµÄλÖã¬Ê²Ã´ÑùµÄ commit Êý¾ÝÖ¸ÏòËüÃÇ£¬ÒÔ¼°ËüÃǵÄ˳Ðò¡£ÎÒÃDzÉȡһ´Î´¦ÀíÒ»¸ö¿ìÕյIJßÂÔ£¬ÎªÃ¿Ò»¸öÄÚÈÝĿ¼½¨Á¢¶ÔÓ¦µÄ
commit £¬Ã¿Ò»¸ö commit Óë֮ǰµÄ½¨Á¢Á´½Ó¡£
ÕýÈçÔÚµÚÆßÕ ¡°Git Ö´ÐвßÂÔÒ»Àý¡± Ò»½ÚÖÐÒ»Ñù£¬ÎÒÃǽ«Ê¹Óà Ruby
À´±àдÕâ¸ö½Å±¾£¬ÒòΪËüÊÇÎÒÈÕ³£Ê¹ÓõÄÓïÑÔ¶øÇÒÔĶÁÆðÀ´¼òµ¥Ò»Ð©¡£Äã¿ÉÒÔÓÃÈÎºÎÆäËûÊìϤµÄÓïÑÔÀ´ÖØÐ´Õâ¸öÀý×Ó¡ª¡ªËü½öÐèÒª°Ñ±ØÒªµÄÐÅÏ¢´òÓ¡µ½±ê×¼Êä³ö¶øÒÑ¡£Í¬Ê±£¬Èç¹ûÄãÔÚʹÓÃ
Windows£¬ÕâÒâζ×ÅÄãÒªÌØ±ðÁôÒâ²»ÒªÔÚ»»ÐеÄʱºòÒýÈë»Ø³µ·û£¨Òë×¢£ºcarriage returns£¬Windows
»»ÐÐʱ¼ÓÈëµÄ·ûºÅ£¬Í¨³£ËµµÄ\r £©¡ª¡ª Git µÄ fast-import ¶Ô½öʹÓû»Ðзû£¨LF£©¶ø·Ç
Windows µÄ»Ø³µ·û£¨CRLF£©ÒªÇó·Ç³£Ñϸñ¡£
Ê×ÏÈ£¬½øÈëÄ¿±êĿ¼²¢ÇÒÕÒµ½ËùÓÐ×ÓĿ¼£¬Ã¿Ò»¸ö×ÓĿ¼½«×÷Ϊһ¸ö¿ìÕÕ±»µ¼ÈëΪһ¸ö
commit¡£ÎÒÃǽ«ÒÀ´Î½øÈëÿһ¸ö×ÓĿ¼²¢´òÓ¡ËùÐèµÄÃüÁîÀ´µ¼³öËüÃÇ¡£½Å±¾µÄÖ÷Ñ»·´óÖÂÊÇÕâÑù£º
last_mark = nil # Ñ»·±éÀúËùÓÐĿ¼ Dir.chdir(ARGV[0]) do Dir.glob("*")
.each do |dir| next if File.file?(dir) # ½øÈëÄ¿±êĿ¼ |
ÎÒÃÇÔÚÿһ¸öĿ¼ÀïÔËÐÐ print_export £¬Ëü»áÈ¡³öÉÏÒ»¸ö¿ìÕÕµÄË÷ÒýºÍ±ê¼Ç²¢·µ»Ø±¾´Î¿ìÕÕµÄË÷ÒýºÍ±ê¼Ç£»ÓÉ´ËÎÒÃǾͿÉÒÔÕýÈ·µÄ°Ñ¶þÕßÁ¬½ÓÆðÀ´¡£¡±±ê¼Ç£¨mark£©¡±
ÊÇfast-import ÖÐ¶Ô commit ±êʶ·ûµÄ½Ð·¨£»ÔÚ´´½¨ commit µÄͬʱ£¬ÎÒÃÇÖðÒ»¸³ÓèÒ»¸ö±ê¼ÇÒÔ±ãÒÔºóÔÚ°ÑËüÁ¬½Óµ½ÆäËû
commit ʱʹÓá£Òò´Ë£¬ÔÚprint_export ·½·¨ÖÐÒª×öµÄµÚÒ»¼þʾÍÊǸù¾ÝĿ¼ÃûÉú³ÉÒ»¸ö±ê¼Ç£º
mark = convert_dir_to_mark(dir) |
ʵÏָú¯ÊýµÄ·½·¨Êǽ¨Á¢Ò»¸öĿ¼µÄÊý×éÐòÁв¢Ê¹ÓÃÊý×éµÄË÷ÒýÖµ×÷Ϊ±ê¼Ç£¬ÒòΪ±ê¼Ç±ØÐëÊÇÒ»¸öÕûÊý¡£Õâ¸ö·½·¨´óÖÂÊÇÕâÑùµÄ£º
$marks = [] def convert_dir_to_mark(dir) if !$marks.include?(dir) $marks << dir end ($marks.index(dir) + 1).to_s end |
ÓÐÁËÕûÊýÀ´´ú±íÿ¸ö commit£¬ÎÒÃÇÏÖÔÚÐèÒªÌá½»¸½¼ÓÐÅÏ¢ÖеÄÈÕÆÚ¡£ÓÉÓÚÈÕÆÚÊÇÓÃĿ¼Ãû±íʾµÄ£¬ÎÒÃǾʹÓÖнâÎö³öÀ´¡£print_export
ÎļþµÄÏÂÒ»Ðн«ÊÇ£º
date = convert_dir_to_date(dir) |
¶ø convert_dir_to_date Ôò¶¨ÒåΪ
def convert_dir_to_date(dir) if dir == 'current' return Time.now().to_i else dir
= dir.gsub('back_', '') (year, month, day) |
ËüΪÿ¸öĿ¼·µ»ØÒ»¸öÕûÐÍÖµ¡£Ìá½»¸½¼ÓÐÅÏ¢Àï×îºóÒ»ÏîËùÐèµÄÊÇÌá½»ÕßÊý¾Ý£¬ÎÒÃÇÔÚÒ»¸öÈ«¾Ö±äÁ¿ÖÐÖ±½Ó¶¨ÒåÖ®£º
$author = 'Scott Chacon <schacon@example.com>' |
ÎÒÃDz¶à¿ÉÒÔ¿ªÊ¼Îªµ¼Èë½Å±¾Êä³öÌá½»Êý¾ÝÁË¡£µÚÒ»ÏîÐÅÏ¢Ö¸Ã÷ÎÒÃǶ¨ÒåµÄÊÇÒ»¸ö
commit ¶ÔÏóÒÔ¼°ËüËùÔڵķÖÖ§£¬ËæºóÊÇÎÒÃÇÉú³ÉµÄ±ê¼Ç£¬Ìá½»ÕßÐÅÏ¢ÒÔ¼°Ìá½»±¸×¢£¬È»ºóÊÇǰһ¸ö commit
µÄË÷Òý£¬Èç¹ûÓеϰ¡£´úÂë´óÖÂÕâÑù£º
# ´òÓ¡µ¼ÈëËùÐèµÄÐÅÏ¢ puts 'commit refs/heads/master' puts 'mark :'
+ mark puts "committer #{$author} #{date} -0700" export_da |
Ê±Çø£¨-0700£©´¦ÓÚ¼ò»¯Ä¿µÄʹÓÃÓ²±àÂë¡£Èç¹ûÊÇ´ÓÆäËû°æ±¾¿ØÖÆÏµÍ³µ¼È룬Ôò±ØÐëÒÔ±äÁ¿µÄÐÎʽָÃ÷Ê±Çø¡£
Ìá½»±¸×¢±ØÐëÒÔÌØ¶¨¸ñʽ¸ø³ö£º
¸Ã¸ñʽ°üº¬Á˵¥´Ê data£¬Ëù¶ÁÈ¡Êý¾ÝµÄ´óС£¬Ò»¸ö»»Ðзû£¬×îºóÊÇÊý¾Ý±¾Éí¡£ÓÉÓÚËæºóÖ¸Ã÷ÎļþÄÚÈݵÄʱºòÒªÓõ½ÏàͬµÄ¸ñʽ£¬ÎÒÃÇдһ¸ö¸¨Öú·½·¨£¬export_data£º
def export_data(string) print "data #{string.size}\n#{string}" end |
ΨһʣϵľÍÊÇÿһ¸ö¿ìÕÕµÄÄÚÈÝÁË¡£Õâ¼òµ¥µÄºÜ£¬ÒòΪËüÃÇ·Ö±ð´¦ÓÚÒ»¸öĿ¼¡ª¡ªÄã¿ÉÒÔÊä³ö
deleeall ÃüÁî£¬ËæºóÊÇĿ¼ÖÐÿ¸öÎļþµÄÄÚÈÝ¡£Git »áÕýÈ·µÄ¼Ç¼ÿһ¸ö¿ìÕÕ£º
puts 'deleteall' Dir.glob("**/*").each do |file| next if !File.file?(file) inline_data(file) end |
×¢Ò⣺ÓÉÓںܶàϵͳ°Ñÿ´ÎÐÞ¶©¿´×÷Ò»¸ö commit µ½ÁíÒ»¸ö commit
µÄ±ä»¯Á¿£¬fast-import Ò²¿ÉÒÔÒÀ¾Ýÿ´ÎÌá½»»ñȡһ¸öÃüÁîÀ´Ö¸³öÄÄЩÎļþ±»Ìí¼Ó£¬É¾³ý»òÕßÐ޸Ĺý£¬ÒÔ¼°Ð޸ĵÄÄÚÈÝ¡£ÎÒÃǽ«ÐèÒª¼ÆËã¿ìÕÕÖ®¼äµÄ²î±ð²¢ÇÒ½ö½ö¸ø³öÕâÏîÊý¾Ý£¬²»¹ý¸Ã×ö·¨Òª¸´ÔӺܶࡪ¡ª»¹Èç²»Ö±½Ó°ÑËùÓÐÊý¾Ý¶ª¸ø
Git È»Ëü×Ô¼º¸ãÇå³þ¡£¼ÙÈçÇ°ÃæÕâ¸ö·½·¨¸üÊÊÓÃÓÚÄãµÄÊý¾Ý£¬²Î¿¼fast-import µÄ man °ïÖúÒ³ÃæÀ´Á˽âÈçºÎÒÔÕâÖÖ·½Ê½ÌṩÊý¾Ý¡£
ÁоÙÐÂÎļþÄÚÈÝ»òÕßÖ¸Ã÷´øÓÐÐÂÄÚÈݵÄÒÑÐÞ¸ÄÎļþµÄ¸ñʽÈçÏ£º
M 644 inline path/to/file data (size) (file contents) |
ÕâÀ644 ÊÇȨÏÞģʽ£¨¼ÓÈëÓпÉÖ´ÐÐÎļþ£¬ÔòÐèҪ̽²âÖ®²¢É趨Ϊ 755£©£¬¶ø
inline ˵Ã÷ÎÒÃÇÔÚ±¾ÐнáÊøÖ®ºóÁ¢¼´ÁгöÎļþµÄÄÚÈÝ¡£ÎÒÃÇµÄ inline_data ·½·¨´óÖÂÊÇ£º
def inline_data(file, code = 'M', mode = '644') content =
File.read(file) puts "#{code} #{mode} inline #{file}" export_data(c |
ÎÒÃÇÖØÓÃÁËÇ°Ãæ¶¨Òå¹ýµÄ export_data£¬ÒòΪÕâÀïºÍÖ¸Ã÷Ìá½»×¢Ê͵ĸñʽÈç³öÒ»ÕÞ¡£
×îºóÒ»Ï×÷ÊÇ·µ»Øµ±Ç°µÄ±ê¼ÇÒÔ±ãÏ´ÎÑ»·µÄʹÓá£
×¢Ò⣺Èç¹ûÄãÔÚÓà Windows£¬Ò»¶¨¼ÇµÃÌí¼ÓÒ»Ïî¶îÍâµÄ²½Öè¡£Ç°ÃæÌá¹ý£¬Windows
ʹÓà CRLF ×÷Ϊ»»ÐÐ×Ö·û¶ø Git fast-import Ö»½ÓÊÜ LF¡£ÎªÁËÈÆ¿ªÕâ¸öÎÊÌâÀ´Âú×ã git
fast-import£¬ÄãÐèÒªÈà ruby Óà LF È¡´ú CRLF£º
¸ã¶¨ÁË¡£ÏÖÔÚÔËÐиýű¾£¬Ä㽫µÃµ½ÈçÏÂÄÚÈÝ£º
$ ruby import.rb /opt/import_from commit refs/heads/master mark :
1 committer Scott Chacon <schacon@geemail.com> 1230883200 -0 |
ÒªÔËÐе¼Èë½Å±¾£¬ÔÚÐèÒªµ¼ÈëµÄĿ¼°Ñ¸ÃÄÚÈÝÓùܵÀ¶¨Ïòµ½ git fast-import¡£Äã¿ÉÒÔ½¨Á¢Ò»¸ö¿ÕĿ¼ȻºóÔËÐÐ
git init ×÷Ϊ¿ªÍ·£¬È»ºóÔËÐиýű¾£º
$ git init Initialized empty Git repository in /opt/import_to/
.git/ $ ruby import.rb /opt/import_from | git fast-import git-f |
Äã»á·¢ÏÖ£¬ÔÚËü³É¹¦Ö´ÐÐÍê±ÏÒÔºó£¬»á¸ø³öÒ»¶ÑÓйØÒÑÍê³É¹¤×÷µÄÊý¾Ý¡£ÉÏÀýÔÚÒ»¸ö·ÖÖ§µ¼ÈëÁË5´ÎÌá½»Êý¾Ý£¬°üº¬ÁË18¸ö¶ÔÏó¡£ÏÖÔÚ¿ÉÒÔÔËÐÐ
git log À´¼ìÊÓеÄÀúÊ·£º
$ git log -2 commit 10bfe7d22ce15ee25b60a824c8982157ca593d41 Author:
Scott Chacon <schacon@example.com> Date: Sun May 3 12:5 |
¾ÍËüÁË¡ª¡ªÒ»¸ö¸É¾»Õû½àµÄ Git ²Ö¿â¡£ÐèҪעÒâµÄÊÇ´ËʱûÓÐÈκÎÄÚÈݱ»¼ì³ö¡ª¡ª¸Õ¿ªÊ¼µ±Ç°Ä¿Â¼ÀïûÓÐÈκÎÎļþ¡£Òª»ñÈ¡ËüÃÇ£¬ÄãµÃתµ½
master ·ÖÖ§µÄËùÔÚ£º
$ ls $ git reset --hard master HEAD is now at 10bfe7d imported from current $ ls file.rb lib |
fast-import »¹¿ÉÒÔ×ö¸ü¶à¡ª¡ª´¦Àí²»Í¬µÄÎļþģʽ£¬¶þ½øÖÆÎļþ£¬¶àÖØ·ÖÖ§ÓëºÏ²¢£¬±êÇ©£¬½øÕ¹±êʶµÈµÈ¡£Ò»Ð©¸ü¼Ó¸´ÔÓµÄʵÀý¿ÉÒÔÔÚ
Git Ô´ÂëµÄcontib/fast-import Ŀ¼ÀïÕÒµ½£»ÆäÖнÏΪ³öÖÚµÄÊÇÇ°ÃæÌá¹ýµÄ git-p4
½Å±¾¡£
8.3 ×ܽá
ÏÖÔÚµÄÄãÓ¦¸ÃÕÆÎÕÁËÔÚ Subversion ÉÏʹÓà Git ÒÔ¼°°Ñ¼¸ºõÈκÎÏÈ´æ²Ö¿âÎÞËðʧµÄµ¼ÈëΪ
Git ²Ö¿â¡£ÏÂÒ»Õ½«½éÉÜ Git ÄÚ²¿µÄÔʼÊý¾Ý¸ñʽ£¬´Ó¶øÊÇʹÄãÄÜÇ×ÊÖ¶ÍÔìÆäÖеÄÿһ¸ö×Ö½Ú£¬Èç¹û±ØÒªµÄ»°¡£ |