Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
GitÏê½âÖ®°Ë GitÓëÆäËûϵͳ£¨¶þ£©
 
×÷Õß kangearµÄ²©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-07-29
  1816  次浏览      27
 

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 push origin --all

ËùÓеķÖÖ§ºÍ±êÇ©ÏÖÔÚ¶¼Ó¦¸ÃÕûÆë¸É¾»µÄÌÉÔÚÐ嵀 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 (size)\n(contents)

¸Ã¸ñʽ°üº¬Á˵¥´Ê 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£¬ÒòΪÕâÀïºÍÖ¸Ã÷Ìá½»×¢Ê͵ĸñʽÈç³öÒ»ÕÞ¡£

×îºóÒ»Ï×÷ÊÇ·µ»Øµ±Ç°µÄ±ê¼ÇÒÔ±ãÏ´ÎÑ­»·µÄʹÓá£

return mark

×¢Ò⣺Èç¹ûÄãÔÚÓà Windows£¬Ò»¶¨¼ÇµÃÌí¼ÓÒ»Ïî¶îÍâµÄ²½Öè¡£Ç°ÃæÌá¹ý£¬Windows ʹÓà CRLF ×÷Ϊ»»ÐÐ×Ö·û¶ø Git fast-import Ö»½ÓÊÜ LF¡£ÎªÁËÈÆ¿ªÕâ¸öÎÊÌâÀ´Âú×ã git fast-import£¬ÄãÐèÒªÈà ruby Óà LF È¡´ú CRLF£º

$stdout.binmode

¸ã¶¨ÁË¡£ÏÖÔÚÔËÐиýű¾£¬Ä㽫µÃµ½ÈçÏÂÄÚÈÝ£º

$ 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 ÄÚ²¿µÄԭʼÊý¾Ý¸ñʽ£¬´Ó¶øÊÇʹÄãÄÜÇ×ÊÖ¶ÍÔìÆäÖеÄÿһ¸ö×Ö½Ú£¬Èç¹û±ØÒªµÄ»°¡£

   
1816 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÿÈÕ¹¹½¨½â¾ö·½°¸
ÈçºÎÖÆ¶¨ÓÐЧµÄÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀíÖ÷Òª»î¶¯¼°ÊµÏÖ·½·¨
¹¹½¨¹ÜÀíÈëÃÅ
Ïà¹ØÎĵµ

ÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀí°×ƤÊé
CM09_CÅäÖùÜÀí±ê×¼
ʹÓÃSVN½øÐа汾¿ØÖÆ
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀíʵ¼ù
ÅäÖùÜÀí·½·¨¡¢¹¤¾ßÓëÓ¦ÓÃ
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
²úÆ··¢²¼¹ÜÀí
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]


Èí¼þÅäÖùÜÀíµÄÎÊÌ⡢ĿµÄ
Èí¼þÅäÖùÜÀí¹æ·¶
CQWeb 7.1ÐÔÄܲâÊÔÓëµ÷ÓÅÖ¸ÄÏ
ΪʲôÐèҪʹÓÃClearCase
ClearCaseÓëRTCµÄ¼¯³É
ÀûÓÃClearQuest ½øÐвâÊÔ¹ÜÀí


²úÆ··¢²¼¹ÜÀí
ÅäÖùÜÀí·½·¨¡¢Êµ¼ù¡¢¹¤¾ß
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
ʹÓÃCCÓëCQ½øÐÐÏîĿʵ¼ù
CVSÓëÅäÖùÜÀí
Subversion¹ÜÀíÔ±


ÅäÖùÜÀíʵ¼ù£¨´Ó×éÖ¯¼¶µ½ÏîÄ¿¼¶£©
ͨºÅÔº ÅäÖùÜÀí¹æ·¶ÓëÓ¦ÓÃ
ÅäÖùÜÀíÈÕ¹¹½¨¼°³ÖÐø¼¯³É
µ¤·ð˹ ClearCaseÓëÅäÖùÜÀí
ÖйúÒÆ¶¯ Èí¼þÅäÖùÜÀí
ÖйúÒøÐÐ Èí¼þÅäÖùÜÀí
Ìì½ò»ªÒíÀ¶Ìì¿Æ¼¼ ÅäÖùÜÀíÓëPvcs