7.3
Git¹Ò¹³
ºÍÆäËû°æ±¾¿ØÖÆÏµÍ³Ò»Ñù£¬µ±Ä³Ð©ÖØÒªÊ¼þ·¢Éúʱ£¬Git ÒÔµ÷ÓÃ×Ô¶¨Òå½Å±¾¡£ÓÐÁ½×é¹Ò¹³£º¿Í»§¶ËºÍ·þÎñÆ÷¶Ë¡£¿Í»§¶Ë¹Ò¹³ÓÃÓÚ¿Í»§¶ËµÄ²Ù×÷£¬ÈçÌá½»ºÍºÏ²¢¡£·þÎñÆ÷¶Ë¹Ò¹³ÓÃÓÚ
Git ·þÎñÆ÷¶ËµÄ²Ù×÷£¬Èç½ÓÊÕ±»ÍÆË͵ÄÌá½»¡£Äã¿ÉÒÔËæÒâµØÊ¹ÓÃÕâЩ¹Ò¹³£¬ÏÂÃæ»á½²½âÆäÖÐһЩ¡£
°²×°Ò»¸ö¹Ò¹³
¹Ò¹³¶¼±»´æ´¢ÔÚ Git Ŀ¼ÏµÄhooks×ÓĿ¼ÖУ¬¼´´ó²¿·ÖÏîÄ¿ÖеÄ.git/hooks¡£
Git ĬÈÏ»á·ÅÖÃһЩ½Å±¾Ñù±¾ÔÚÕâ¸öĿ¼ÖУ¬³ýÁË¿ÉÒÔ×÷Ϊ¹Ò¹³Ê¹Óã¬ÕâЩÑù±¾±¾ÉíÊÇ¿ÉÒÔ¶ÀÁ¢Ê¹Óõġ£ËùÓеÄÑù±¾¶¼ÊÇshell½Å±¾£¬ÆäÖÐһЩ»¹°üº¬ÁËPerlµÄ½Å±¾£¬²»¹ý£¬ÈκÎÕýÈ·ÃüÃûµÄ¿ÉÖ´Ðнű¾¶¼¿ÉÒÔÕý³£Ê¹ÓÃ
¡ª ¿ÉÒÔÓÃRuby»òPython£¬»òÆäËû¡£ÔÚGit 1.6°æ±¾Ö®ºó£¬ÕâЩÑù±¾Ãû¶¼ÊÇÒÔ.sample½á⣬Òò´Ë£¬Äã±ØÐëÖØÐÂÃüÃû¡£ÔÚGit
1.6°æ±¾Ö®Ç°£¬ÕâЩÑù±¾Ãû¶¼ÊÇÕýÈ·µÄ£¬µ«ÕâЩÑù±¾²»ÊÇ¿ÉÖ´ÐÐÎļþ¡£
°ÑÒ»¸öÕýÈ·ÃüÃûÇÒ¿ÉÖ´ÐеÄÎļþ·ÅÈë Git Ŀ¼ÏµÄhooks×ÓĿ¼ÖУ¬¿ÉÒÔ¼¤»î¸Ã¹Ò¹³½Å±¾£¬Òò´Ë£¬Ö®ºóËûÒ»Ö±»á±»
Git µ÷Óá£Ëæºó»á½²½âÖ÷ÒªµÄ¹Ò¹³½Å±¾¡£
¿Í»§¶Ë¹Ò¹³
ÓÐÐí¶à¿Í»§¶Ë¹Ò¹³£¬ÒÔϰÑËûÃÇ·ÖΪ£ºÌá½»¹¤×÷Á÷¹Ò¹³¡¢µç×ÓÓʼþ¹¤×÷Á÷¹Ò¹³¼°ÆäËû¿Í»§¶Ë¹Ò¹³¡£
Ìá½»¹¤×÷Á÷¹Ò¹³
ÓÐ 4¸ö¹Ò¹³±»ÓÃÀ´´¦ÀíÌá½»µÄ¹ý³Ì¡£pre-commit¹Ò¹³ÔÚ¼üÈëÌá½»ÐÅϢǰÔËÐУ¬±»ÓÃÀ´¼ì²é¼´½«Ìá½»µÄ¿ìÕÕ£¬ÀýÈ磬¼ì²éÊÇ·ñÓж«Î÷±»ÒÅ©£¬È·ÈϲâÊÔÊÇ·ñÔËÐУ¬ÒÔ¼°¼ì²é´úÂë¡£µ±´Ó¸Ã¹Ò¹³·µ»Ø·ÇÁãֵʱ£¬Git
·ÅÆú´Ë´ÎÌá½»£¬µ«¿ÉÒÔÓÃgit commit --no-verifyÀ´ºöÂÔ¡£¸Ã¹Ò¹³¿ÉÒÔ±»ÓÃÀ´¼ì²é´úÂë´íÎó£¨ÔËÐÐÀàËÆlintµÄ³ÌÐò£©£¬¼ì²éβ²¿¿Õ°×£¨Ä¬ÈϹҹ³ÊÇÕâô×öµÄ£©£¬¼ì²éз½·¨£¨Òë×¢£º³ÌÐòµÄº¯Êý£©µÄ˵Ã÷¡£
prepare-commit-msg¹Ò¹³ÔÚÌá½»ÐÅÏ¢±à¼Æ÷ÏÔʾ֮ǰ£¬Ä¬ÈÏÐÅÏ¢±»´´½¨Ö®ºóÔËÐС£Òò´Ë£¬¿ÉÒÔÓлú»áÔÚÌá½»×÷Õß¿´µ½Ä¬ÈÏÐÅϢǰ½øÐб༡£¸Ã¹Ò¹³½ÓÊÕһЩѡÏӵÓÐÌá½»ÐÅÏ¢µÄÎļþ·¾¶£¬Ìá½»ÀàÐÍ£¬Èç¹ûÊÇÒ»´ÎÐÞ¶©µÄ»°£¬Ìá½»µÄSHA-1УÑéºÍ¡£¸Ã¹Ò¹³¶Ôͨ³£µÄÌá½»À´Ëµ²»ÊǺÜÓÐÓã¬Ö»ÔÚ×Ô¶¯²úÉúµÄĬÈÏÌá½»ÐÅÏ¢µÄÇé¿öÏÂÓÐ×÷Óã¬ÈçÌá½»ÐÅϢģ°å¡¢ºÏ²¢¡¢Ñ¹ËõºÍÐÞ¶©Ìá½»µÈ¡£¿ÉÒÔºÍÌύģ°åÅäºÏʹÓã¬ÒÔ±à³ÌµÄ·½Ê½²åÈëÐÅÏ¢¡£
commit-msg¹Ò¹³½ÓÊÕÒ»¸ö²ÎÊý£¬´Ë²ÎÊýÊǰüº¬×î½üÌá½»ÐÅÏ¢µÄÁÙʱÎļþµÄ·¾¶¡£Èç¹û¸Ã¹Ò¹³½Å±¾ÒÔ·ÇÁãÍ˳ö£¬Git
·ÅÆúÌá½»£¬Òò´Ë£¬¿ÉÒÔÓÃÀ´ÔÚÌύͨ¹ýǰÑéÖ¤ÏîĿ״̬»òÌá½»ÐÅÏ¢¡£±¾ÕÂÉÏһС½ÚÒѾչʾÁËʹÓøùҹ³ºË¶ÔÌá½»ÐÅÏ¢ÊÇ·ñ·ûºÏÌØ¶¨µÄģʽ¡£
post-commit¹Ò¹³ÔÚÕû¸öÌá½»¹ý³ÌÍê³ÉºóÔËÐУ¬Ëû²»»á½ÓÊÕÈκβÎÊý£¬µ«¿ÉÒÔÔËÐÐgit
log -1 HEADÀ´»ñµÃ×îºóµÄÌá½»ÐÅÏ¢¡£×ÜÖ®£¬¸Ã¹Ò¹³ÊÇ×÷Ϊ֪֮ͨÀàʹÓõġ£
Ìá½»¹¤×÷Á÷µÄ¿Í»§¶Ë¹Ò¹³½Å±¾¿ÉÒÔÔÚÈκι¤×÷Á÷ÖÐʹÓã¬ËûÃǾ³£±»ÓÃÀ´ÊµÊ©Ä³Ð©²ßÂÔ£¬µ«ÖµµÃ×¢ÒâµÄÊÇ£¬ÕâЩ½Å±¾ÔÚcloneÆÚ¼ä²»»á±»´«ËÍ¡£¿ÉÒÔÔÚ·þÎñÆ÷¶Ëʵʩ²ßÂÔÀ´¾Ü¾ø²»·ûºÏijЩ²ßÂÔµÄÍÆËÍ£¬µ«ÕâÍêȫȡ¾öÓÚ¿ª·¢ÕßÔÚ¿Í»§¶ËʹÓÃÕâЩ½Å±¾µÄÇé¿ö¡£ËùÒÔ£¬ÕâЩ½Å±¾¶Ô¿ª·¢ÕßÊÇÓÐÓõģ¬ÓÉËûÃÇ×Ô¼ºÉèÖúÍά»¤£¬¶øÇÒÔÚÈκÎʱºò¶¼¿ÉÒÔ¸²¸Ç»òÐÞ¸ÄÕâЩ½Å±¾¡£
E-mail¹¤×÷Á÷¹Ò¹³
ÓÐ3¸ö¿ÉÓõĿͻ§¶Ë¹Ò¹³ÓÃÓÚe-mail¹¤×÷Á÷¡£µ±ÔËÐÐgit amÃüÁîʱ£¬»áµ÷ÓÃËûÃÇ£¬Òò´Ë£¬Èç¹ûÄãûÓÐÔÚ¹¤×÷Á÷ÖÐÓõ½´ËÃüÁ¿ÉÒÔÌø¹ý±¾½Ú¡£Èç¹ûÄãͨ¹ýe-mail½ÓÊÕÓÉgit
format-patch²úÉúµÄ²¹¶¡£¬ÕâЩ¹Ò¹³Ò²Ðí¶ÔÄãÓÐÓá£
Ê×ÏÈÔËÐеÄÊÇapplypatch-msg¹Ò¹³£¬Ëû½ÓÊÕÒ»¸ö²ÎÊý£º°üº¬±»½¨ÒéÌá½»ÐÅÏ¢µÄÁÙʱÎļþÃû¡£Èç¹û¸Ã½Å±¾·ÇÁãÍ˳ö£¬Git
·ÅÆú´Ë²¹¶¡¡£¿ÉÒÔʹÓÃÕâ¸ö½Å±¾È·ÈÏÌá½»ÐÅÏ¢ÊÇ·ñ±»ÕýÈ·¸ñʽ»¯£¬»òÈýű¾±à¼ÐÅÏ¢ÒÔ´ïµ½±ê×¼»¯¡£
ÏÂÒ»¸öÔÚgit amÔËÐÐÆÚ¼äµ÷ÓÃÊÇpre-applypatch¹Ò¹³¡£¸Ã¹Ò¹³²»½ÓÊÕ²ÎÊý£¬ÔÚ²¹¶¡±»ÔËÓÃÖ®ºóÔËÐУ¬Òò´Ë£¬¿ÉÒÔ±»ÓÃÀ´ÔÚÌύǰ¼ì²é¿ìÕÕ¡£ÄãÄÜÓô˽ű¾ÔËÐвâÊÔ£¬¼ì²é¹¤×÷Ê÷¡£Èç¹ûÓÐЩʲôÒÅ©£¬»ò²âÊÔûͨ¹ý£¬½Å±¾»áÒÔ·ÇÁãÍ˳ö£¬·ÅÆú´Ë´Îgit
amµÄÔËÐУ¬²¹¶¡²»»á±»Ìá½»¡£
×îºóÔÚgit amÔËÐÐÆÚ¼äµ÷ÓõÄÊÇpost-applypatch¹Ò¹³¡£Äã¿ÉÒÔÓÃËûÀ´Í¨ÖªÒ»¸öС×é»ò»ñÈ¡µÄ²¹¶¡µÄ×÷Õߣ¬µ«ÎÞ·¨×èÖ¹´ò²¹¶¡µÄ¹ý³Ì¡£
ÆäËû¿Í»§¶Ë¹Ò¹³
pre- rebase¹Ò¹³ÔÚÑܺÏǰÔËÐУ¬½Å±¾ÒÔ·ÇÁãÍ˳ö¿ÉÒÔÖÐÖ¹ÑܺϵĹý³Ì¡£Äã¿ÉÒÔʹÓÃÕâ¸ö¹Ò¹³À´½ûÖ¹ÑܺÏÒÑ¾ÍÆË͵ÄÌá½»¶ÔÏó£¬Git
pre- rebase¹Ò¹³Ñù±¾¾ÍÊÇÕâô×öµÄ¡£¸ÃÑù±¾¼Ù¶¨nextÊÇÄ㶨ÒåµÄ·ÖÖ§Ãû£¬Òò´Ë£¬Äã¿ÉÄÜÒªÐÞ¸ÄÑù±¾£¬°Ñnext¸Ä³ÉÄ㶨Òå¹ýÇÒÎȶ¨µÄ·ÖÖ§Ãû¡£
ÔÚgit checkout³É¹¦ÔËÐкó£¬post-checkout¹Ò¹³»á±»µ÷Óá£Ëû¿ÉÒÔÓÃÀ´ÎªÄãµÄÏîÄ¿»·¾³ÉèÖúÏÊʵŤ×÷Ŀ¼¡£ÀýÈ磺·ÅÈë´óµÄ¶þ½øÖÆÎļþ¡¢×Ô¶¯²úÉúµÄÎĵµ»òÆäËûÒ»ÇÐÄã²»ÏëÄÉÈë°æ±¾¿ØÖƵÄÎļþ¡£
×îºó£¬ÔÚmergeÃüÁî³É¹¦Ö´Ðкó£¬post-merge¹Ò¹³»á±»µ÷Óá£Ëû¿ÉÒÔÓÃÀ´ÔÚ
Git ÎÞ·¨¸ú×ٵŤ×÷Ê÷Öлָ´Êý¾Ý£¬ÖîÈçȨÏÞÊý¾Ý¡£¸Ã¹Ò¹³Í¬ÑùÄܹ»ÑéÖ¤ÔÚ Git ¿ØÖÆÖ®ÍâµÄÎļþÊÇ·ñ´æÔÚ£¬Òò´Ë£¬µ±¹¤×÷Ê÷¸Ä±äʱ£¬ÄãÏëÕâЩÎļþ¿ÉÒÔ±»¸´ÖÆ¡£
·þÎñÆ÷¶Ë¹Ò¹³
³ýÁ˿ͻ§¶Ë¹Ò¹³£¬×÷Ϊϵͳ¹ÜÀíÔ±£¬Ä㻹¿ÉÒÔʹÓÃÁ½¸ö·þÎñÆ÷¶ËµÄ¹Ò¹³¶ÔÏîĿʵʩ¸÷ÖÖÀàÐ͵IJßÂÔ¡£ÕâЩ¹Ò¹³½Å±¾¿ÉÒÔÔÚÌá½»¶ÔÏóÍÆË͵½·þÎñÆ÷ǰ±»µ÷Óã¬Ò²¿ÉÒÔÔÚÍÆË͵½·þÎñÆ÷ºó±»µ÷Óá£ÍÆË͵½·þÎñÆ÷ǰµ÷ÓõĹҹ³¿ÉÒÔÔÚÈκÎʱºòÒÔ·ÇÁãÍ˳ö£¬¾Ü¾øÍÆËÍ£¬·µ»Ø´íÎóÏûÏ¢¸ø¿Í»§¶Ë£¬»¹¿ÉÒÔÈçÄãËùÔ¸ÉèÖÃ×ã¹»¸´ÔÓµÄÍÆËͲßÂÔ¡£
pre-receive ºÍ post-receive
´¦ÀíÀ´×Ô¿Í»§¶ËµÄÍÆËÍ£¨push£©²Ù×÷ʱ×îÏÈÖ´ÐеĽű¾¾ÍÊÇ pre-receive
¡£Ëü´Ó±ê×¼ÊäÈ루stdin£©»ñÈ¡±»ÍÆËÍÒýÓõÄÁÐ±í£»Èç¹ûËüÍ˳öʱµÄ·µ»ØÖµ²»ÊÇ0£¬ËùÓÐÍÆËÍÄÚÈݶ¼²»»á±»½ÓÊÜ¡£ÀûÓô˹ҹ³½Å±¾¿ÉÒÔʵÏÖÀàËÆ±£Ö¤×îеÄË÷ÒýÖв»°üº¬·Çfast-forwardÀàÐ͵ÄÕâÀàЧ¹û£»ÒÖ»ò¼ì²éÖ´ÐÐÍÆËͲÙ×÷µÄÓû§ÓµÓд´½¨£¬É¾³ý»òÕßÍÆË͵ÄȨÏÞ»òÕßËûÊÇ·ñ¶Ô½«ÒªÐ޸ĵÄÿһ¸öÎļþ¶¼ÓзÃÎÊȨÏÞ¡£
post-receive ¹Ò¹³ÔÚÕû¸ö¹ý³ÌÍê½áÒÔºóÔËÐУ¬¿ÉÒÔÓÃÀ´¸üÐÂÆäËûϵͳ·þÎñ»òÕß֪ͨÓû§¡£Ëü½ÓÊÜÓë
pre-receive ÏàͬµÄ±ê×¼ÊäÈëÊý¾Ý¡£Ó¦ÓÃʵÀý°üÀ¨¸øÄ³ÓʼþÁÐ±í·¢ÐÅ£¬Í¨ÖªÊµÊ±ÕûºÏÊý¾ÝµÄ·þÎñÆ÷£¬»òÕ߸üÐÂÈí¼þÏîÄ¿µÄÎÊÌâ×·×Ùϵͳ
¡ª¡ª ÉõÖÁ¿ÉÒÔͨ¹ý·ÖÎöÌá½»ÐÅÏ¢À´¾ö¶¨Ä³¸öÎÊÌâÊÇ·ñÓ¦¸Ã±»¿ªÆô£¬Ð޸ĻòÕ߹رա£¸Ã½Å±¾ÎÞ·¨×éÖ¯ÍÆËͽø³Ì£¬²»¹ý¿Í»§¶ËÔÚËüÍê³ÉÔËÐÐ֮ǰ½«±£³ÖÁ¬½Ó״̬£»ËùÒÔÔÚÓÃËü×÷һЩÏûºÄʱ¼äµÄ²Ù×÷֮ǰÇëÈý˼¡£
update
update ½Å±¾ºÍ pre-receive ½Å±¾Ê®·ÖÀàËÆ¡£²»Í¬Ö®´¦ÔÚÓÚËü»áÎªÍÆËÍÕ߸üеÄÿһ¸ö·ÖÖ§ÔËÐÐÒ»´Î¡£¼ÙÈçÍÆËÍÕßͬʱÏò¶à¸ö·ÖÖ§ÍÆËÍÄÚÈÝ£¬pre-receive
Ö»ÔËÐÐÒ»´Î£¬Ïà±È֮Ϡupdate Ôò»áΪÿһ¸ö¸üеķÖÖ§ÔËÐÐÒ»´Î¡£Ëü²»»á´Ó±ê×¼ÊäÈë¶ÁÈ¡ÄÚÈÝ£¬¶øÊǽÓÊÜÈý¸ö²ÎÊý£ºË÷ÒýµÄÃû×Ö£¨·ÖÖ§£©£¬ÍÆËÍǰË÷ÒýÖ¸ÏòµÄÄÚÈݵÄ
SHA-1 Öµ£¬ÒÔ¼°Óû§ÊÔÍ¼ÍÆËÍÄÚÈÝµÄ SHA-1 Öµ¡£Èç¹û update ½Å±¾ÒÔÍ˳öʱ·µ»Ø·ÇÁãÖµ£¬Ö»ÓÐÏàÓ¦µÄÄÇÒ»¸öË÷Òý»á±»¾Ü¾ø£»ÆäÓàµÄÒÀÈ»»áµÃµ½¸üС£
7.4 Git Ç¿ÖÆ²ßÂÔʵÀý
ÔÚ±¾½ÚÖУ¬ÎÒÃÇÓ¦ÓÃÇ°ÃæÑ§µ½µÄ֪ʶ½¨Á¢ÕâÑùÒ»¸öGit ¹¤×÷Á÷³Ì£º¼ì²éÌá½»ÐÅÏ¢µÄ¸ñʽ£¬Ö»½ÓÊÜ´¿fast-forwardÄÚÈݵÄÍÆËÍ£¬²¢ÇÒÖ¸¶¨Óû§Ö»ÄÜÐÞ¸ÄÏîÄ¿ÖеÄÌØ¶¨×ÓĿ¼¡£ÎÒÃǽ«Ð´Ò»¸ö¿Í»§¶Ë½Ç±¾À´Ìáʾ¿ª·¢ÈËÔ±ËûÃÇÍÆË͵ÄÄÚÈÝÊÇ·ñ»á±»¾Ü¾ø£¬ÒÔ¼°Ò»¸ö·þÎñ¶Ë½Å±¾À´Êµ¼ÊÖ´ÐÐÕâЩ²ßÂÔ¡£
ÕâЩ½Å±¾Ê¹Óà Ruby д³É£¬Ò»°ëÓÉÓÚËüÊÇ×÷ÕßÇãÏòµÄ½Å±¾ÓïÑÔ£¬ÁíÍâ×÷Õß¾õµÃËüÊÇ×î½Ó½üα´úÂëµÄ½Å±¾ÓïÑÔ£»Òò¶ø¼´±ãÄ㲻ʹÓÃ
Ruby Ò²ÄÜ´óÖ¿´¶®¡£²»¹ýÈÎºÎÆäËûÓïÑÔÒ²Ò»ÑùÊÊÓá£ËùÓÐ Git ×Ô´øµÄÑùÀý½Å±¾¶¼ÊÇÓà Perl »ò Bash
дµÄ¡£ËùÒÔ´ÓÕâЩ½Å±¾ÖÐÄÜÕÒµ½Ï൱¶àµÄÕâÁ½ÖÖÓïÑԵĹҹ³ÑùÀý¡£
·þÎñ¶Ë¹Ò¹³
ËùÓзþÎñ¶ËµÄ¹¤×÷¶¼ÔÚhooks£¨¹Ò¹³£©Ä¿Â¼µÄ update£¨¸üУ©½Å±¾ÖÐÖÆ¶¨¡£update
½Å±¾ÎªÃ¿Ò»¸öµÃµ½ÍÆË͵ķÖÖ§ÔËÐÐÒ»´Î£»Ëü½ÓÊÜÍÆËÍÄ¿±êµÄË÷Òý£¬¸Ã·ÖÖ§ÔÀ´Ö¸ÏòµÄλÖã¬ÒÔ¼°±»ÍÆË͵ÄÐÂÄÚÈÝ¡£Èç¹ûÍÆËÍÊÇͨ¹ý
SSH ½øÐе쬻¹¿ÉÒÔ»ñÈ¡·¢³ö´Ë´Î²Ù×÷µÄÓû§¡£Èç¹ûÉ趨ËùÓвÙ×÷¶¼Í¨¹ý¹«³×ÊÚȨµÄµ¥Ò»Õʺţ¨±ÈÈ磢git£¢£©½øÐУ¬¾ÍÓбØÒªÍ¨¹ýÒ»¸ö
shell °ü×°ÒÀ¾Ý¹«³×À´ÅжÏÓû§µÄÉí·Ý£¬²¢ÇÒÉ趨»·¾³±äÁ¿À´±íʾ¸ÃÓû§µÄÉí·Ý¡£ÏÂÃæ¼ÙÉè³¢ÊÔÁ¬½ÓµÄÓû§´¢´æÔÚ$USER
»·¾³±äÁ¿ÀÎÒÃÇµÄ update ½Å±¾Ê×ÏÈËѼ¯Ò»ÇÐÐèÒªµÄÐÅÏ¢£º
#!/usr/bin/env ruby $refname = ARGV[0] $oldrev = ARGV[1] $newrev =
ARGV[2] $user = ENV['USER'] puts "Enforcing Policies... \ |
û´í£¬ÎÒÔÚÓÃÈ«¾Ö±äÁ¿¡£±ð±ÉÊÓÎÒ¡ª¡ªÕâÑù±È½ÏÀûÓÚÑÝʾ¹ý³Ì¡£
Ö¸¶¨ÌØÊâµÄÌá½»ÐÅÏ¢¸ñʽ
ÎÒÃǵĵÚÒ»ÏîÈÎÎñÊÇÖ¸¶¨Ã¿Ò»ÌõÌá½»ÐÅÏ¢¶¼±ØÐë×ñÑijÖÖÌØÊâµÄ¸ñʽ¡£×÷ΪÑÝʾ£¬¼Ù¶¨Ã¿Ò»ÌõÐÅÏ¢±ØÐë°üº¬Ò»ÌõÐÎËÆ
¡°ref: 1234¡± ÕâÑùµÄ×Ö·û´®£¬ÒòΪÎÒÃÇÐèÒª°Ñÿһ´ÎÌá½»ºÍÏîÄ¿µÄÎÊÌâ×·×Ùϵͳ¡£ÎÒÃÇÒªÖðÒ»¼ì²éÿһÌõÍÆËÍÉÏÀ´µÄÌá½»ÄÚÈÝ£¬¿´¿´Ìá½»ÐÅÏ¢ÊÇ·ñ°üº¬Õâôһ¸ö×Ö·û´®£¬È»ºó£¬Èç¹û¸ÃÌá½»Àï²»°üº¬Õâ¸ö×Ö·û´®£¬ÒÔ·ÇÁã·µ»ØÖµÍ˳ö´Ó¶ø¾Ü¾ø´Ë´ÎÍÆËÍ¡£
°Ñ $newrev ºÍ $oldrev ±äÁ¿µÄÖµ´«¸øÒ»¸ö½Ð×ö git rev-list
µÄ Git plumbing ÃüÁî¿ÉÒÔ»ñÈ¡ËùÓÐÌá½»ÄÚÈÝµÄ SHA-1 ÖµÁÐ±í¡£git rev-list
»ù±¾ÀàËÆgit log ÃüÁµ«ËüĬÈÏÖ»Êä³ö SHA-1 Öµ¶øÒÑ£¬Ã»ÓÐÆäËûÐÅÏ¢¡£ËùÒÔÒª»ñÈ¡ÓÉ SHA Öµ±íʾµÄ´ÓÒ»´ÎÌá½»µ½ÁíÒ»´ÎÌá½»Ö®¼äµÄËùÓÐ
SHA Öµ£¬¿ÉÒÔÔËÐУº
$ git rev-list 538c33..d14fc7 d14fc7c847ab946ec39590d87783c69b031bdfb7
9f585da4401b0a3999e84113824d15245c13f0be 234071a1be95 |
½ØÈ¡ÕâЩÊä³öÄÚÈÝ£¬Ñ»·±éÀúÆäÖÐÿһ¸ö SHA Öµ£¬ÕÒ³öÓëÖ®¶ÔÓ¦µÄÌá½»ÐÅÏ¢£¬È»ºóÓÃÕýÔò±í´ïʽÀ´²âÊÔ¸ÃÐÅÏ¢°üº¬µÄ¸ñʽ»°µÄÄÚÈÝ¡£
ÏÂÃæÒª¸ã¶¨ÈçºÎ´ÓËùÓеÄÌá½»ÄÚÈÝÖÐÌáÈ¡³öÌá½»ÐÅÏ¢¡£Ê¹ÓÃÁíÒ»¸ö½Ð×ö git
cat-file µÄ Git plumbing ¹¤¾ß¿ÉÒÔ»ñµÃÔʼµÄÌá½»Êý¾Ý¡£ÎÒÃǽ«ÔÚµÚ¾ÅÕÂÁ˽⵽ÕâЩ plumbing
¹¤¾ßµÄϸ½Ú£»ÏÖÔÚÔÝʱÏÈ¿´Ò»ÏÂÕâÌõÃüÁîµÄÊä³ö£º
$ git cat-file commit ca82a6 tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf
parent 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 au |
ͨ¹ý SHA-1 Öµ»ñµÃÌá½»ÄÚÈÝÖеÄÌá½»ÐÅÏ¢µÄÒ»¸ö¼òµ¥°ì·¨ÊÇÕÒµ½Ìá½»µÄµÚÒ»ÐУ¬È»ºóÈ¡´ÓËüÍùºóµÄËùÓÐÄÚÈÝ¡£¿ÉÒÔʹÓÃ
Unix ϵͳµÄ sed ÃüÁîÀ´ÊµÏÖ¸ÃЧ¹û£º
$ git cat-file commit ca82a6 | sed '1,/^$/d' changed the version number |
ÕâÌõÖäÓï´Óÿһ¸ö´ýÌá½»ÄÚÈÝÀïÌáÈ¡Ìá½»ÐÅÏ¢£¬²¢ÇÒ»áÔÚÌáÈ¡ÐÅÏ¢²»·ûºÏÒªÇóµÄÇé¿öÏÂÍ˳ö¡£ÎªÁËÍ˳ö½Å±¾ºÍ¾Ü¾ø´Ë´ÎÍÆËÍ£¬·µ»ØÒ»¸ö·ÇÁãÖµ¡£Õû¸ö½Å±¾´óÖÂÈçÏ£º
$regex = /\[ref: (\d+)\]/ # Ö¸¶¨Ìá½»ÐÅÏ¢¸ñʽ def check_message_format missed_revs
= `git rev-list #{$oldrev}..#{$newrev}`.spl |
°ÑÕâÒ»¶Î·ÅÔÚ update ½Å±¾ÀËùÓаüº¬²»·ûºÏÖ¸¶¨¹æÔòµÄÌá½»¶¼»áÔâµ½¾Ü¾ø¡£
ʵÏÖ»ùÓÚÓû§µÄ·ÃÎÊȨÏÞ¿ØÖÆÁÐ±í£¨ACL£©ÏµÍ³
¼ÙÉèÄãÐèÒªÌí¼ÓÒ»¸öʹÓ÷ÃÎÊȨÏÞ¿ØÖÆÁбíµÄ»úÖÆÀ´Ö¸¶¨ÄÄЩÓû§¶ÔÏîÄ¿µÄÄÄЩ²¿·ÖÓÐÍÆËÍȨÏÞ¡£Ä³Ð©Óû§¾ßÓÐÈ«²¿µÄ·ÃÎÊȨ£¬ÆäËûÈËÖ»¶ÔijЩ×ÓĿ¼»òÕßÌØ¶¨µÄÎļþ¾ßÓÐÍÆËÍȨÏÞ¡£Òª¸ã¶¨ÕâÒ»µã£¬ËùÓеĹæÔò½«±»Ð´ÈëÒ»¸öλÓÚ·þÎñÆ÷µÄÔʼ
Git ²Ö¿âµÄacl Îļþ¡£ÎÒÃÇÈà update ¹Ò¹³¼ìÔÄÕâЩ¹æÔò£¬ÉóÊÓÍÆË͵ÄÌá½»ÄÚÈÝÖÐÐèÒªÐ޸ĵÄËùÓÐÎļþ£¬È»ºó¾ö¶¨Ö´ÐÐÍÆË͵ÄÓû§ÊÇ·ñ¶ÔËùÓÐÕâЩÎļþ¶¼ÓÐȨÏÞ¡£
ÎÒÃÇÊ×ÏÈÒª´´½¨Õâ¸öÁÐ±í¡£ÕâÀïʹÓõĸñʽºÍ CVS µÄ ACL »úÖÆÊ®·ÖÀàËÆ£ºËüÓÉÈô¸ÉÐй¹³É£¬µÚÒ»ÏîÄÚÈÝÊÇ
avail »òÕß unavail£¬½Ó×ÅÊǶººÅ·Ö¸ôµÄ¹æÔòÉúЧÓû§ÁÐ±í£¬×îºóÒ»ÏîÊǹæÔòÉúЧµÄĿ¼£¨¿Õ°×±íʾ¿ª·Å·ÃÎÊ£©¡£ÕâЩÏîÄ¿ÓÉ
| ×Ö·û¸ô¿ª¡£
ÏÂÀýÖУ¬ÎÒÃÇÖ¸¶¨¼¸¸ö¹ÜÀíÔ±£¬¼¸¸ö¶Ô doc Ŀ¼¾ßÓÐȨÏÞµÄÎĵµ×÷Õߣ¬ÒÔ¼°Ò»¸ö¶Ô
lib ºÍ tests Ŀ¼¾ßÓÐȨÏ޵Ŀª·¢ÈËÔ±£¬ÏàÓ¦µÄ ACL ÎļþÈçÏ£º
avail|nickh,pjhyett,defunkt,tpw avail|usinclair,cdickens,ebronte|doc avail|schacon|lib avail|schacon|tests |
Ê×ÏȰÑÕâЩÊý¾Ý¶ÁÈëÄã±àдµÄÊý¾Ý½á¹¹¡£±¾ÀýÖУ¬Îª±£³Ö¼ò½à£¬ÎÒÃÇÔÝʱֻʵÏÖ
avail µÄ¹æÔò£¨Òë×¢£ºÒ²¾ÍÊÇÊ¡ÂÔÁË unavail ²¿·Ö£©¡£ÏÂÃæÕâ¸ö·½·¨Éú³ÉÒ»¸ö¹ØÁªÊý×飬ËüµÄÖ÷¼üÊÇÓû§Ãû£¬ÖµÊÇÒ»¸ö¸ÃÓû§ÓÐдȨÏÞµÄËùÓÐĿ¼×é³ÉµÄÊý×飺
def get_acl_access_data(acl_file) # read in ACL data acl_file
= File.read(acl_file).split("\n").reject { |line| line == '' } |
Õë¶Ô֮ǰ¸ø³öµÄ ACL ¹æÔòÎļþ£¬Õâ¸ö get_acl_access_data
·½·¨·µ»ØµÄÊý¾Ý½á¹¹ÈçÏ£º
{"defunkt"=>[nil], "tpw"=>[nil], "nickh"=>[nil], "pjhyett"
=>[nil], "schacon"=>["lib", "tests"], "cdickens"=>["doc"], "usincl |
¸ã¶¨ÁËÓû§È¨ÏÞµÄÊý¾Ý£¬ÏÂÃæÐèÒªÕÒ³öÄÄЩλÖý«Òª±»Ìá½»µÄÄÚÈÝÐ޸쬴ӶøÈ·±£ÊÔÍ¼ÍÆË͵ÄÓû§¶ÔÕâЩλÖÃÓÐÈ«²¿µÄȨÏÞ¡£
ʹÓà git log µÄ --name-only Ñ¡ÏÔÚµÚ¶þÕÂÀï¼òµ¥µÄÌá¹ý£©ÎÒÃÇ¿ÉÒÔÇá¶øÒ×¾ÙµÄÕÒ³öÒ»´ÎÌá½»ÀïÐ޸ĵÄÎļþ£º
$ git log -1 --name-only --pretty=format:'' 9f585d README lib/test.rb |
ʹÓà get_acl_access_data ·µ»ØµÄ ACL ½á¹¹À´Ò»Ò»ºË¶Ôÿһ´ÎÌá½»Ð޸ĵÄÎļþÁÐ±í£¬¾ÍÄÜÕÒ³ö¸ÃÓû§ÊÇ·ñÓÐȨÏÞÍÆËÍËùÓеÄÌá½»ÄÚÈÝ:
# ½öÔÊÐíÌØ¶¨Óû§ÐÞ¸ÄÏîÄ¿ÖеÄÌØ¶¨×ÓĿ¼ def check_directory_perms access = get_acl_access_data('acl')
# ¼ì²éÊÇ·ñÓÐÈËÔÚÏòËûûÓÐ |
ÒÔÉϵĴ󲿷ÖÄÚÈÝÓ¦¸Ã¶¼±È½ÏÈÝÒ×Àí½â¡£Í¨¹ý git rev-list »ñÈ¡ÍÆË͵½·þÎñÆ÷ÄÚÈݵÄÌá½»ÁÐ±í¡£È»ºó£¬Õë¶ÔÆäÖÐÿһÏÕÒ³öËüÊÔͼÐ޸ĵÄÎļþÈ»ºóÈ·±£Ö´ÐÐÍÆË͵ÄÓû§¶ÔÕâЩÎļþ¾ßÓÐȨÏÞ¡£Ò»¸ö²»Ì«ÈÝÒ×Àí½âµÄ
Ruby ¼¼ÇÉʯpath.index(access_path) ==0 Õâ¾ä£¬ËüµÄ·µ»ØÕæÖµÈç¹û·¾¶ÒÔ access_path
¿ªÍ·¡ª¡ªÕâÊÇΪÁËÈ·±£access_path ²¢²»ÊÇÖ»ÔÚÔÊÐíµÄ·¾¶Ö®Ò»£¬¶øÊÇËùÓÐ×¼ÐíȫѡµÄĿ¼¶¼ÔÚ¸ÃĿ¼֮Ï¡£
ÏÖÔÚÄãµÄÓû§Ã»·¨ÍÆËÍ´øÓв»ÕýÈ·µÄÌá½»ÐÅÏ¢µÄÄÚÈÝ£¬Ò²²»ÄÜÔÚ×¼ÐíËûÃÇ·ÃÎÊ·¶Î§Ö®ÍâµÄλÖÃ×ö³öÐ޸ġ£
Ö»ÔÊÐí Fast-Forward ÀàÐ͵ÄÍÆËÍ
ʣϵÄ×îºóÒ»ÏîÈÎÎñÊÇÖ¸¶¨Ö»½ÓÊÜ fast-forward µÄÍÆËÍ¡£ÔÚ Git
1.6 »òÕ߸üа汾ÀֻÐèÒªÉ趨 receive.denyDeletes ºÍreceive.denyNonFastForwards
Ñ¡Ïî¾Í¿ÉÒÔÁË¡£µ«ÊÇͨ¹ý¹Ò¹³µÄʵÏÖ¿ÉÒÔÔھɰ汾µÄ Git ÉϹ¤×÷£¬²¢ÇÒͨ¹ýÒ»¶¨µÄÐÞ¸ÄËüËü¿ÉÒÔ×öµ½Ö»Õë¶ÔijЩÓû§Ö´ÐУ¬»òÕ߸ü¶àÒÔºó¿ÉÄÜÓõĵ½µÄ¹æÔò¡£
¼ì²éÕâÒ»ÏîµÄÂß¼ÊÇ¿´¿´Ìá½»ÀïÊÇ·ñ°üº¬´Ó¾É°æ±¾ÀïÄÜÕÒµ½µ«ÔÚа汾ÀïÈ´ÕÒ²»µ½µÄÄÚÈÝ¡£Èç¹ûûÓУ¬ÄÇÕâÊÇÒ»´Î´¿
fast-forward µÄÍÆËÍ£»Èç¹ûÓУ¬ÄÇÎÒÃǾܾø´Ë´ÎÍÆËÍ£º
# Ö»ÔÊÐí´¿ fast-forward ÍÆËÍ def check_fast_forward missed_refs =
`git rev-list #{$newrev}..#{$oldrev}` missed_ref_count = m |
Ò»Çж¼É趨ºÃÁË¡£Èç¹ûÏÖÔÚÔËÐÐ chmod u+x .git/hooks/update
¡ª¡ª Ð޸İüº¬ÒÔÉÏÄÚÈÝÎļþµÄȨÏÞ£¬È»ºó³¢ÊÔÍÆËÍÒ»¸ö°üº¬·Ç fast-forward ÀàÐ͵ÄË÷Òý£¬»áµÃµ½Ò»ÏÂÌáʾ£º
$ git push -f origin master Counting objects: 5, done. Compressing objects:
100% (3/3), done. Writing objects: 100% (3/3), 32 |
ÕâÀïÓм¸¸öÓÐȤµÄÐÅÏ¢¡£Ê×ÏÈ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½¹Ò¹³ÔËÐÐµÄÆðµã£º
Enforcing Policies... (refs/heads/master) (fb8c72) (c56860) |
×¢ÒâÕâÊÇ´Ó update ½Å±¾¿ªÍ·Êä³öµ½±ê×¼ÄãÊä³öµÄ¡£ËùÓдӽű¾Êä³öµÄÌáʾ¶¼»á·¢Ë͵½¿Í»§¶Ë£¬ÕâµãºÜÖØÒª¡£
ÏÂÒ»¸öÖµµÃ×¢ÒâµÄ²¿·ÖÊÇ´íÎóÐÅÏ¢¡£
[POLICY] Cannot push a non fast-forward reference error:
hooks/update exited with error code 1 error: hook declined to updat |
µÚÒ»ÐÐÊÇÎÒÃǵĽű¾Êä³öµÄ£¬ÔÚÍùÏÂÊÇ Git ÔÚ¸æËßÎÒÃÇ update ½Å±¾Í˳öʱ·µ»ØÁË·ÇÁãÖµÒò¶øÍÆËÍÔâµ½Á˾ܾø¡£×îºóÒ»µã£º
To git@gitserver:project.git ! [remote rejected] master ->
master (hook declined) error: failed to push some refs to 'git@git |
ÎÒÃǽ«ÎªÃ¿Ò»¸ö±»¹Ò¹³¾ÜÖ®ÃÅÍâµÄË÷ÒýÊܵ½Ò»ÌõÔ¶³ÌÐÅÏ¢£¬½âÊÍËü±»¾Ü¾øÊÇÒòΪһ¸ö¹Ò¹³µÄÔÒò¡£
¶øÇÒ£¬Èç¹ûÄǸö ref ×Ö·û´®Ã»Óаüº¬ÔÚÈκεÄÌá½»ÀÎÒÃǽ«¿´µ½Ç°Ãæ½Å±¾ÀïÊä³öµÄ´íÎóÐÅÏ¢£º
[POLICY] Your message is not formatted correctly |
ÓÖ»òÕßijÈËÏëÐÞ¸ÄÒ»¸ö×Ô¼º²»¾ß±¸È¨ÏÞµÄÎļþÈ»ºóÍÆËÍÁËÒ»¸ö°üº¬ËüµÄÌá½»£¬Ëû½«¿´µ½ÀàËÆµÄÌáʾ¡£±ÈÈ磬һ¸öÎĵµ×÷Õß³¢ÊÔÍÆËÍÒ»¸öÐ޸ĵ½
lib Ŀ¼µÄÌá½»£¬Ëû»á¿´µ½
[POLICY] You do not have access to push to lib/test.rb |
È«ÔÚÕâÁË¡£´ÓÕâÀ↑ʼ£¬Ö»Òª update ½Å±¾´æÔÚ²¢ÇÒ¿ÉÖ´ÐУ¬ÎÒÃǵIJֿâÓÀÔ¶¶¼²»»áÔâµ½»Ø×ª»òÕß°üº¬²»·ûºÏÒªÇóÐÅÏ¢µÄÌá½»ÄÚÈÝ£¬²¢ÇÒÓû§¶¼±»ËøÔÚÁËɳÏäÀïÃæ¡£
¿Í»§¶Ë¹Ò¹³
ÕâÖÖÊֶεÄȱµãÔÚÓÚÓû§ÍÆËÍÄÚÈÝÔâµ½¾Ü¾øºó¼¸ºõÎÞ·¨±ÜÃâµÄ±§Ô¹¡£ÐÁÐÁ¿à¿àд³ÉµÄ´úÂëÔÚ×îºóʱ¿Ì²ÒÔâ¾Ü¾øÊÇÊ®·Ö±¯¾çÇоßÃÔ»óÐԵ컏ü¿ÉÁ¯µÄÊÇËûÃDz»µÃ²»ÐÞ¸ÄÌá½»ÀúÊ·À´½â¾öÎÊÌ⣬ÕâÔõôҲËã²»ÉÏÍõµÀ¡£
ÌÓÀëÕâÖÖÁ½ÄѾ³µØµÄ·¨±¦ÊǸøÓû§Ò»Ð©¿Í»§¶ËµÄ¹Ò¹³£¬ÔÚËûÃÇ×÷³ö¿ÉÄܱ¯¾çµÄÊÂÇéµÄʱºò¸øÒÔ¾¯¸æ¡£È»ºóÄØ£¬Óû§ÃǾÍÄÜÔÚÌá½»¨CÎÊÌâ±äµÃ¸üÄÑÐÞÕý֮ǰ½â³ýÒþ»¼¡£ÓÉÓÚ¹Ò¹³±¾Éí²»¸úËæ¿Ë¡µÄÏîÄ¿¸±±¾·Ö·¢£¬ËùÒÔ±ØÐëͨ¹ýÆäËû;¾¶°ÑÕâЩ¹Ò¹³·Ö·¢µ½Óû§µÄ
.git/hooks Ŀ¼²¢ÉèΪ¿ÉÖ´ÐÐÎļþ¡£ËäÈ»¿ÉÒÔÔÚÏàͬ»òµ¥¶ÀµÄÏîÄ¿ÄÚ ÈÝÀï¼ÓÈë²¢·Ö·¢ËüÃÇ£¬È«×Ô¶¯µÄ½â¾ö·½°¸ÊDz»´æÔڵġ£
Ê×ÏÈ£¬ÄãÓ¦¸ÃÔÚÿ´ÎÌύǰºË²éÄãµÄÌá½»×¢ÊÍÐÅÏ¢£¬ÕâÑùÄã²ÅÄÜÈ·±£·þÎñÆ÷²»»áÒòΪ²»ºÏÌõ¼þµÄÌá½»×¢ÊÍÐÅÏ¢¶ø¾Ü¾øÄãµÄ¸ü¸Ä¡£ÎªÁË´ïµ½Õâ¸öÄ¿µÄ£¬Äã¿ÉÒÔÔö¼Ó¡¯commit-msg¡¯¹Ò¹³¡£Èç¹ûÄãʹÓøùҹ³À´ÔĶÁ×÷ΪµÚÒ»¸ö²ÎÊý´«µÝ¸øgitµÄÌá½»×¢ÊÍÐÅÏ¢£¬²¢ÇÒÓë¹æ¶¨µÄģʽ×÷¶Ô±È£¬Äã¾Í¿ÉÒÔʹgitÔÚÌá½»×¢ÊÍÐÅÏ¢²»·ûºÏÌõ¼þµÄÇé¿öÏ£¬¾Ü¾øÖ´ÐÐÌá½»¡£
#!/usr/bin/env ruby message_file = ARGV[0] message =
File.read(message_file) $regex = /\[ref: (\d+)\]/ if !$regex.match(mess |
Èç¹ûÕâ¸ö½Å±¾·ÅÔÚÕâ¸öλÖà (.git/hooks/commit-msg)
²¢ÇÒÊÇ¿ÉÖ´ÐеÄ, ²¢ÇÒÄãµÄÌá½»×¢ÊÍÐÅÏ¢²»ÊÇ·ûºÏÒªÇóµÄ£¬Äã»á¿´µ½£º
$ git commit -am 'test' [POLICY] Your message is not formatted correctly |
ÔÚÕâ¸öʵÀýÖУ¬ÌύûÓгɹ¦¡£È»¶øÈç¹ûÄãµÄÌá½»×¢ÊÍÐÅÏ¢ÊÇ·ûºÏÒªÇóµÄ£¬git»áÔÊÐíÄãÌá½»£º
$ git commit -am 'test [ref: 132]' [master e05c914] test [ref: 132]
1 files changed, 1 insertions(+), 0 deletions(-) |
½ÓÏÂÀ´ÎÒÃÇÒª±£Ö¤Ã»ÓÐÐ޸ĵ½ ACL ÔÊÐí·¶Î§Ö®ÍâµÄÎļþ¡£¼ÓÈëÄãµÄ .git
Ŀ¼ÀïÓÐÇ°ÃæÊ¹ÓùýµÄ ACL Îļþ£¬ÄÇôÒÔÏ嵀 pre-commit ½Å±¾½«°ÑÀïÃæµÄ¹æ¶¨Ö´ÐÐÆðÀ´£º
#!/usr/bin/env ruby $user = ENV['USER'] # [ insert acl_access_data method from above ]
# Ö»ÔÊÐíÌØ¶¨Óû§ÐÞ¸ÄÏîÄ¿ÖØÌØ¶¨×ÓĿ¼µÄ |
ÕâºÍ·þÎñ¶ËµÄ½Å±¾¼¸ºõÒ»Ñù£¬³ýÁËÁ½¸öÖØÒªÇø±ð¡£µÚÒ»£¬ACL ÎļþµÄλÖò»Í¬£¬ÒòΪÕâ¸ö½Å±¾ÔÚµ±Ç°¹¤×÷Ŀ¼ÔËÐУ¬¶ø·Ç
Git Ŀ¼¡£ACL ÎļþµÄĿ¼±ØÐë´Ó
access = get_acl_access_data('acl') |
Ð޸ijɣº
access = get_acl_access_data('.git/acl') |
ÁíÒ»¸öÖØÒªÇø±ðÊÇ»ñÈ¡±»ÐÞ¸ÄÎļþÁбíµÄ·½Ê½¡£ÔÚ·þÎñ¶ËµÄʱºòʹÓÃÁ˲鿴Ìá½»¼Í¼µÄ·½Ê½£¬¿ÉÊÇĿǰµÄÌá½»¶¼»¹Ã»±»¼Ç¼ÏÂÀ´ÄØ£¬ËùÒÔÕâ¸öÁбíÖ»ÄÜ´ÓÔÝ´æÇøÓò»ñÈ¡¡£ºÍÔÀ´µÄ
files_modified = `git log -1 --name-only --pretty=format:'' #{ref}` |
²»Í¬£¬ÏÖÔÚÒªÓÃ
files_modified = `git diff-index --cached --name-only HEAD` |
²»Í¬µÄ¾ÍÖ»ÓÐÕâÁ½µã¡ª¡ª³ý´ËÖ®Í⣬¸Ã½Å±¾ÍêÈ«Ïàͬ¡£Ò»¸öСÏÝÚåÔÚÓÚËü¼ÙÉèÔÚ±¾µØÔËÐеÄÕË»§ºÍÍÆË͵½Ô¶³Ì·þÎñ¶ËµÄÏàͬ¡£Èç¹ûÕâ¶þÕß²»Ò»Ñù£¬ÔòÐèÒªÊÖ¶¯ÉèÖÃÒ»ÏÂ
$user ±äÁ¿¡£
×îºóÒ»ÏîÈÎÎñÊǼì²éÈ·ÈÏÍÆËÍÄÚÈÝÖв»°üº¬·Ç fast-forward ÀàÐ͵ÄË÷Òý£¬²»¹ýÕâ¸öÐèÇó±È½ÏÉÙ¼û¡£ÒªÕÒ³öÒ»¸ö·Ç
fast-forward ÀàÐ͵ÄË÷Òý£¬ÒªÃ´Ñܺϳ¬¹ýij¸öÒÑ¾ÍÆË͹ýµÄÌá½»£¬ÒªÃ´´Ó±¾µØ²»Í¬·ÖÖ§ÍÆË͵½Ô¶³ÌÏàͬµÄ·ÖÖ§ÉÏ¡£
¼ÈÈ»·þÎñÆ÷½«¸ø³öÎÞ·¨ÍÆËÍ·Ç fast-forward ÄÚÈݵÄÌáʾ£¬¶øÇÒÉÏÃæµÄ¹Ò¹³Ò²ÄÜ×èÖ¹Ç¿ÖÆµÄÍÆËÍ£¬Î¨Ò»Ê£ÏµÄDZÔÚÎÊÌâ¾ÍÊÇÑܺÏÒ»´ÎÒÑ¾ÍÆË͹ýµÄÌá½»ÄÚÈÝ¡£
ÏÂÃæÊÇÒ»¸ö¼ì²éÕâ¸öÎÊÌâµÄ pre-rabase ½Å±¾µÄÀý×Ó¡£Ëü»ñȡһ¸öËùÓм´½«ÖØÐ´µÄÌá½»ÄÚÈݵÄÁÐ±í£¬È»ºó¼ì²éËüÃÇÊÇ·ñÔÚÔ¶³ÌµÄË÷ÒýÀïÒѾ´æÔÚ¡£Ò»µ©·¢ÏÖij¸öÌá½»¿ÉÒÔ´ÓÔ¶³ÌË÷ÒýÀïÑܱä¹ýÀ´£¬Ëü¾Í·ÅÆúÑܺϲÙ×÷£º
#!/usr/bin/env ruby base_branch = ARGV[0] if ARGV[1] topic_branch =
ARGV[1] else topic_branch = "HEAD" end target_shas = `gi |
Õâ¸ö½Å±¾ÀûÓÃÁËÒ»¸öµÚÁùÕ¡°ÐÞ¶©°æ±¾Ñ¡Ôñ¡±Ò»½ÚÖв»ÔøÌáµ½µÄÓï·¨¡£Í¨¹ýÕâÒ»¾ä¿ÉÒÔ»ñµÃÒ»¸öËùÓÐÒѾÍê³ÉÍÆË͵ÄÌá½»µÄÁÐ±í£º
git rev-list ^#{sha}^@ refs/remotes/#{remote_ref} |
SHA^@ Óï·¨½âÎö¸Ã´ÎÌá½»µÄËùÓÐ׿ÏÈ¡£ÕâÀïÎÒÃÇ´Ó¼ì²éÔ¶³Ì×îºóÒ»´ÎÌá½»Äܹ»Ñܱä»ñµÃµ«´ÓËùÓÐÎÒÃdz¢ÊÔÍÆË͵ÄÌá½»µÄ
SHA ֵ׿ÏÈÎÞ·¨Ñܱä»ñµÃµÄÌá½»ÄÚÈÝ¡ª¡ªÒ²¾ÍÊÇ fast-forward µÄÄÚÈÝ¡£
Õâ¸ö½â¾ö·½°¸µÄÓ²ÉËÔÚÓÚËüÓпÉÄܺÜÂý¶øÇÒ³£³£Ã»ÓбØÒª¡ª¡ªÖ»Òª²»Óà -f À´Ç¿ÖÆÍÆËÍ£¬·þÎñÆ÷»á×Ô¶¯¸ø³ö¾¯¸æ²¢ÇҾܾøÍÆËÍÄÚÈÝ¡£È»¶ø£¬ÕâÊǸö²»´íµÄÁ·Ï°¶øÇÒÀíÂÛÉÏÄܰïÖúÓû§±ÜÃâÒ»´Î½«À´²»µÃ²»ÕÛ»ØÀ´Ð޸ĵÄÑܺϲÙ×÷¡£
7.5 ×ܽá
ÄãÒѾ¼ûʶ¹ý¾ø´ó¶àÊýͨ¹ý×Ô¶¨Òå Git ¿Í»§¶ËºÍ·þÎñ¶ËÀ´À´ÊÊÓ¦×Ô¼º¹¤×÷Á÷³ÌºÍÏîÄ¿ÄÚÈݵķ½Ê½ÁË¡£ÎÞÂÛÄã´´Ôì³öÁËʲôÑùµÄ¹¤×÷Á÷³Ì£¬Git
¶¼ÄÜÓõÄ˳ÊÖ¡£ |