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

1Ôª 10Ôª 50Ôª





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



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

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 ¶¼ÄÜÓõÄ˳ÊÖ¡£

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

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

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

ÅäÖùÜÀíʵ¼ù
ÅäÖùÜÀí·½·¨¡¢¹¤¾ßÓëÓ¦ÓÃ
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
²úÆ··¢²¼¹ÜÀí
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]


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


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


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