µ½Ä¿Ç°ÎªÖ¹£¬ÎÒ²ûÊöÁË 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µÄÊÖ²áÒ³£¨Òë×¢£ºÒÔ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ÃüÁîʱ¶¨ÒåÃÜÔ¿£º
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ÎļþÖÐÉèÖÃÈçÏ£º
ÏÖÔÚ£¬Git »á³¢ÊÔת»»ºÍÐÞÕýCRLF£¨»Ø³µ»»ÐУ©ÎÊÌ⣬Ҳ²»»áµ±ÄãÔÚÏîÄ¿ÖÐÔËÐÐgit
show»ògit diffʱ£¬±È½Ï²»Í¬µÄÄÚÈÝ¡£ÔÚGit 1.6¼°Ö®ºóµÄ°æ±¾ÖУ¬¿ÉÒÔÓÃÒ»¸öºê´úÌæ-crlf
-diff£º
±È½Ï¶þ½øÖÆÎļþ
ÔÚ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¡±£¬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Îļþ£º
È»ºó£¬Í¨¹ýÒÔÏÂÅäÖã¬Èà 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 ÊôÐÔÎļþÖУº
ÏÖÔÚ£¬µ±ÔËÐÐ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Îļþ²»»áÓкϲ¢³åÍ»£¬ÏÔʾÈçÏ£º
$ git merge topic Auto-merging database.xml Merge made by recursive. |
ÕâÑù£¬database.xml»á±£³ÖÔÑù¡£
|