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

1Ôª 10Ôª 50Ôª





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



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

µ½Ä¿Ç°ÎªÖ¹£¬ÎÒ²ûÊöÁË Git »ù±¾µÄÔË×÷»úÖÆºÍʹÓ÷½Ê½£¬½éÉÜÁË Git ÌṩµÄÐí¶à¹¤¾ßÀ´°ïÖúÄã¼òµ¥ÇÒÓÐЧµØÊ¹ÓÃËü¡£ ÔÚ±¾Õ£¬ÎÒ½«»á½éÉÜ Git µÄÒ»Ð©ÖØÒªµÄÅäÖ÷½·¨ºÍ¹³×Ó»úÖÆÒÔÂú×ã×Ô¶¨ÒåµÄÒªÇó¡£Í¨¹ýÕâЩ¹¤¾ß£¬Ëü»áºÍÄãºÍ¹«Ë¾»òÍŶÓÅäºÏµÃÌìÒÂÎÞ·ì¡£

7.1 ÅäÖÃ Git

ÈçµÚÒ»ÕÂËùÑÔ£¬ÓÃgit configÅäÖà Git£¬Òª×öµÄµÚÒ»¼þʾÍÊÇÉèÖÃÃû×ÖºÍÓÊÏ䵨ַ£º

$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com

´ÓÏÖÔÚ¿ªÊ¼£¬Äã»áÁ˽⵽һЩÀàËÆÒÔÉϵ«¸üΪÓÐȤµÄÉèÖÃÑ¡ÏîÀ´×Ô¶¨Òå Git¡£

ÏȹýÒ»±éµÚÒ»ÕÂÖÐÌáµ½µÄ Git ÅäÖÃϸ½Ú¡£Git ʹÓÃһϵÁеÄÅäÖÃÎļþÀ´´æ´¢Ä㶨ÒåµÄÆ«ºÃ£¬ËüÊ×ÏÈ»á²éÕÒ/etc/gitconfigÎļþ£¬¸ÃÎļþº¬ÓÐ ¶ÔϵͳÉÏËùÓÐÓû§¼°ËûÃÇËùÓµÓеIJֿⶼÉúЧµÄÅäÖÃÖµ£¨Òë×¢£ºgitconfigÊÇÈ«¾ÖÅäÖÃÎļþ£©£¬ Èç¹û´«µÝ--systemÑ¡Ïî¸øgit configÃüÁ Git »á¶ÁдÕâ¸öÎļþ¡£

½ÓÏÂÀ´ Git »á²éÕÒÿ¸öÓû§µÄ~/.gitconfigÎļþ£¬ÄãÄÜ´«µÝ--globalÑ¡ÏîÈà Git¶Áд¸ÃÎļþ¡£

×îºó Git »á²éÕÒÓÉÓû§¶¨ÒåµÄ¸÷¸ö¿âÖÐ Git Ŀ¼ÏµÄÅäÖÃÎļþ£¨.git/config£©£¬¸ÃÎļþÖеÄÖµÖ»¶ÔÊôÖ÷¿âÓÐЧ¡£ ÒÔÉϲûÊöµÄÈý²ãÅäÖôÓÒ»°ãµ½ÌØÊâ²ã²ãÍÆ½ø£¬Èç¹û¶¨ÒåµÄÖµÓгåÍ»£¬ÒÔºóÃæ²ãÖж¨ÒåµÄΪ׼£¬ÀýÈ磺ÔÚ.git/configºÍ/etc/gitconfigµÄ½ÏÁ¿ÖУ¬.git/configÈ¡µÃÁËʤÀû¡£ËäÈ»ÄãÒ²¿ÉÒÔÖ±½ÓÊÖ¶¯±à¼­ÕâЩÅäÖÃÎļþ£¬µ«ÊÇÔËÐÐgit configÃüÁ»áÀ´µÃ¼òµ¥Ð©¡£

¿Í»§¶Ë»ù±¾ÅäÖÃ

Git Äܹ»Ê¶±ðµÄÅäÖÃÏî±»·ÖΪÁËÁ½´óÀࣺ¿Í»§¶ËºÍ·þÎñÆ÷¶Ë£¬ÆäÖд󲿷ֻùÓÚÄã¸öÈ˹¤×÷Æ«ºÃ£¬ÊôÓÚ¿Í»§¶ËÅäÖ᣾¡¹ÜÓÐÊý²»¾¡µÄÑ¡Ïµ«ÎÒÖ»²ûÊö ÆäÖо­³£Ê¹ÓûòÕß»á¶ÔÄãµÄ¹¤×÷Á÷²úÉú¾Þ´óÓ°ÏìµÄÑ¡ÏÈç¹ûÄãÏë¹Û²ìÄ㵱ǰµÄ Git ÄÜʶ±ðµÄÑ¡ÏîÁÐ±í£¬ÇëÔËÐÐ

$ git config --help

git configµÄÊÖ²áÒ³£¨Òë×¢£ºÒÔmanÃüÁîµÄÏÔʾ·½Ê½£©·Ç³£Ï¸ÖµØÂÞÁÐÁËËùÓпÉÓõÄÅäÖÃÏî¡£

core.editor

GitĬÈÏ»áµ÷ÓÃÄãµÄ»·¾³±äÁ¿editor¶¨ÒåµÄÖµ×÷ΪÎı¾±à¼­Æ÷£¬Èç¹ûûÓж¨ÒåµÄ»°£¬»áµ÷ÓÃViÀ´´´½¨ºÍ±à¼­Ìá½»ÒÔ¼°±êÇ©ÐÅÏ¢£¬ Äã¿ÉÒÔʹÓÃcore.editor¸Ä±äĬÈϱ༭Æ÷£º

$ git config --global core.editor emacs

ÏÖÔÚÎÞÂÛÄãµÄ»·¾³±äÁ¿editor±»¶¨Òå³Éʲô£¬Git ¶¼»áµ÷ÓÃEmacs±à¼­ÐÅÏ¢¡£

commit.template

Èç¹û°Ñ´ËÏîÖ¸¶¨ÎªÄãϵͳÉϵÄÒ»¸öÎļþ£¬µ±ÄãÌá½»µÄʱºò£¬ Git »áĬÈÏʹÓøÃÎļþ¶¨ÒåµÄÄÚÈÝ¡£ ÀýÈ磺Äã´´½¨ÁËÒ»¸öÄ£°åÎļþ$HOME/.gitmessage.txt£¬Ëü¿´ÆðÀ´ÏñÕâÑù£º

subject line what happened [ticket: X]

ÉèÖÃcommit.template£¬µ±ÔËÐÐgit commitʱ£¬ Git »áÔÚÄãµÄ±à¼­Æ÷ÖÐÏÔʾÒÔÉϵÄÄÚÈÝ£¬ ÉèÖÃcommit.templateÈçÏ£º

$ git config --global commit.template $HOME/.gitmessage.txt $ git commit

È»ºóµ±ÄãÌύʱ£¬Ôڱ༭Æ÷ÖÐÏÔʾµÄÌá½»ÐÅÏ¢ÈçÏ£º

subject line what happened [ticket: X]
#Please enter the commit message for your changes. Lines starting # with '#' will be

Èç¹ûÄãÓÐÌØ¶¨µÄ²ßÂÔÒªÔËÓÃÔÚÌá½»ÐÅÏ¢ÉÏ£¬ÔÚϵͳÉÏ´´½¨Ò»¸öÄ£°åÎļþ£¬ÉèÖà Git ĬÈÏʹÓÃËü£¬ÕâÑùµ±Ìύʱ£¬ÄãµÄ²ßÂÔÿ´Î¶¼»á±»ÔËÓá£

core.pager

core.pagerÖ¸¶¨ Git ÔËÐÐÖîÈçlog¡¢diffµÈËùʹÓõķÖÒ³Æ÷£¬ÄãÄÜÉèÖóÉÓÃmore»òÕßÈκÎÄãϲ»¶µÄ·ÖÒ³Æ÷£¨Ä¬ÈÏÓõÄÊÇless£©£¬ µ±È»ÄãÒ²¿ÉÒÔʲô¶¼²»Óã¬ÉèÖÿÕ×Ö·û´®£º

$ git config --global core.pager ''

ÕâÑù²»¹ÜÃüÁîµÄÊä³öÁ¿¶àÉÙ£¬¶¼»áÔÚÒ»Ò³ÏÔʾËùÓÐÄÚÈÝ¡£

user.signingkey

Èç¹ûÄãÒª´´½¨¾­Ç©ÊðµÄº¬¸½×¢µÄ±êÇ©£¨ÕýÈçµÚ¶þÕÂËùÊö£©£¬ÄÇô°ÑÄãµÄGPGÇ©ÊðÃÜÔ¿ÉèÖÃΪÅäÖÃÏî»á¸üºÃ£¬ÉèÖÃÃÜÔ¿IDÈçÏ£º

$ git config --global user.signingkey <gpg-key-id>

ÏÖÔÚÄãÄܹ»Ç©Êð±êÇ©£¬´Ó¶ø²»±ØÃ¿´ÎÔËÐÐgit tagÃüÁîʱ¶¨ÒåÃÜÔ¿£º

$ git tag -s <tag-name>

core.excludesfile

ÕýÈçµÚ¶þÕÂËùÊö£¬ÄãÄÜÔÚÏîÄ¿¿âµÄ.gitignoreÎļþÀïÍ·ÓÃģʽÀ´¶¨ÒåÄÇЩÎÞÐèÄÉÈë Git ¹ÜÀíµÄÎļþ£¬ÕâÑùËüÃDz»»á³öÏÖÔÚδ¸ú×ÙÁÐ±í£¬ Ò²²»»áÔÚÄãÔËÐÐgit addºó±»Ôݴ档Ȼ¶ø£¬Èç¹ûÄãÏëÓÃÏîÄ¿¿âÖ®ÍâµÄÎļþÀ´¶¨ÒåÄÇЩÐè±»ºöÂÔµÄÎļþµÄ»°£¬ÓÃcore.excludesfile ֪ͨ Git ¸ÃÎļþËù´¦µÄλÖã¬ÎļþÄÚÈݺÍ.gitignoreÀàËÆ¡£

help.autocorrect

¸ÃÅäÖÃÏîÖ»ÔÚ Git 1.6.1¼°ÒÔÉϰ汾ÓÐЧ£¬¼ÙÈçÄãÔÚGit 1.6Öдí´òÁËÒ»ÌõÃüÁ»áÏÔʾ£º

$ git com git: 'com' is not a git-command. See 'git --help'. Did you mean this? commit

Èç¹ûÄã°Ñhelp.autocorrectÉèÖóÉ1£¨Òë×¢£ºÆô¶¯×Ô¶¯ÐÞÕý£©£¬ÄÇôÔÚÖ»ÓÐÒ»¸öÃüÁģºýÆ¥Åäµ½µÄÇé¿öÏ£¬Git »á×Ô¶¯ÔËÐиÃÃüÁî¡£

GitÖеÄ×ÅÉ«

GitÄܹ»ÎªÊä³öµ½ÄãÖն˵ÄÄÚÈÝ×ÅÉ«£¬ÒÔ±ãÄã¿ÉÒÔÆ¾Ö±¹Û½øÐпìËÙ¡¢¼òµ¥µØ·ÖÎö£¬ÓÐÐí¶àÑ¡ÏîÄܹ©ÄãʹÓÃÒÔ·ûºÏÄãµÄÆ«ºÃ¡£

color.ui

Git»á°´ÕÕÄãÐèÒª×Ô¶¯Îª´ó²¿·ÖµÄÊä³ö¼ÓÉÏÑÕÉ«£¬ÄãÄÜÃ÷È·µØ¹æ¶¨ÄÄЩÐèÒª×ÅÉ«ÒÔ¼°ÔõÑù×ÅÉ«£¬ÉèÖÃcolor.uiΪtrueÀ´´ò¿ªËùÓеÄĬÈÏÖÕ¶Ë×ÅÉ«¡£

$ git config --global color.ui true

ÉèÖúÃÒԺ󣬵±Êä³öµ½ÖÕ¶Ëʱ£¬Git »áΪ֮¼ÓÉÏÑÕÉ«¡£ÆäËûµÄ²ÎÊý»¹ÓÐfalseºÍalways£¬falseÒâζ×Ų»ÎªÊä³ö×ÅÉ«£¬¶øalwaysÔò±íÃ÷ÔÚÈκÎÇé¿ö϶¼Òª×ÅÉ«£¬¼´Ê¹ Git ÃüÁî±»ÖØ¶¨Ïòµ½Îļþ»ò¹ÜµÀ¡£Git 1.5.5°æ±¾Òý½øÁË´ËÏîÅäÖã¬Èç¹ûÄãÓµÓеİ汾¸üÀÏ£¬Äã±ØÐë¶ÔÑÕÉ«ÓйØÑ¡Ïî¸÷×Ô½øÐÐÏêϸµØÉèÖá£

Äã»áºÜÉÙÓõ½color.ui = always£¬ÔÚ´ó¶àÊýÇé¿öÏ£¬Èç¹ûÄãÏëÔÚ±»Öض¨ÏòµÄÊä³öÖвåÈëÑÕÉ«Â룬ÄãÄÜ´«µÝ--color±êÖ¾¸ø Git ÃüÁîÀ´ÆÈʹËüÕâô×ö£¬color.ui = trueÓ¦¸ÃÊÇÄãµÄÊ×Ñ¡¡£

color.*

ÏëÒª¾ßÌåµ½ÄÄЩÃüÁîÊä³öÐèÒª±»×ÅÉ«ÒÔ¼°ÔõÑù×ÅÉ«»òÕß Git µÄ°æ±¾ºÜÀÏ£¬Äã¾ÍÒªÓõ½ºÍ¾ßÌåÃüÁîÓйصÄÑÕÉ«ÅäÖÃÑ¡ÏËüÃǶ¼Äܱ»ÖÃΪtrue¡¢false»òalways£º

color.branch color.diff color.interactive color.status

³ý´ËÖ®Í⣬ÒÔÉÏÿ¸öÑ¡Ïî¶¼ÓÐ×ÓÑ¡Ï¿ÉÒÔ±»ÓÃÀ´¸²¸ÇÆä¸¸ÉèÖã¬ÒԴﵽΪÊä³öµÄ¸÷¸ö²¿·Ö×ÅÉ«µÄÄ¿µÄ¡£ÀýÈ磬ÈÃdiffÊä³öµÄ¸Ä±äÐÅÏ¢ÒÔ´ÖÌå¡¢À¶É«Ç°¾°ºÍºÚÉ«±³¾°µÄÐÎʽÏÔʾ£º

$ git config --global color.diff.meta ¡°blue black bold¡±

ÄãÄÜÉèÖõÄÑÕɫֵÈ磺normal¡¢black¡¢red¡¢green¡¢yellow¡¢blue¡¢magenta¡¢cyan¡¢white£¬ÕýÈçÒÔÉÏÀý×ÓÉèÖõĴÖÌåÊôÐÔ£¬ÏëÒªÉèÖÃ×ÖÌåÊôÐԵϰ£¬¿ÉÒÔÑ¡ÔñÈ磺bold¡¢dim¡¢ul¡¢blink¡¢reverse¡£

Èç¹ûÄãÏëÅäÖÃ×ÓÑ¡ÏîµÄ»°£¬¿ÉÒԲο¼git config°ïÖúÒ³¡£

ÍⲿµÄºÏ²¢Óë±È½Ï¹¤¾ß

ËäÈ» Git ×Ô¼ºÊµÏÖÁËdiff,¶øÇÒµ½Ä¿Ç°ÎªÖ¹ÄãÒ»Ö±ÔÚʹÓÃËü£¬µ«ÄãÄܹ»ÓÃÒ»¸öÍⲿµÄ¹¤¾ßÌæ´úËü£¬³ý´ËÒÔÍ⣬Ä㻹ÄÜÓÃÒ»¸öͼÐλ¯µÄ¹¤¾ßÀ´ºÏ²¢ºÍ½â¾ö³åÍ»´Ó¶ø²»±Ø×Ô¼ºÊÖ¶¯½â¾ö¡£ÓÐÒ»¸ö²»´íÇÒÃâ·ÑµÄ¹¤¾ß¿ÉÒÔ±»ÓÃÀ´×ö±È½ÏºÍºÏ²¢¹¤×÷£¬Ëü¾ÍÊÇP4Merge£¨Òë×¢£ºPerforceͼÐλ¯ºÏ²¢¹¤¾ß£©£¬ÎÒ»áչʾËüµÄ°²×°¹ý³Ì¡£

P4Merge¿ÉÒÔÔÚËùÓÐÖ÷Á÷ƽ̨ÉÏÔËÐУ¬ÏÖÔÚ¿ªÊ¼´óµ¨³¢ÊÔ°É¡£¶ÔÓÚÏòÄãչʾµÄÀý×Ó£¬ÔÚMacºÍLinuxϵͳÉÏ£¬ÎÒ»áʹÓ÷¾¶Ãû£¬ÔÚWindowsÉÏ£¬/usr/local/binÓ¦¸Ã±»¸ÄΪÄã»·¾³ÖеĿÉÖ´Ðз¾¶¡£

ÏÂÔØP4Merge£ºhttp://www.perforce.com/perforce/downloads/component.html

Ê×ÏȰÑÄãÒªÔËÐеÄÃüÁî·ÅÈëÍⲿ°ü×°½Å±¾ÖУ¬ÎÒ»áʹÓÃMacϵͳÉϵÄ·¾¶À´Ö¸¶¨¸Ã½Å±¾µÄλÖã¬ÔÚÆäËûϵͳÉÏ£¬ËüÓ¦¸Ã±»·ÅÖÃÔÚ¶þ½øÖÆÎļþp4mergeËùÔÚµÄĿ¼ÖС£´´½¨Ò»¸ömerge°ü×°½Å±¾£¬Ãû×Ö½Ð×÷extMerge£¬ÈÃËü´ø²ÎÊýµ÷ÓÃp4merge¶þ½øÖÆÎļþ£º

$ cat /usr/local/bin/extMerge #!/bin/sh /Applications/p4merge.app/Contents/MacOS/p4merge $*

diff°ü×°½Å±¾Ê×ÏÈÈ·¶¨´«µÝ¹ýÀ´7¸ö²ÎÊý£¬Ëæºó°ÑÆäÖÐ2¸ö´«µÝ¸ømerge°ü×°½Å±¾£¬Ä¬ÈÏÇé¿öÏ£¬ Git ´«µÝÒÔϲÎÊý¸ødiff£º

path old-file old-hex old-mode new-file new-hex new-mode

ÓÉÓÚÄã½ö½öÐèÒªold-fileºÍnew-file²ÎÊý£¬ÓÃdiff°ü×°½Å±¾À´´«µÝËüÃǰɡ£

$ cat /usr/local/bin/extDiff #!/bin/sh [ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"

È·ÈÏÕâÁ½¸ö½Å±¾ÊÇ¿ÉÖ´Ðеģº

$ sudo chmod +x /usr/local/bin/extMerge $ sudo chmod +x /usr/local/bin/extDiff

ÏÖÔÚÀ´ÅäÖÃʹÓÃÄã×Ô¶¨ÒåµÄ±È½ÏºÍºÏ²¢¹¤¾ß°É¡£ÕâÐèÒªÐí¶à×Ô¶¨ÒåÉèÖãºmerge.tool֪ͨ Git ʹÓÃÄĸöºÏ²¢¹¤¾ß£»mergetool.*.cmd¹æ¶¨ÃüÁîÔËÐеķ½Ê½£»mergetool.trustExitCode»á֪ͨ Git ³ÌÐòµÄÍ˳öÊÇ·ñָʾºÏ²¢²Ù×÷³É¹¦£»diff.external֪ͨ Git ÓÃʲôÃüÁî×ö±È½Ï¡£Òò´Ë£¬ÄãÄÜÔËÐÐÒÔÏÂ4ÌõÅäÖÃÃüÁ

$ git config --global merge.tool extMerge $ git config --global
 mergetool.extMerge.cmd \ 'extMerge "$BASE" "$LOCAL" "$REMOTE

»òÕßÖ±½Ó±à¼­~/.gitconfigÎļþÈçÏ£º

[merge] tool = extMerge [mergetool "extMerge"] cmd = extMerge "$BASE"
 "$LOCAL" "$REMOTE" "$MERGED" trustExitCode = false [dif

ÉèÖÃÍê±Ïºó£¬ÔËÐÐdiffÃüÁ

$ git diff 32d1776b1^ 32d1776b1

ÃüÁîÐоÓȻûÓз¢ÏÖdiffÃüÁîµÄÊä³ö£¬Æäʵ£¬Git µ÷ÓÃÁ˸ոÕÉèÖõÄP4Merge¡£

µ±ÄãÉè·¨ºÏ²¢Á½¸ö·ÖÖ§£¬½á¹ûÈ´Óгåͻʱ£¬ÔËÐÐgit mergetool£¬Git »áµ÷ÓÃP4MergeÈÃÄãͨ¹ýͼÐνçÃæÀ´½â¾ö³åÍ»¡£

ÉèÖðü×°½Å±¾µÄºÃ´¦ÊÇÄãÄܼòµ¥µØ¸Ä±ädiffºÍmerge¹¤¾ß£¬ÀýÈç°ÑextDiffºÍextMerge¸Ä³ÉKDiff3£¬Òª×öµÄ½ö½öÊDZ༭extMerge½Å±¾Îļþ£º

$ cat /usr/local/bin/extMerge #!/bin/sh	 /Applications/kdiff3.app/Contents/MacOS/kdiff3 $*

ÏÖÔÚ Git »áʹÓÃKDiff3À´×ö±È½Ï¡¢ºÏ²¢ºÍ½â¾ö³åÍ»¡£

GitÔ¤ÏÈÉèÖÃÁËÐí¶àÆäËûµÄºÏ²¢ºÍ½â¾ö³åÍ»µÄ¹¤¾ß£¬¶øÄã²»±ØÉèÖÃcmd¡£¿ÉÒ԰Ѻϲ¢¹¤¾ßÉèÖÃΪ£ºkdiff3¡¢opendiff¡¢tkdiff¡¢ meld¡¢xxdiff¡¢emerge¡¢vimdiff¡¢gvimdiff¡£Èç¹ûÄã²»ÏëÓõ½KDiff3µÄËùÓй¦ÄÜ£¬Ö»ÊÇÏëÓÃËüÀ´ºÏ²¢£¬ÄÇôkdiff3 Õý·ûºÏÄãµÄÒªÇó£¬ÔËÐУº

$ git config --global merge.tool kdiff3

Èç¹ûÔËÐÐÁËÒÔÉÏÃüÁûÓÐÉèÖÃextMergeºÍextDiffÎļþ£¬Git »áÓÃKDiff3×öºÏ²¢£¬ÈÃͨ³£ÄÚÉèµÄ±È½Ï¹¤¾ßÀ´×ö±È½Ï¡£

¸ñʽ»¯Óë¿Õ°×

¸ñʽ»¯Óë¿Õ°×ÊÇÐí¶à¿ª·¢ÈËÔ±ÔÚЭ×÷ʱ£¬ÌرðÊÇÔÚ¿çÆ½Ì¨Çé¿öÏ£¬Óöµ½µÄÁîÈËÍ·ÌÛµÄϸСÎÊÌâ¡£ÓÉÓڱ༭Æ÷µÄ²»Í¬»òÕßWindows³ÌÐòÔ±ÔÚ¿çÆ½Ì¨ÏîÄ¿ÖеÄÎļþÐÐβ¼ÓÈëÁ˻سµ»»Ðзû£¬Ò»Ð©Ï¸Î¢µÄ¿Õ¸ñ±ä»¯»á²»¾­ÒâµØ½øÈë´ó¼ÒºÏ×÷µÄ¹¤×÷»òÌá½»µÄ²¹¶¡ÖС£²»ÓÃÅ£¬Git µÄһЩÅäÖÃÑ¡Ïî»á°ïÖúÄã½â¾öÕâЩÎÊÌâ¡£

core.autocrlf

¼ÙÈçÄãÕýÔÚWindowsÉÏд³ÌÐò£¬ÓÖ»òÕßÄãÕýÔÚºÍÆäËûÈ˺Ï×÷£¬ËûÃÇÔÚWindowsÉϱà³Ì£¬¶øÄãÈ´ÔÚÆäËûϵͳÉÏ£¬ÔÚÕâЩÇé¿öÏ£¬Äã¿ÉÄÜ»áÓöµ½ÐÐβ½áÊø·ûÎÊÌâ¡£ÕâÊÇÒòΪWindowsʹÓûسµºÍ»»ÐÐÁ½¸ö×Ö·ûÀ´½áÊøÒ»ÐУ¬¶øMacºÍLinuxֻʹÓû»ÐÐÒ»¸ö×Ö·û¡£ËäÈ»ÕâÊÇСÎÊÌ⣬µ«Ëü»á¼«´óµØÈÅÂÒ¿çÆ½Ì¨Ð­×÷¡£

Git¿ÉÒÔÔÚÄãÌύʱ×Ô¶¯µØ°ÑÐнáÊø·ûCRLFת»»³ÉLF£¬¶øÔÚÇ©³ö´úÂëʱ°ÑLFת»»³ÉCRLF¡£ÓÃcore.autocrlfÀ´´ò¿ª´ËÏÄÜ£¬Èç¹ûÊÇÔÚWindowsϵͳÉÏ£¬°ÑËüÉèÖóÉtrue£¬ÕâÑùµ±Ç©³ö´úÂëʱ£¬LF»á±»×ª»»³ÉCRLF£º

$ git config --global core.autocrlf true

Linux»òMacϵͳʹÓÃLF×÷ΪÐнáÊø·û£¬Òò´ËÄã²»Ïë Git ÔÚÇ©³öÎļþʱ½øÐÐ×Ô¶¯µÄת»»£»µ±Ò»¸öÒÔCRLFΪÐнáÊø·ûµÄÎļþ²»Ð¡Ðı»ÒýÈëʱÄã¿Ï¶¨Ïë½øÐÐÐÞÕý£¬°Ñcore.autocrlfÉèÖóÉinputÀ´¸æËß Git ÔÚÌύʱ°ÑCRLFת»»³ÉLF£¬Ç©³öʱ²»×ª»»£º

$ git config --global core.autocrlf input

ÕâÑù»áÔÚWindowsϵͳÉϵÄÇ©³öÎļþÖб£ÁôCRLF£¬»áÔÚMacºÍLinuxϵͳÉÏ£¬°üÀ¨²Ö¿âÖб£ÁôLF¡£

Èç¹ûÄãÊÇWindows³ÌÐòÔ±£¬ÇÒÕýÔÚ¿ª·¢½öÔËÐÐÔÚWindowsÉϵÄÏîÄ¿£¬¿ÉÒÔÉèÖÃfalseÈ¡Ïû´Ë¹¦ÄÜ£¬°Ñ»Ø³µ·û¼Ç¼ÔÚ¿âÖУº

$ git config --global core.autocrlf false

core.whitespace

GitÔ¤ÏÈÉèÖÃÁËһЩѡÏîÀ´Ì½²âºÍÐÞÕý¿Õ°×ÎÊÌ⣬Æä4ÖÖÖ÷ҪѡÏîÖеÄ2¸öĬÈϱ»´ò¿ª£¬Áí2¸ö±»¹Ø±Õ£¬Äã¿ÉÒÔ×ÔÓɵشò¿ª»ò¹Ø±ÕËüÃÇ¡£

ĬÈϱ»´ò¿ªµÄ2¸öÑ¡ÏîÊÇtrailing-spaceºÍspace-before-tab£¬trailing-space»á²éÕÒÿÐнáβµÄ¿Õ¸ñ£¬space-before-tab»á²éÕÒÿÐпªÍ·µÄÖÆ±í·ûǰµÄ¿Õ¸ñ¡£

ĬÈϱ»¹Ø±ÕµÄ2¸öÑ¡ÏîÊÇindent-with-non-tabºÍcr-at-eol£¬indent-with-non-tab»á²éÕÒ8¸öÒÔÉϿոñ£¨·ÇÖÆ±í·û£©¿ªÍ·µÄÐУ¬cr-at-eolÈà Git ÖªµÀÐÐβ»Ø³µ·ûÊǺϷ¨µÄ¡£

ÉèÖÃcore.whitespace£¬°´ÕÕÄãµÄÒâͼÀ´´ò¿ª»ò¹Ø±ÕÑ¡ÏѡÏîÒÔ¶ººÅ·Ö¸î¡£Í¨¹ý¶ººÅ·Ö¸îµÄÁ´ÖÐÈ¥µôÑ¡Ïî»òÔÚÑ¡Ïîǰ¼Ó-À´¹Ø±Õ£¬ÀýÈ磬Èç¹ûÄãÏëÒª´ò¿ª³ýÁËcr-at-eolÖ®ÍâµÄËùÓÐÑ¡Ï

$ git config --global core.whitespace \ trailing-space,space-before-tab,indent-with-non-tab

µ±ÄãÔËÐÐgit diffÃüÁîÇÒΪÊä³ö×Åɫʱ£¬Git ̽²âµ½ÕâЩÎÊÌ⣬Òò´ËÄãÒ²ÐíÔÚÌύǰÄÜÐÞ¸´ËüÃÇ£¬µ±ÄãÓÃgit apply´ò²¹¶¡Ê±Í¬ÑùÒ²»á´ÓÖÐÊÜÒæ¡£Èç¹ûÕý×¼±¸ÔËÓõIJ¹¶¡ÓÐÌØ±ðµÄ¿Õ°×ÎÊÌ⣬Äã¿ÉÒÔÈà Git ·¢¾¯¸æ£º

$ git apply --whitespace=warn <patch>

»òÕßÈà Git ÔÚ´òÉϲ¹¶¡Ç°×Ô¶¯ÐÞÕý´ËÎÊÌ⣺

$ git apply --whitespace=fix <patch>

ÕâЩѡÏîÒ²ÄÜÔËÓÃÓÚÑܺϡ£Èç¹ûÌá½»ÁËÓпհ×ÎÊÌâµÄÎļþµ«»¹Ã»ÍÆË͵½ÉÏÁ÷£¬Äã¿ÉÒÔÔËÐдøÓÐ--whitespace=fixÑ¡ÏîµÄrebaseÀ´ÈÃGitÔÚÖØÐ´²¹¶¡Ê±×Ô¶¯ÐÞÕýËüÃÇ¡£

·þÎñÆ÷¶ËÅäÖÃ

Git·þÎñÆ÷¶ËµÄÅäÖÃÑ¡Ïî²¢²»¶à£¬µ«ÈÔÓÐһЩÈÄÓÐÉúȤµÄÑ¡ÏîÖµµÃÄãÒ»¿´¡£

receive.fsckObjects

GitĬÈÏÇé¿öϲ»»áÔÚÍÆËÍÆÚ¼ä¼ì²éËùÓжÔÏóµÄÒ»ÖÂÐÔ¡£ËäÈ»»áÈ·ÈÏÿ¸ö¶ÔÏóµÄÓÐЧÐÔÒÔ¼°ÊÇ·ñÈÔȻƥÅäSHA-1¼ìÑéºÍ£¬µ« Git ²»»áÔÚÿ´ÎÍÆËÍʱ¶¼¼ì²éÒ»ÖÂÐÔ¡£¶ÔÓÚ Git À´Ëµ£¬¿â»òÍÆË͵ÄÎļþÔ½´ó£¬Õâ¸ö²Ù×÷´ú¼Û¾ÍÏà¶ÔÔ½¸ß£¬Ã¿´ÎÍÆËÍ»áÏûºÄ¸ü¶àʱ¼ä£¬Èç¹ûÏëÔÚÿ´ÎÍÆËÍʱ Git ¶¼¼ì²éÒ»ÖÂÐÔ£¬ÉèÖÃreceive.fsckObjects ΪtrueÀ´Ç¿ÆÈËüÕâô×ö£º

$ git config --system receive.fsckObjects true

ÏÖÔÚ Git »áÔÚÿ´ÎÍÆËÍÉúЧǰ¼ì²é¿âµÄÍêÕûÐÔ£¬È·±£ÓÐÎÊÌâµÄ¿Í»§¶ËûÓÐÒýÈëÆÆ»µÐÔµÄÊý¾Ý¡£

receive.denyNonFastForwards

Èç¹û¶ÔÒѾ­±»ÍÆË͵ÄÌá½»ÀúÊ·×öÑܺϣ¬¼Ì¶øÔÙÍÆËÍ£¬ÓÖ»òÕßÒÔÆäËü·½Ê½ÍÆËÍÒ»¸öÌá½»ÀúÊ·ÖÁÔ¶³Ì·ÖÖ§£¬ÇÒ¸ÃÌá½»ÀúʷûÔÚÕâ¸öÔ¶³Ì·ÖÖ§ÖУ¬ÕâÑùµÄÍÆËͻᱻ¾Ü¾ø¡£Õâͨ³£ÊǸöºÜºÃµÄ½ûÖ¹²ßÂÔ£¬µ«ÓÐʱÄãÔÚ×öÑܺϲ¢È·¶¨Òª¸üÐÂÔ¶³Ì·ÖÖ§£¬¿ÉÒÔÔÚpushÃüÁîºó¼Ó-f±êÖ¾À´Ç¿ÖƸüС£

Òª½ûÓÃÕâÑùµÄÇ¿ÖÆ¸üй¦ÄÜ£¬¿ÉÒÔÉèÖÃreceive.denyNonFastForwards£º

$ git config --system receive.denyNonFastForwards true

ÉÔºóÄã»á¿´µ½£¬Ó÷þÎñÆ÷¶ËµÄ½ÓÊÕ¹³×ÓÒ²ÄܴﵽͬÑùµÄÄ¿µÄ¡£Õâ¸ö·½·¨¿ÉÒÔ×ö¸üϸÖµĿØÖÆ£¬ÀýÈ磺½ûÓÃÌØ¶¨µÄÓû§×öÇ¿ÖÆ¸üС£

receive.denyDeletes

¹æ±ÜdenyNonFastForwards²ßÂԵķ½·¨Ö®Ò»¾ÍÊÇÓû§É¾³ý·ÖÖ§£¬È»ºóÍÆ»ØÐµÄÒýÓá£ÔÚ¸üÐ嵀 Git °æ±¾ÖУ¨´Ó1.6.1°æ±¾¿ªÊ¼£©£¬°Ñreceive.denyDeletesÉèÖÃΪtrue£º

$ git config --system receive.denyDeletes true

ÕâÑù»áÔÚÍÆË͹ý³ÌÖÐ×èֹɾ³ý·ÖÖ§ºÍ±êÇ© ¡ª ûÓÐÓû§Äܹ»Õâô×ö¡£ÒªÉ¾³ýÔ¶³Ì·ÖÖ§£¬±ØÐë´Ó·þÎñÆ÷ÊÖ¶¯É¾³ýÒýÓÃÎļþ¡£Í¨¹ýÓû§·ÃÎÊ¿ØÖÆÁбíÒ²ÄÜÕâô×ö£¬ÔÚ±¾Õ½á⽫»á½éÉÜÕâЩÓÐȤµÄ·½Ê½¡£

7.2 GitÊôÐÔ

һЩÉèÖÃÏîÒ²Äܱ»ÔËÓÃÓÚÌØ¶¨µÄ·¾¶ÖУ¬ÕâÑù£¬Git ÒÔ¶ÔÒ»¸öÌØ¶¨µÄ×ÓĿ¼»ò×ÓÎļþ¼¯ÔËÓÃÄÇЩÉèÖÃÏî¡£ÕâЩÉèÖÃÏî±»³ÆÎª Git ÊôÐÔ£¬¿ÉÒÔÔÚÄãĿ¼ÖеÄ.gitattributesÎļþÄÚ½øÐÐÉèÖã¨Í¨³£ÊÇÄãÏîÄ¿µÄ¸ùĿ¼£©£¬Ò²¿ÉÒÔµ±Äã²»ÏëÈÃÕâЩÊôÐÔÎļþºÍÏîÄ¿ÎļþһͬÌύʱ£¬ÔÚ.git/info/attributes½øÐÐÉèÖá£

ʹÓÃÊôÐÔ£¬Äã¿ÉÒÔ¶Ô¸ö±ðÎļþ»òĿ¼¶¨Ò岻ͬµÄºÏ²¢²ßÂÔ£¬Èà Git ÖªµÀÔõÑù±È½Ï·ÇÎı¾Îļþ£¬ÔÚÄãÌá½»»òÇ©³öǰÈà Git ¹ýÂËÄÚÈÝ¡£Ä㽫ÔÚÕⲿ·ÖÁ˽⵽ÄÜÔÚ×Ô¼ºµÄÏîÄ¿ÖÐʹÓõÄÊôÐÔ£¬ÒÔ¼°Ò»Ð©ÊµÀý¡£

¶þ½øÖÆÎļþ

Äã¿ÉÒÔÓà Git ÊôÐÔÈÃÆäÖªµÀÄÄЩÊǶþ½øÖÆÎļþ£¨ÒÔ·À Git ûÓÐʶ±ð³öÀ´£©£¬ÒÔ¼°Ö¸Ê¾ÔõÑù´¦ÀíÕâЩÎļþ£¬ÕâµãºÜ¿á¡£ÀýÈ磬һЩÎı¾ÎļþÊÇÓÉ»úÆ÷²úÉúµÄ£¬¶øÇÒÎÞ·¨±È½Ï£¬¶øÒ»Ð©¶þ½øÖÆÎļþ¿ÉÒÔ±È½Ï ¡ª Ä㽫»áÁ˽⵽ÔõÑùÈà Git ʶ±ðÕâЩÎļþ¡£

ʶ±ð¶þ½øÖÆÎļþ

һЩÎļþ¿´ÆðÀ´ÏñÊÇÎı¾Îļþ£¬µ«ÆäʵÊÇ×÷Ϊ¶þ½øÖÆÊý¾Ý±»¶Ô´ý¡£ÀýÈ磬ÔÚMacÉϵÄXcodeÏîÄ¿º¬ÓÐÒ»¸öÒÔ.pbxproj½áβµÄÎļþ£¬ËüÊÇÓɼǼÉèÖÃÏîµÄIDEдµ½´ÅÅ̵ÄJSONÊý¾Ý¼¯£¨´¿Îı¾javascriptÊý¾ÝÀàÐÍ£©¡£ËäÈ»¼¼ÊõÉÏ¿´ËüÊÇÓÉASCII×Ö·û×é³ÉµÄÎı¾Îļþ£¬µ«Äã²¢²»ÈÏΪÈç´Ë£¬ÒòΪËüȷʵÊÇÒ»¸öÇáÁ¿¼¶Êý¾Ý¿â ¡ª Èç¹ûÓÐ2È˸ıäÁËËü£¬Äãͨ³£ÎÞ·¨ºÏ²¢ºÍ±È½ÏÄÚÈÝ£¬Ö»ÓлúÆ÷²ÅÄܽøÐÐʶ±ðºÍ²Ù×÷£¬ÓÚÊÇ£¬ÄãÏë°ÑËüµ±³É¶þ½øÖÆÎļþ¡£

Èà Git °ÑËùÓÐpbxprojÎļþµ±³É¶þ½øÖÆÎļþ£¬ÔÚ.gitattributesÎļþÖÐÉèÖÃÈçÏ£º

*.pbxproj -crlf -diff

ÏÖÔÚ£¬Git »á³¢ÊÔת»»ºÍÐÞÕýCRLF£¨»Ø³µ»»ÐУ©ÎÊÌ⣬Ҳ²»»áµ±ÄãÔÚÏîÄ¿ÖÐÔËÐÐgit show»ògit diffʱ£¬±È½Ï²»Í¬µÄÄÚÈÝ¡£ÔÚGit 1.6¼°Ö®ºóµÄ°æ±¾ÖУ¬¿ÉÒÔÓÃÒ»¸öºê´úÌæ-crlf -diff£º

*.pbxproj binary

±È½Ï¶þ½øÖÆÎļþ

ÔÚGit 1.6¼°ÒÔÉϰ汾ÖУ¬ÄãÄÜÀûÓà Git ÊôÐÔÀ´ÓÐЧµØ±È½Ï¶þ½øÖÆÎļþ¡£¿ÉÒÔÉèÖà Git °Ñ¶þ½øÖÆÊý¾Ýת»»³ÉÎı¾¸ñʽ£¬ÓÃͨ³£µÄdiffÀ´±È½Ï¡£

Õâ¸öÌØÐԺܿᣬ¶øÇÒÏÊΪÈËÖª£¬Òò´ËÎÒ»á½áºÏʵÀýÀ´½²½â¡£Ê×ÏÈ£¬Òª½â¾öµÄÊÇ×îÁîÈËÍ·ÌÛµÄÎÊÌ⣺¶ÔWordÎĵµ½øÐа汾¿ØÖÆ¡£ºÜ¶àÈ˶ÔWordÎĵµÓÖºÞÓÖ°®£¬Èç¹ûÏë¶ÔÆä½øÐа汾¿ØÖÆ£¬Äã¿ÉÒÔ°ÑÎļþ¼ÓÈëµ½ Git ¿âÖУ¬Ã¿´ÎÐ޸ĺóÌá½»¼´¿É¡£µ«ÕâÑù×öûÓÐÒ»µãʵ¼ÊÒâÒ壬ÒòΪÔËÐÐgit diffÃüÁîºó£¬ÄãÖ»Äܵõ½ÈçϵĽá¹û£º

$ git diff diff --git a/chapter1.doc b/chapter1.doc index 88839c4..
4afcb7c 100644 Binary files a/chapter1.doc and b/chapter1

Äã²»ÄÜÖ±½Ó±È½ÏÁ½¸ö²»Í¬°æ±¾µÄWordÎļþ£¬³ý·Ç½øÐÐÊÖ¶¯É¨Ã裬²»ÊÇÂ𣿠Git ÊôÐÔÄܺܺõؽâ¾ö´ËÎÊÌ⣬°ÑÏÂÃæµÄÐмӵ½.gitattributesÎļþ£º

*.doc diff=word

µ±ÄãÒª¿´±È½Ï½á¹ûʱ£¬Èç¹ûÎļþÀ©Õ¹ÃûÊÇ¡±doc¡±£¬Git µ÷Óá±word¡±¹ýÂËÆ÷¡£Ê²Ã´ÊÇ¡±word¡±¹ýÂËÆ÷ÄØ£¿Æäʵ¾ÍÊÇ Git ʹÓÃstrings ³ÌÐò£¬°ÑWordÎĵµ×ª»»³É¿É¶ÁµÄÎı¾Îļþ£¬Ö®ºóÔÙ½øÐбȽϣº

$ git config diff.word.textconv strings

ÏÖÔÚÈç¹ûÔÚÁ½¸ö¿ìÕÕÖ®¼ä±È½ÏÒÔ.doc½áβµÄÎļþ£¬Git ¶ÔÕâЩÎļþÔËÓá±word¡±¹ýÂËÆ÷£¬ÔڱȽÏǰ°ÑWordÎļþת»»³ÉÎı¾Îļþ¡£

ÏÂÃæÕ¹Ê¾ÁËÒ»¸öʵÀý£¬ÎÒ°Ñ´ËÊéµÄµÚÒ»ÕÂÄÉÈë Git ¹ÜÀí£¬ÔÚÒ»¸ö¶ÎÂäÖмÓÈëÁËһЩÎı¾ºó±£´æ£¬Ö®ºóÔËÐÐgit diffÃüÁµÃµ½½á¹ûÈçÏ£º

$ git diff diff --git a/chapter1.doc b/chapter1.doc index c1c8a0a..b93c9e4 100644 
--- a/chapter1.doc +++ b/chapter1.doc @@ -8

Git ³É¹¦ÇÒ¼ò½àµØÏÔʾ³öÎÒÔö¼ÓµÄÎı¾¡±Let¡¯s see if this works¡±¡£ËäÈ»ÓÐЩ覴ã¬ÔÚĩβÏÔʾÁËÒ»Ð©Ëæ»úµÄÄÚÈÝ£¬µ«È·Êµ¿ÉÒԱȽÏÁË¡£Èç¹ûÄãÄÜÕÒµ½»ò×Ô¼ºÐ´¸öWordµ½´¿Îı¾µÄת»»Æ÷µÄ»°£¬Ð§¹û¿ÉÄÜ»á¸üºÃ¡£strings¿ÉÒÔÔڴ󲿷ÖMacºÍLinuxϵͳÉÏÔËÐУ¬ËùÒÔËüÊÇ´¦Àí¶þ½øÖƸñʽµÄµÚһѡÔñ¡£

Ä㻹ÄÜÓÃÕâ¸ö·½·¨±È½ÏͼÏñÎļþ¡£µ±±È½Ïʱ£¬¶ÔJPEGÎļþÔËÓÃÒ»¸ö¹ýÂËÆ÷£¬ËüÄÜÌáÁ¶³öEXIFÐÅÏ¢ ¡ª ´ó²¿·ÖͼÏñ¸ñʽʹÓõÄÔªÊý¾Ý¡£Èç¹ûÄãÏÂÔØ²¢°²×°ÁËexiftool³ÌÐò£¬¿ÉÒÔÓÃËü²ÎÕÕÔªÊý¾Ý°ÑͼÏñת»»³ÉÎı¾¡£±È½ÏµÄ²»Í¬½á¹û½«»áÓÃÎı¾ÏòÄãչʾ£º

$ echo '*.png diff=exif' >> .gitattributes $ git config diff.exif.textconv exiftool

Èç¹ûÔÚÏîÄ¿ÖÐÌæ»»ÁËÒ»¸öͼÏñÎļþ£¬ÔËÐÐgit diffÃüÁîµÄ½á¹ûÈçÏ£º

diff --git a/image.png b/image.png index 88839c4..4afcb7c 100644
 --- a/image.png +++ b/image.png @@ -1,12 +1,12 @@ ExifTool

Äã»á·¢ÏÖÎļþµÄ³ß´ç´óС·¢ÉúÁ˸ı䡣

¹Ø¼ü×ÖÀ©Õ¹

ʹÓÃSVN»òCVSµÄ¿ª·¢ÈËÔ±¾­³£ÒªÇ󹨼ü×ÖÀ©Õ¹¡£ÔÚ Git ÖУ¬ÄãÎÞ·¨ÔÚÒ»¸öÎļþ±»Ìá½»ºóÐÞ¸ÄËü£¬ÒòΪ Git »áÏȶԸÃÎļþ¼ÆËãУÑéºÍ¡£È»¶ø£¬Äã¿ÉÒÔÔÚÇ©³öʱעÈëÎı¾£¬ÔÚÌύǰɾ³ýËü¡£ Git ÊôÐÔÌṩÁË2ÖÖ·½Ê½Õâô×ö¡£

Ê×ÏÈ£¬ÄãÄܹ»°ÑblobµÄSHA-1УÑéºÍ×Ô¶¯×¢ÈëÎļþµÄ$Id$×ֶΡ£Èç¹ûÔÚÒ»¸ö»ò¶à¸öÎļþÉÏÉèÖÃÁË´Ë×ֶΣ¬µ±Ï´ÎÄãÇ©³ö·ÖÖ§µÄʱºò£¬Git ÓÃblobµÄSHA-1ÖµÌæ»»ÄǸö×ֶΡ£×¢Ò⣬Õâ²»ÊÇÌá½»¶ÔÏóµÄSHAУÑéºÍ£¬¶øÊÇblob±¾ÉíµÄУÑéºÍ£º

$ echo '*.txt ident' >> .gitattributes $ echo '$Id$' > test.txt

Ï´ÎÇ©³öÎļþʱ£¬Git ÈëÁËblobµÄSHAÖµ£º

$ rm text.txt $ git checkout -- text.txt $ cat test.txt $Id: 42812b7653c7b88933f8a9d6cad0ca16714b9bb3 $

È»¶ø£¬ÕâÑùµÄÏÔʾ½á¹ûûÓжà´óµÄʵ¼ÊÒâÒå¡£Õâ¸öSHAµÄÖµÏ൱µØËæ»ú£¬ÎÞ·¨Çø·ÖÈÕÆÚµÄǰºó£¬ËùÒÔ£¬Èç¹ûÄãÔÚCVS»òSubversionÖÐÓùý¹Ø¼ü×ÖÌæ»»£¬Ò»¶¨»á°üº¬Ò»¸öÈÕÆÚÖµ¡£

Òò´Ë£¬ÄãÄÜд×Ô¼ºµÄ¹ýÂËÆ÷£¬ÔÚÌá½»Îļþµ½ÔÝ´æÇø»òÇ©³öÎļþÊ±Ìæ»»¹Ø¼ü×Ö¡£ÓÐ2ÖÖ¹ýÂËÆ÷£¬¡±clean¡±ºÍ¡±smudge¡±¡£ÔÚ .gitattributesÎļþÖУ¬ÄãÄܶÔÌØ¶¨µÄ·¾¶ÉèÖÃÒ»¸ö¹ýÂËÆ÷£¬È»ºóÉèÖô¦ÀíÎļþµÄ½Å±¾£¬ÕâЩ½Å±¾»áÔÚÎļþÇ©³öǰºÍÌá½»µ½ÔÝ´æÇøÇ°±»µ÷Óá£ÕâЩ¹ýÂËÆ÷Äܹ»×ö¸÷ÖÖÓÐȤµÄÊ¡£

ÕâÀï¾ÙÒ»¸ö¼òµ¥µÄÀý×Ó£ºÔÚÔÝ´æÇ°£¬ÓÃindent£¨Ëõ½ø£©³ÌÐò¹ýÂËËùÓÐCÔ´´úÂë¡£ÔÚ.gitattributesÎļþÖÐÉèÖá±indent¡±¹ýÂËÆ÷¹ýÂË*.cÎļþ£º

*.c filter=indent

È»ºó£¬Í¨¹ýÒÔÏÂÅäÖã¬Èà Git ÖªµÀ¡±indent¡±¹ýÂËÆ÷ÔÚÓöµ½¡±smudge¡±ºÍ¡±clean¡±Ê±·Ö±ð¸Ã×öʲô£º

$ git config --global filter.indent.clean indent $ git config --global filter.indent.smudge cat

ÓÚÊÇ£¬µ±ÄãÔÝ´æ*.cÎļþʱ£¬indent³ÌÐò»á±»´¥·¢£¬ÔÚ°ÑËüÃÇÇ©³ö֮ǰ£¬cat³ÌÐò»á±»´¥·¢¡£µ«cat³ÌÐòÔÚÕâÀïûʲôʵ¼Ê×÷Óá£ÕâÑùµÄ×éºÏ£¬Ê¹CÔ´´úÂëÔÚÔÝ´æÇ°±»indent³ÌÐò¹ýÂË£¬·Ç³£ÓÐЧ¡£

ÁíÒ»¸öÀý×ÓÊÇÀàËÆRCSµÄ$Date$¹Ø¼ü×ÖÀ©Õ¹¡£ÎªÁËÑÝʾ£¬ÐèÒªÒ»¸öС½Å±¾£¬½ÓÊÜÎļþÃû²ÎÊý£¬µÃµ½ÏîÄ¿µÄ×îÐÂÌá½»ÈÕÆÚ£¬×îºó°ÑÈÕÆÚдÈë¸ÃÎļþ¡£ÏÂÃæÓÃRuby½Å±¾À´ÊµÏÖ£º

#! /usr/bin/env ruby data = STDIN.read last_date =
 `git log --pretty=format:"%ad" -1` puts data.gsub('$Date$', '$Date: ' + l

¸Ã½Å±¾´Ógit logÃüÁîÖеõ½×îÐÂÌá½»ÈÕÆÚ£¬ÕÒµ½ÎļþÖеÄËùÓÐ$Date$×Ö·û´®£¬×îºó°Ñ¸ÃÈÕÆÚÌî³äµ½$Date$×Ö·û´®ÖÐ ¡ª ´Ë½Å±¾ºÜ¼òµ¥£¬Äã¿ÉÒÔÑ¡ÔñÄãϲ»¶µÄ±à³ÌÓïÑÔÀ´ÊµÏÖ¡£°Ñ¸Ã½Å±¾ÃüÃûΪexpand_date£¬·Åµ½ÕýÈ·µÄ·¾¶ÖУ¬Ö®ºóÐèÒªÔÚ Git ÖÐÉèÖÃÒ»¸ö¹ýÂËÆ÷£¨dater£©£¬ÈÃËüÔÚÇ©³öÎļþʱµ÷ÓÃexpand_date£¬ÔÚÔÝ´æÎļþʱÓÃPerlÇå³ýÖ®£º

$ git config filter.dater.smudge expand_date $ git config filter.dater.clean
 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/

Õâ¸öPerlС³ÌÐò»áɾ³ý$Date$×Ö·û´®Àï¶àÓàµÄ×Ö·û£¬»Ö¸´$Date$ԭò¡£µ½Ä¿Ç°ÎªÖ¹£¬ÄãµÄ¹ýÂËÆ÷ÒѾ­ÉèÖÃÍê±Ï£¬¿ÉÒÔ¿ªÊ¼²âÊÔÁË¡£´ò¿ªÒ»¸öÎļþ£¬ÔÚÎļþÖÐÊäÈë$Date$¹Ø¼ü×Ö£¬È»ºóÉèÖà Git ÊôÐÔ£º

$ echo '# $Date$' > date_test.txt $ echo 'date*.txt filter=dater' >> .gitattributes

Èç¹ûÔÝ´æ¸ÃÎļþ£¬Ö®ºóÔÙÇ©³ö£¬Äã»á·¢Ïֹؼü×Ö±»Ìæ»»ÁË£º

$ git add date_test.txt .gitattributes $ git commit -m "Testing date expansion in Git"
 $ rm date_test.txt $ git checkout date

Ëä˵ÕâÏî¼¼Êõ¶Ô×Ô¶¨ÒåÓ¦ÓÃÀ´ËµºÜÓÐÓ㬵«»¹ÊÇҪСÐÄ£¬ÒòΪ.gitattributesÎļþ»áËæ×ÅÏîĿһÆðÌá½»£¬¶ø¹ýÂËÆ÷£¨ÀýÈ磺dater£©²»»á£¬ËùÒÔ£¬¹ýÂËÆ÷²»»áÔÚËùÓеط½¶¼ÉúЧ¡£µ±ÄãÔÚÉè¼ÆÕâЩ¹ýÂËÆ÷ʱҪעÒ⣬¼´Ê¹ËüÃÇÎÞ·¨Õý³£¹¤×÷£¬Ò²ÒªÈÃÕû¸öÏîÄ¿ÔË×÷ÏÂÈ¥¡£

µ¼³ö²Ö¿â

GitÊôÐÔÔÚµ¼³öÏîÄ¿¹éµµÊ±Ò²ÄÜ·¢»Ó×÷Óá£

export-ignore

µ±²úÉúÒ»¸ö¹éµµÊ±£¬¿ÉÒÔÉèÖà Git ²»µ¼³öijЩÎļþºÍĿ¼¡£Èç¹ûÄã²»ÏëÔڹ鵵Öаüº¬Ò»¸ö×ÓĿ¼»òÎļþ£¬µ«ÏëËûÃÇÄÉÈëÏîÄ¿µÄ°æ±¾¹ÜÀíÖУ¬ÄãÄܶÔÓ¦µØÉèÖÃexport-ignoreÊôÐÔ¡£

ÀýÈ磬ÔÚtest/×ÓĿ¼ÖÐÓÐһЩ²âÊÔÎļþ£¬ÔÚÏîÄ¿µÄѹËõ°üÖаüº¬ËûÃÇÊÇûÓÐÒâÒåµÄ¡£Òò´Ë£¬¿ÉÒÔÔö¼ÓÏÂÃæÕâÐе½ Git ÊôÐÔÎļþÖУº

test/ export-ignore

ÏÖÔÚ£¬µ±ÔËÐÐgit archiveÀ´´´½¨ÏîÄ¿µÄѹËõ°üʱ£¬ÄǸöĿ¼²»»áÔڹ鵵ÖгöÏÖ¡£

export-subst

»¹ÄܶԹ鵵×öһЩ¼òµ¥µÄ¹Ø¼ü×ÖÌæ»»¡£ÔÚµÚ2ÕÂÖÐÒѾ­¿ÉÒÔ¿´µ½£¬¿ÉÒÔÒÔ--pretty=formatÐÎʽµÄ¼òÂëÔÚÈκÎÎļþÖзÅÈë$Format:$ ×Ö·û´®¡£ÀýÈ磬Èç¹ûÏëÔÚÏîÄ¿Öаüº¬Ò»¸ö½Ð×÷LAST_COMMITµÄÎļþ£¬µ±ÔËÐÐgit archiveʱ£¬×îºóÌá½»ÈÕÆÚ×Ô¶¯µØ×¢Èë½ø¸ÃÎļþ£¬¿ÉÒÔÕâÑùÉèÖãº

$ echo 'Last commit date: $Format:%cd$' > LAST_COMMIT $
 echo "LAST_COMMIT export-subst" >> .gitattributes $ git add LAST_COMMI

ÔËÐÐgit archiveºó£¬´ò¿ª¸ÃÎļþ£¬»á·¢ÏÖÆäÄÚÈÝÈçÏ£º

$ cat LAST_COMMIT Last commit date: $Format:Tue Apr 21 08:38:48 2009 -0700$

ºÏ²¢²ßÂÔ

ͨ¹ý Git ÊôÐÔ£¬»¹ÄܶÔÏîÄ¿ÖеÄÌØ¶¨ÎļþʹÓò»Í¬µÄºÏ²¢²ßÂÔ¡£Ò»¸ö·Ç³£ÓÐÓõÄÑ¡Ïî¾ÍÊÇ£¬µ±Ò»Ð©Ìض¨Îļþ·¢Éú³åÍ»£¬Git »á³¢ÊԺϲ¢ËûÃÇ£¬¶øÊ¹ÓÃÄãÕâ±ßµÄºÏ²¢¡£

Èç¹ûÏîÄ¿µÄÒ»¸ö·ÖÖ§ÓÐÆçÒå»ò±È½ÏÌØ±ð£¬µ«ÄãÏë´Ó¸Ã·ÖÖ§ºÏ²¢£¬¶øÇÒÐèÒªºöÂÔÆäÖÐijЩÎļþ£¬ÕâÑùµÄºÏ²¢²ßÂÔÊÇÓÐÓõġ£ÀýÈ磬ÄãÓÐÒ»¸öÊý¾Ý¿âÉèÖÃÎļþdatabase.xml£¬ÔÚ2¸ö·ÖÖ§ÖÐËûÃÇÊDz»Í¬µÄ£¬ÄãÏëºÏ²¢Ò»¸ö·ÖÖ§µ½ÁíÒ»¸ö£¬¶ø²»ÅªÂÒ¸ÃÊý¾Ý¿âÎļþ£¬¿ÉÒÔÉèÖÃÊôÐÔÈçÏ£º

database.xml merge=ours

Èç¹ûºÏ²¢µ½ÁíÒ»¸ö·ÖÖ§£¬database.xmlÎļþ²»»áÓкϲ¢³åÍ»£¬ÏÔʾÈçÏ£º

$ git merge topic Auto-merging database.xml Merge made by recursive.

ÕâÑù£¬database.xml»á±£³ÖÔ­Ñù¡£

   
2457 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

ÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀí°×ƤÊé
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