ά»¤Git ²Ö¿âµÄһЩ¼¼ÇÉ

×÷Õß: Ronny 2017-11-14 09:14:14
¶Ô Git ²Ö¿âµÄά»¤Í¨³£ÊÇΪÁ˼õÉÙ²Ö¿âµÄ´óС¡£Èç¹ûÄã´ÓÁíÍâÒ»¸ö°æ±¾¿ØÖÆϵͳµ¼ÈëÁËÒ»¸ö²Ö¿â£¬Äã¿ÉÄÜÐèÒªÔÚµ¼ÈëºóÇå³ýµô²»±ØÒªµÄÎļþ¡£±¾ÎÄ×ÅÖØÓÚ´ÓÒ»¸ö Git ²Ö¿âÖÐɾ³ý´óÎļþ£¬²¢ÇÒ°üº¬ÏÂÁÐÖ÷Ì⣺

Àí½â´Ó Git µÄÀúÊ·¼Ç¼ÖÐɾ³ýÎļþ
ʹÓà BFG ÖØдÀúÊ·¼Ç¼
¿ÉÑ¡£¬Ê¹ÓÃgit filter-branchÖØдÀúÊ·¼Ç¼
À¬»ø»ØÊÕ
±¾ÎÄÖеIJ½ÖèºÍ¹¤¾ßʹÓõĸ߼¶¼¼ÊõÉæ¼°ÆÆ»µÐÔ²Ù×÷¡£È·±£ÄúÔÚ¿ªÊ¼Ö®Ç°×Ðϸ¶Á¹ý²¢±¸·ÝÁËÄãµÄ²Ö¿â£¬´´½¨Ò»¸ö±¸·Ý×îÈÝÒ׵ķ½Ê½ÊÇʹÓÃ--mirror±êÖ¾¶ÔÄãµÄ²Ö¿â¿Ë¡£¬È»ºó¶ÔÕû¸ö¿Ë¡µÄÎļþ½øÐдò°üѹËõ¡£ÓÐÁËÕâ¸ö±¸·Ý£¬Èç¹ûÔÚά»¤ÆÚ¼äÒâÍâËð»µÁËÄúµÄ²Ö¿âµÄ¹Ø¼üÔªËØ£¬ÄÇôÄã¿ÉÒÔͨ¹ý±¸·ÝµÄ²Ö¿âÀ´»Ö¸´¡£

Çë¼Çס£¬²Ö¿âά»¤¶Ô²Ö¿âµÄÓû§¿ÉÄÜ»áÊÇ»ÙÃðÐԵġ£ÓëÄãµÄÍŶӻòÕß²Ö¿âµÄ¹Ø×¢Õß½øÐйµÍ¨»áÊÇÒ»¸ö²»´íµÄÖ÷Ò⡣ȷ±£Ã¿¸öÈ˶¼ÒѾ­¼ì²éÁËËûÃǵĴúÂ룬²¢ÇÒͬÒâÔÚ²Ö¿âά»¤ÆÚ¼äÍ£Ö¹¿ª·¢¡£

Àí½â´Ó Git µÄÀúÊ·¼Ç¼ÖÐɾ³ýÎļþ
»ØÏëһϣ¬¿Ë¡²Ö¿â»á¿Ë¡Õû¸öÀúÊ·¼Ç¼----°üÀ¨Ã¿¸öÔ´´úÂëÎļþµÄËùÓа汾¡£Èç¹ûÒ»¸öÓû§Ìá½»ÁËÒ»¸ö½Ï´óµÄÎļþ£¬±ÈÈçÒ»¸ö JAR£¬ÔòËæºóµÄÿ´Î¿Ë¡¶¼»á°üº¬Õâ¸öÎļþ¡£¼´Ê¹Óû§×îÖÕÔÚºóÃæµÄij´ÎÌá½»ÖÐɾ³ýÁËÕâ¸öÎļþ£¬µ«ÊÇÕâ¸öÎļþÈÔÈ»´æÔÚÓÚÕâ¸ö²Ö¿âµÄÀúÊ·¼Ç¼ÖС£ÒªÏëÍêÈ«µÄ´ÓÄãµÄ²Ö¿âÖÐɾ³ýÕâ¸öÎļþ£¬Äã±ØÐ룺

´ÓÄãµÄÏîÄ¿µÄµ±Ç°µÄÎļþÊ÷ÖÐɾ³ý¸ÃÎļþ;
´Ó²Ö¿âµÄÀúÊ·¼Ç¼ÖÐɾ³ýÎļþ----ÖØдGit ÀúÊ·¼Ç¼£¬´Ó°üº¬¸ÃÎļþµÄËùÓеÄÌá½»ÖÐɾ³ýÕâ¸öÎļþ;
ɾ³ýÖ¸Ïò¾ÉµÄÌá½»ÀúÊ·¼Ç¼µÄËùÓÐreflogÀúÊ·¼Ç¼;
ÖØÐÂÕûÀí²Ö¿â£¬Ê¹ÓÃgit gc¶ÔÏÖÔÚûÓÐʹÓõÄÊý¾Ý½øÐÐÀ¬»ø»ØÊÕ¡£
Git µÄ ¡°gc¡±£¨À¬»ø»ØÊÕ£©½«Í¨¹ýÄãµÄÈκÎÒ»¸ö·ÖÖ§»òÕß±êÇ©À´É¾³ý²Ö¿âÖÐËùÓеÄʵ¼ÊûÓõĻòÕßÒÔijÖÖ·½Ê½ÒýÓõÄÊý¾Ý¡£ÎªÁËʹÆä·¢»Ó×÷Óã¬ÎÒÃÇÐèÒªÖØд°üº¬²»ÐèÒªµÄÎļþµÄËùÓÐ Git ²Ö¿âÀúÊ·¼Ç¼£¬²Ö¿â½«²»ÔÙÒýÓÃËü---- git gc ½«»á¶ªÆúËùÓÐûÓõÄÊý¾Ý¡£

ÖØд´æ´¢¿âÀúÊ·ÊÇÒ»¸ö¼¬ÊÖµÄÊÂÇ飬ÒòΪÿ¸öÌá½»¶¼ÒÀÀµËüµÄ¸¸Ìá½»£¬ËùÒÔÈκÎÒ»¸öºÜСµÄ¸Ä±ä¶¼»á¸Ä±äËüµÄÿһ¸öËæºóµÄÌá½»µÄÌá½» ID¡£ÓÐÁ½¸ö×Ô¶¯»¯µÄ¹¤¾ß¿ÉÒÔ×öµ½Õ⣺

BFG Repo Cleaner¿ìËÙ¡¢¼òµ¥ÇÒÒ×ÓÚʹÓã¬ÐèÒª Java 6 »òÕ߸ü¸ß°æ±¾µÄÔËÐл·¾³¡£
git filter-branch¹¦ÄÜÇ¿´ó¡¢ÅäÖÃÂé·³£¬ÓÃÓÚ´óÓÚ²Ö¿âʱËٶȽÏÂý£¬ÊǺËÐÄ Git Ì×¼þµÄÒ»²¿·Ö¡£
Çмǣ¬µ±ÄãÖØдÀúÊ·¼Ç¼ºó£¬ÎÞÂÛÄãÊÇʹÓà BFG »¹ÊÇʹÓà filter-branch£¬Ä㶼ÐèҪɾ³ýÖ¸Ïò¾ÉµÄÀúÊ·¼Ç¼µÄreflogÌõÄ¿£¬×îºóÔËÐÐÀ¬»ø»ØÊÕÆ÷À´É¾³ý¾ÉµÄÊý¾Ý¡£

ʹÓà BFG ÖØдÀúÊ·¼Ç¼
BFGÊÇΪ½«Ïñ´óÎļþ»òÕßÃÜÂëÕâЩ²»ÏëÒªµÄÊý¾Ý´Ó Git ²Ö¿âÖÐɾ³ý¶øרÃÅÉè¼ÆµÄ£¬ËùÒÔËüÓÐÒ»Ò»¸ö¼òµ¥µÄ±êÖ¾ÓÃÀ´É¾³ýÄÇЩ´óµÄÀúÊ·Îļþ£¨²»ÔÚµ±Ç°µÄÌá½»ÀïÃ棩£º--strip-blobs-bigger-than

$ java -jar bfg.jar --strip-blobs-than 100M
´óС³¬¹ý 100MB µÄÈκÎÎļþ£¨²»°üº¬ÔÚÄã×î½üµÄÌá½»ÖеÄÎļþ----ÒòΪ BFGĬÈϻᱣ»¤ÄãµÄ×îÐÂÌá½»µÄÄÚÈÝ£©½«»á´ÓÄãµÄ Git ²Ö¿âµÄÀúÊ·¼Ç¼ÖÐɾ³ý¡£Èç¹ûÄãÏëÓÃÃû×ÖÀ´Ö¸Ã÷¾ßÌåµÄÎļþ£¬ÄãÒ²¿ÉÒÔÕâÑù×ö£º

$ java -jar bfg.jar --delete-files *.mp4
BFG µÄËÙ¶ÈÒª±Ègit filter-branch¿ì10-1000 ±¶£¬¶øÇÒͨ³£¸üÈÝÒ×ʹÓÃ----²é¿´ÍêÕûµÄʹÓÃ˵Ã÷ºÍʾÀý»ñÈ¡¸ü¶àϸ½Ú¡£

ʹÓà git filter-branch À´ÖØдÀúÊ·¼Ç¼
filter-branchÃüÁî¿ÉÒÔ¶Ô Git ²Ö¿âµÄÀúÊ·¼Ç¼ÖØд£¬¾ÍÏñ BFG Ò»Ñù£¬µ«Êǹý³Ì¸üÂýºÍ¸üÊÖ¶¯»¯¡£Èç¹ûÄã²»ÖªµÀÕâЩ´óÎļþÔÚÄÄÀÄÇôÄãµÚÒ»²½¾ÍÐèÒªÕÒµ½ËüÃÇ£º

ÊÖ¶¯²é¿´Äã Git ²Ö¿âÖеĴóÎļþ
Antony StubbsдÁËÒ»¸ö¿ÉÒԺܺõØÍê³ÉÕâ¸ö¹¦ÄÜµÄ BASH ½Å±¾¡£¸Ã½Å±¾¿ÉÒÔ¼ì²éÄãµÄ°üÎļþµÄÄÚÈݲ¢Áгö´óÎļþ¡£ÔÚÄ㿪ʼɾ³ýÎļþ֮ǰ£¬ÇëÖ´ÐÐÒÔϲÙ×÷»ñÈ¡²¢°²×°´Ë½Å±¾£º

1¡¢ ÏÂÔؽű¾µ½ÄãµÄ±¾µØµÄϵͳ¡£
2¡¢ ½«Ëü·ÅÔÚÒ»¸ö¿ÉÒÔ·ÃÎÊÄãµÄ Git ²Ö¿âµÄÒ×ÓÚÕÒµ½µÄλÖá£
3¡¢ Èýű¾³ÉΪ¿ÉÖ´ÐÐÎļþ£º

$ chmod 777 git_find_big.sh
4¡¢ ¿Ë¡²Ö¿âµ½Äã±¾µØϵͳ¡£
5¡¢ ¸Ä±äµ±Ç°Ä¿Â¼µ½ÄãµÄ²Ö¿â¸ùĿ¼¡£
6¡¢ ÊÖ¶¯ÔËÐÐ Git À¬»ø»ØÊÕÆ÷£º

git gc --auto
7¡¢ ÕÒ³ö .git Îļþ¼ÐµÄ´óС

$ du -hs .git/objects
45M .git/objects
×¢ÒâÎļþ´óС£¬ÒÔ±ãËæºó²Î¿¼¡£
8¡¢ ÔËÐÐgit_find_big.sh½Å±¾À´ÁгöÄãµÄ²Ö¿âÖеĴóÎļþ¡£

$ git_find_big.sh
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size pack SHA location
592 580 e3117f48bc305dd1f5ae0df3419a0ce2d9617336 media/img/emojis.jar
550 169 b594a7f59ba7ba9daebb20447a87ea4357874f43 media/js/aui/aui-dependencies.jar
518 514 22f7f9a84905aaec019dae9ea1279a9450277130 media/images/screenshots/issue-tracker-wiki.jar
337 92 1fd8ac97c9fecf74ba6246eacef8288e89b4bff5 media/js/lib/bundle.js
240 239 e0c26d9959bd583e5ef32b6206fc8abe5fea8624 media/img/featuretour/heroshot.png
´óÎļþ¶¼ÊÇ JAR Îļþ£¬°üµÄ´óСÁÐÊÇ×îÏà¹ØµÄ¡£aui-dependencies.jar±»Ñ¹Ëõµ½ 169kb£¬µ«ÊÇemojis.jarֻѹËõµ½ 500kb¡£emojis.jar¾ÍÊÇÒ»¸ö´ýɾ³ýµÄ¶ÔÏó¡£

ÔËÐÐ filter-branch
Äã¿ÉÒÔ¸øÕâ¸öÃüÁî´«µÝÒ»¸öÓÃÓÚÖØд Git Ë÷ÒýµÄ¹ýÂËÆ÷¡£ÀýÈ磬һ¸ö¹ýÂËÆ÷¿ÉÒÔ¿ÉÒÔ½«Ã¿¸ö¼ìË÷µÄÌύɾ³ý¡£Õâ¸öÓ÷¨ÈçÏ£º

git filter-branch --index-filter 'git rm --cached --ignore-unmatch  _pathname_ ' commitHASH
--index-filterÑ¡Ïî¿ÉÒÔÐ޸IJֿâµÄË÷Òý£¬--cachedÑ¡Ïî´ÓË÷ÒýÖжø²»ÊÇ´ÅÅÌÀ´É¾³ýÎļþ¡£ÕâÑù»á¸ü¿ì£¬ÒòΪÄã²»ÐèÒªÔÚÔËÐÐÕâ¸ö¹ýÂËÆ÷Ç°¼ì²éÿ¸öÐÞ¶©°æ±¾¡£git rmÖеÄignore-unmatchÑ¡Ïî¿ÉÒÔ·ÀÖ¹ÔÚ³¢ÊÔÒÆ×ß²»´æÔÚµÄÎļþpathnameµÄʱºòÃüÁîʧ°Ü¡£Í¨¹ýÖ¸¶¨Ò»¸öÌá½» HASH Öµ£¬Äã¿ÉÒÔ´Óÿ¸öÒÔÕâ¸ö HASH Öµ¿ªÊ¼µÄÌá½»ÖÐɾ³ýpathname¡£Òª´Ó¿ªÊ¼´¦É¾³ý£¬Äã¿ÉÒÔÊ¡ÂÔÕâ¸ö²ÎÊý»òÕßÖ¸¶¨ÎªHEAD¡£

Èç¹ûÄãµÄ´óÎļþÔÚ²»Í¬µÄ·ÖÖ§£¬Ä㽫ÐèҪͨ¹ýÃû×ÖÀ´É¾³ýÿ¸öÎļþ¡£Èç¹û´óÎļþ¶¼ÔÚÒ»¸öµ¥¶ÀµÄ·ÖÖ§£¬Äã¿ÉÒÔÖ±½Óɾ³ýÕâ¸ö·ÖÖ§±¾Éí¡£

Ñ¡Ïî 1£ºÍ¨¹ýÎļþÃûɾ³ýÎļþ
ʹÓÃÏÂÃæµÄ²½ÖèÀ´É¾³ý´óÎļþ£º
1¡¢ ʹÓÃÏÂÃæµÄÃüÁîÀ´É¾³ýÄãÕÒµ½µÄµÚÒ»¸ö´óÎļþ£º

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
2¡¢ Öظ´²½Öè 1 ÕÒµ½Ê£ÏµÄÿ¸ö´óÎļþ¡£
3¡¢ ÔÚÄãµÄ²Ö¿âÀï¸üÐÂÒýÓá£filter-branch»áΪÄãÔ­ÏȵÄÒýÓô´½¨Ò»¸örefs/original/ϵı¸·Ý¡£Ò»µ©ÄãÈ·ÐÅÒѾ­É¾³ýÁËÕýÈ·µÄÎļþ£¬Äã¿ÉÒÔÔËÐÐÏÂÃæµÄÃüÁîÀ´É¾³ý±¸·ÝÎļþ£¬Í¬Ê±¿ÉÒÔÈÃÀ¬»ø»ØÊÕÆ÷»ØÊÕ´óµÄ¶ÔÏó£º

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
Ñ¡Ïî 2£ºÖ±½Óɾ³ý·ÖÖ§
Èç¹ûÄãËùÓеĴóÎļþ¶¼ÔÚÒ»¸öµ¥¶ÀµÄ·ÖÖ§ÉÏ£¬Äã¿ÉÒÔÖ±½Óɾ³ýÕâ¸ö·ÖÖ§¡£É¾³ýÕâ¸ö·ÖÖ§»á×Ô¶¯É¾³ýËùÓеÄÒýÓá£

1¡¢ ɾ³ý·ÖÖ§¡£

$ git branch -D PROJ567bugfix
2¡¢ ´ÓºóÃæµÄ·ÖÖ§ÖÐɾ³ýËùÓÐµÄ reflog ÒýÓá£

¶Ô²»ÓõÄÊý¾ÝÀ¬»ø»ØÊÕ
1¡¢ ɾ³ý´ÓÏÖÔÚµ½ºóÃæµÄËùÓÐ reflog ÒýÓ㨳ý·ÇÄãÃ÷È·µØÖ»ÔÚÒ»¸ö·ÖÖ§ÉϲÙ×÷£©¡£

$ git reflog expire --expire=now --all
2¡¢ ͨ¹ýÔËÐÐÀ¬»ø»ØÊÕÆ÷ºÍɾ³ý¾ÉµÄ¶ÔÏóÖØдò°ü²Ö¿â¡£

$ git gc --prune=now
3¡¢ °ÑÄãËùÓеÄÐÞ¸ÄÍÆËͻزֿ⡣

$ git push --all --force
4¡¢ È·±£ÄãËùÓеıêÇ©Ò²Êǵ±Ç°×îеÄ:

$ git push --tags --force
±¾ÎÄתÔØ×Ô£ºhttp://www.linuxprobe.com/slim-git-warehouse.html

Ãâ·ÑÌṩ×îÐÂLinux¼¼Êõ½Ì³ÌÊé¼®£¬Îª¿ªÔ´¼¼Êõ°®ºÃÕßŬÁ¦×öµÃ¸ü¶à¸üºÃ£¬¿ªÔ´Õ¾µã£ºhttp://www.linuxprobe.com/

Ïà¹Ø×ÊѶ