°ïÄãɾ³ý Git ÖеÄÀúÊ·¼Í¼
¹ØÓÚʹÓà git ¾ÙÐÐÏîÄ¿ÖÎÀíµÄ¿ª·¢ÕßÀ´Ëµ£¬¾³£»áÓöµ½ÐèҪɾ³ýÀúÊ·¼Í¼µÄÇéÐΡ£ºÃ±ÈÌá½»ÁËÃô¸ÐÐÅÏ¢»òÕßÖ´·¨ÒªÇóɾ³ýijЩÄÚÈÝ¡£¿ÉÊÇ£¬git µÄÉè¼Æ³õÖ¾ÊDZ£´æËùÓÐÐ޸ļͼ£¬Òò´Ëɾ³ýÀúÊ·¼Í¼²¢²»ÊÇÒ»¼þÈÝÒ×µÄÊÂÇé¡£±¾ÎĽ«ÏÈÈÝһЩҪÁ죬×ÊÖúÄãɾ³ý git ÖеÄÀúÊ·¼Í¼¡£
ʹÓà Git ÏÂÁî
¿ÉÒÔʹÓà Git ÏÂÁîÖÐµÄ git reset ºÍ git push ɾ³ýÀúÊ·¼Í¼¡£Ê×ÏÈʹÓà git log ÏÂÁîÉó²éÀúÊ·¼Í¼¡£
$ git log --oneline
µÇ¼ºó¸´ÖÆ
Õâ»áÁгöÄ¿½ñ·ÖÖ§ÉϵÄËùÓÐÌá½»¼Í¼£¬Ã¿¸ö¼Í¼¶¼ÓÐÒ»¸ö SHA-1 ±êʶ·û£¨µÚÒ»ÁУ©ºÍÒ»¸öÐÂÎÅ£¨ºóÃæµÄÁУ©¡£
È»ºó£¬Ê¹Óà git reset ÏÂÁĿ½ñ·ÖÖ§ÖØÖõ½ÒªÉ¾³ýµÄÌύ֮ǰ¡£ÀýÈ磬ÈôÊÇҪɾ³ý×î½üµÄÈý¸öÌá½»¼Í¼£¬Ôò¿ÉÒÔʹÓãº
$ git reset HEAD~3
µÇ¼ºó¸´ÖÆ
ÕâÑù¾Í½«Ä¿½ñ·ÖÖ§ÖØÖõ½ÁËÇ°Èý¸öÌá½»¼Í¼֮´¦£¬ÀúÊ·¼Í¼ÖеÄ×îºóÈý¸öÌá½»»á±»É¾³ý¡£
×îºó£¬Ê¹Óà git push -f ÏÂÁîÇ¿ÖÆÍÆË͵½Ô¶³Ì¿ÍÕ»£¬ÁýÕÖÀúÊ·¼Í¼¡£Õâ»áʹÆäËûÈËÔÚÀÈ¡¸üÐÂʱÓöµ½ÎÊÌ⣬Òò´ËÐèҪȷ±£ËùÓÐÓÐȨÏÞµÄÈËÖªµÀ´Ë²Ù×÷¡£
$ git push -f
µÇ¼ºó¸´ÖÆ
ʹÓôËÒªÁìɾ³ýÀúÊ·¼Í¼ʱ£¬ÎÒÃǽ¨ÒéÔÚÖ´ÐÐ֮ǰ±¸·Ý´úÂë¿â£¬ÒÔ·ÀÍòÒ»¡£
ʹÓà BFG Repo-Cleaner
ÁíÒ»¸öÇ¿Ê¢µÄ¹¤¾ßÊÇ BFG Repo-Cleaner¡£ËüÊÇÒ»¸ö Java ³ÌÐò£¬¿ÉÒÔÔÚÍâµØÔËÐУ¬É¾³ý Git ¿ÍÕ»ÖеÄÀúÊ·¼Í¼¡£
Ê×ÏÈ£¬×°Öà BFG Repo-Cleaner¡£¿ÉÒÔʹÓà Homebrew ÔÚ Mac ÉÏ×°Öãº
$ brew install bfg
µÇ¼ºó¸´ÖÆ
»òÕß´Ó¹ÙÍøÏÂÔز¢×°Öõ½ÅÌËã»úÉÏ£º
$ wget http://search.maven.org/remotecontent?filepath=com/madgag/bfg/1.14.0/bfg-1.14.0.jar
µÇ¼ºó¸´ÖÆ
È»ºó£¬ÔÚ Git ¿ÍÕ»µÄ¸ùĿ¼ÏÂÔËÐÐÒÔÏÂÏÂÁÇëÈ·±£ÔÚɾ³ýÇ°±¸·Ý´úÂë¿â£©£º
$ java -jar /path/to/bfg.jar --delete-files filename.txt.git $ git reflog expire --expire=now --all && git gc --prune=now --aggressive $ git push
µÇ¼ºó¸´ÖÆ
ÆäÖУ¬filename.txt.git ÊÇ°üÀ¨ÒªÉ¾³ýÄÚÈݵÄÎļþÃû£¨ÀýÈç .git-credentials£©¡£ÕâÀïʹÓà BFG Repo-Cleaner ɾ³ýÌá½»ÀúÊ·¡¢refs ºÍ tags£¬È»ºóÖØÐÂѹËõ´æ´¢¿â¡£
ÐèҪעÖصÄÊÇ£¬BFG Repo-Cleaner ¿ÉÒÔɾ³ý¿ÍÕ»ÖеÄÈκÎÄÚÈÝ£¬Òò´ËÐèҪСÐIJÙ×÷¡£
½¨ÉèÒ»¸öÐ嵀 Git ¿ÍÕ»
×îºóÒ»ÖÖÒªÁìÊǽ¨ÉèÒ»¸öÐ嵀 Git ¿ÍÕ»£¬Ö»°üÀ¨Òª±£´æµÄÌá½»¼Í¼¡£ÕâÖÖÒªÁìÐèҪһЩÊÖ¶¯²Ù×÷£¬µ«¿ÉÒÔ±£´æ¿ÍÕ»µÄÍêÕûÐÔ£¬²¢ÇÒ²»»áÓ°ÏìÆäËûÈËÔÚ¿ÍÕ»ÉϵÄÊÂÇé¡£
Ê×ÏÈ£¬ÔÚÔʼ Git ¿ÍÕ»µÄ¸ùĿ¼Ï½¨ÉèÒ»¸öÐÂĿ¼£¬ÓÃÓÚÉúÑÄÐ嵀 Git ¿ÍÕ»£º
$ mkdir newrepo && cd newrepo
µÇ¼ºó¸´ÖÆ
È»ºó£¬½«Ôʼ Git ¿ÍÕ»µÄÑ¡ÔñÐÔÌá½»¼Í¼¸´ÖƵ½ÐÂĿ¼ÖУº
$ git clone /path/to/oldrepo --depth 1 $ cd oldrepo && git log --oneline
µÇ¼ºó¸´ÖÆ
ÕâÑù¾Í¿ÉÒÔ½«Ôʼ Git ¿ÍÕ»µÄ×îºóÒ»¸öÌá½»¼Í¼¸´ÖƵ½Ð嵀 Git ¿ÍÕ»ÖС£¸üÐÂпÍÕ»µÄÔ¶³Ì URL£¬È»ºó½«ÆäÍÆË͵½Ô¶³Ì¿ÍÕ»¡£
$ git remote set-url origin git://new/repo.git $ git push -u origin master
µÇ¼ºó¸´ÖÆ
ÕâÑù¾Í½¨ÉèÁËÒ»¸öÐ嵀 Git ¿ÍÕ»£¬Ö»°üÀ¨Ñ¡ÔñÐÔÌá½»µÄ¼Í¼¡£
×ܽá
ÔÚ Git ÖУ¬É¾³ýÀúÊ·¼Í¼ÊÇÒ»¸öÃô¸ÐµÄÎÊÌ⣬ÐèҪСÐÄÉóÉ÷²Ù×÷¡£Ê¹Óà git reset ÏÂÁî¿ÉÒÔɾ³ý×î½üµÄһЩÌá½»¼Í¼¡£Ê¹Óà BFG Repo-Cleaner ¿ÉÒÔɾ³ýÌض¨µÄÎļþ»òÎļþ¼ÐµÄÌá½»ÀúÊ·¡£×îºó£¬¿ÉÒÔͨ¹ý½¨ÉèÒ»¸öÐ嵀 Git ¿ÍÕ»À´Ñ¡ÔñÐԵر£´æÌá½»¼Í¼¡£²»¹ÜÄÄÖÖÒªÁ죬¶¼ÐèÒªÔÚɾ³ý֮ǰ±¸·Ý´úÂë¿â£¬ÒÔ·ÀÍòÒ»¡£
ÒÔÉϾÍÊÇ°ïÄãɾ³ý Git ÖеÄÀúÊ·¼Í¼µÄÏêϸÄÚÈÝ£¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡