git ã¯ãã³ãŒãããŒã¹ã®çºå±éçšãèšé²ããéçºè éã®ååäœæ¥ãå¹çåãã匷åãªããŒã«ã§ããã§ããèšé²å¯Ÿè±¡ã®ãªããžããªããšãŠã€ããªã巚倧ãªãã®ã«ãªã£ããšãã¯äœãèµ·ããã®ã§ããããïŒ
ãã®èšäºã§ã¯ãããã€ãã®ç°ãªãæå³ã§ã®å·šå€§åã«æ£ãã察åŠããããã®ã¢ã€ãã¢ãšææ³ãå°ã玹ä»ããŠã¿ãããšæããŸãã
äºçš®é¡ã®å·šå€§ãªããžããª
ããèããŠã¿ããšå·šå€§ãªããžããªãçããçç±ã¯ãããŸãã«èšã£ãŠäºã€ãããŸã:
- éåžžã«é·ãæéã«ããã£ãŠå±¥æŽãç©ã¿äžãããã (ãããžã§ã¯ããéåžžã«é·ãæéç¶ç¶çã«æ¡å€§ãç¶ããããã«éçºææãç©ã¿éãªã£ã) å Žå
- 巚倧ã§ãããå±¥æŽã®èšé²ãå¿ èŠãªãã€ã㪠ããŒã¿ãååšãããããã³ãŒãã«åæ ãããå Žå
- ãã®äž¡æ¹ã®å Žå
å³ã¡ããªããžããªã®å·šå€§åã¯äºã€ã®ç°ãªãæ¹åã«åãã£ãŠèµ·ããããšã«ãªããŸããããã¯ãäœæ¥ãã£ã¬ã¯ããªã®ãµã€ãº (å³ã¡çŽè¿ã®ã³ãããã®ãµã€ãº) ã®åé¡ãšå šäœã®å±¥æŽã®ç©ã¿éãã®çšåºŠã®åé¡ã®äºã€ã§ãã
åŸè ã®åé¡ã¯æã«ãªããžããªäžã«æ®ãå€ããŠãã¯ã䜿ãããŠããªããã€ã㪠ããŒã¿ãåŒãèµ·ããåé¡ãšäžç·ã«èµ·ããããšããããŸããããããèµ·ãã£ããšããŠã以äžã«ç€ºãããã«æ¯èŒçç°¡åãªè§£æ±ºçãããã®ã§ãã
äžã«è¿°ã¹ãäºã€ã®åé¡ã«å¯Ÿå¿ããããã®ãã¯ããã¯ãšææ³ã¯ãçžè£çãªãã®ã«ãªãããšããããã®ã®ãããããã¯ç°ãªããã®ã§ãã®ã§ãã²ãšã€ãã€åãäžããŠãããŸãããã
éåžžã«é·ãå±¥æŽãæãããªããžããªã®åãæ±ã
ãªããžããªã巚倧ã§ãããã©ãããå€å®ããã®ã¯é£ãã (äŸãã°ææ°ã® Linux ã«ãŒãã«ã®ã³ãŒã㯠1,500 äžè¡ãè¶ ããçšå·šå€§ã ãæè¡è ã¯ãã®å šäœã䜿ãããªããŠãã) ã®ã§ãããéåžžã«æŽå²ã®é·ããããžã§ã¯ãã§èŠå¶ãŸãã¯æ³ä»€ã«ãã£ãŠå€æŽãçŠæ¢ãããŠããå Žåã¯ã¯ããŒã³ãäœãããšãå°é£ã§ããã»ã©ã®å€§ããã«ãªãããšããããŸã (æ£ç¢ºã«èšããšãLinux ã«ãŒãã«ã¯ãé·ãæŽå²ãæãããªããžããªãšæ¯èŒçæè¿éçºããããªããžããªã«åããããŸãããç°¡åãªæ¥ç¶èšå®ã«ãã£ãŠããããã²ãšã€ã®ãã®ãšããŠå šäœã«ã¢ã¯ã»ã¹ããããšãã§ããŸã)ã
ç°¡æãœãªã¥ãŒã·ã§ã³: shallow clone
第äžã®æ¹æ³ã¯ãgit ãçšã㊠shallow clone ãè¡ãããšã§ãããããã¯éçºè ã«ãšã£ãŠãã·ã¹ãã ã«ãšã£ãŠãæéãšãã£ã¹ã¯é åã®ç¯çŽã«ãªãé«éã¯ããŒã³ã®ææ³ã§ããShallow clone ãšã¯ãã³ãããå±¥æŽäžã«ãããææ°ã® n åã®ã³ãããã®ã¿ãã¯ããŒã³ããææ³ãæå³ããŸãã
ãã®æ¹æ³ã¯ã次ã®äŸã®ããã«åã« - -depth ãªãã·ã§ã³ãå©çšããã ãã§ã:
git clone --depth depth remote-url
ãããžã§ã¯ãã 10 幎以äžã«ãããæŽå²ãæã¡ããã®éã«ãªããžããªãç©ã¿äžããããŠãããããªå Žå (äŸãã° JIRAhttp://www.atlassian.com/ja/software/jira)ããã®æ¹æ³ã«ãã£ãŠå®çŸãããããŸããŸãªã¯ããŒã³æéççž®ãåèšãããšé¡èãªå¹æãåŸãããŸãã
JIRA ã®å šäœãã¯ããŒã³ãããšãµã€ãºã¯ 677MB ã«ããªãã47,000 ãè¶ ããã³ããããå¯èœãšãªãããã«äœæ¥ãã£ã¬ã¯ããªã«ã¯ããã« 320MB ãè¶ ããé åãå¿ èŠã§ããJIRA ã®ãã§ãã¯ã¢ãŠããè¡ã£ãŠç°¡åã«æ¯èŒããŠã¿ããšãshallow clone ã®å Žåã®æèŠæé㯠29.5 seconds ã§ãã£ãã®ã«å¯Ÿãããã¹ãŠã®å±¥æŽãå«ãå®å šãªã¯ããŒã³ã®å Žå㯠4 minutes 24 seconds ãèŠããŸããããã®å·®ã¯ãéå»ã«ãããžã§ã¯ãã«çµã¿èŸŒãŸãããã€ã㪠ããŒã¿ã®æ°ã«ãæ¯äŸããŠå€§ãããªããŸãããããã«ããããã¯ãã«ãã·ã¹ãã ã«ãšã£ãŠå€§ããªå©ç¹ãæãããã¯ããã¯ã§ãã
ææ°ã® git ã«ããã shallow clone ãµããŒãã®åŒ·å
ãã€ãŠã® Shallow clone ã¯ãããã€ãã®æ©èœã®ãµããŒããã»ãšãã©ãªããgit ã®äžçã®åé¡å ãšã§ãèšãããã®ã§ãããããããæè¿ã®ããŒãžã§ã³ (1.9 以é) ã«ãããŠç¶æ³ã¯å€§ããæ¹åãããŠãããçŸåšã§ã¯ shallow clone ããã§ããªããžããªãžã® pull ã push ãæ£ããè¡ãããšãã§ããŸãã
éšåçãªãœãªã¥ãŒã·ã§ã³: filter-branch
ééã£ãŠã³ããããã倧ããªãã€ã㪠ããŒã¿ãä»åŸäœ¿çšããããšã®ãªãå€ãããŒã¿ãå«ã巚倧ãªããžããªã®å Žåã¯ãfilter-branch ãéåžžã«æçšãªãœãªã¥ãŒã·ã§ã³ã§ãããã®ã³ãã³ãã䜿çšãããšããããžã§ã¯ãã®å±¥æŽå šäœã調ã¹ãŠããããããèšå®ãããã¿ãŒã³ã«ãããã£ãŠãã¡ã€ã«ã®æœåºãä¿®æ£ã倿Žãé€å€ãªã©ã®åŠçãè¡ãããšãã§ããŸãããã㯠Git ãå©çšãããããžã§ã¯ãã«ãšã£ãŠéåžžã«åŒ·åãªããŒã«ã§ãããªããžããªäžã®ãµã€ãºã®å€§ããªãªããžã§ã¯ãã調ã¹ãããã®ãã«ããŒã¹ã¯ãªããããã§ã«æäŸãããŠãããç°¡åã«å©çšã§ããŸãã
filter-branch ã®äœ¿çšäŸ (ã¯ã¬ãžãã):
git filter-branch --tree-filter 'rm -rf /path/to/spurious/asset/folder' HEAD
filter-branch ã«ã¯ãã€ããŒãªåé¡ç¹ããããŸããå³ã¡ãäžåºŠ filter-branch ãå®è¡ãããšå®è³ªçã«ã¯ãã¹ãŠã®å±¥æŽãæžãæããããããšã«ãªãããã¹ãŠã®ã³ããã ID ãå€åããŸãããã®ããããã¹ãŠã®éçºè ãå®è¡åŸã®ãªããžããªãå床ã¯ããŒã³ããå¿ èŠãçããŸãã
ãããã£ãŠãfilter-branch ã䜿çšããŠã¯ãªãŒã³ã¢ãããè¡ãäºå®ãããå ŽåããããããŒã å ã«åšç¥ãããã®æäœã®å®è¡äžã¯çæéã§ã¯ããããªããžããªãããªãŒãºããçµäºåŸã¯å šå¡ã«å¯ŸããŠãªããžããªãå床 clone ããããã«éç¥ããå¿ èŠããããŸãã
shallow-clone ã®ä»£æ¿: åäžãã©ã³ãã®ã¯ããŒã³
2012 幎 4 æã«ãªãªãŒã¹ããã git 1.7.10 ãããæ¬¡ã®ããã«ã¯ããŒã³ã®å¯Ÿè±¡ãåäžãã©ã³ãã«å¶éããããšãã§ããããã«ãªããŸãã:
git clone URL --branch branch_name --single-branch [folder]
ãã®æ¹æ³ã¯ãç¹ã«ãã©ã³ããé·ããŠåå²ãå€ãå Žåããã©ã³ãã®æ°ãå€ãå Žåã«æçšã§ãããã©ã³ãã®æ°ãå°ãªããŠããããããã䌌éã£ãŠããå Žåã¯ãã®æ¹æ³ã®å¹æã¯å°ããã§ãã
åèã«ãªã Stack Overflow èšäº.
巚倧ãªãã€ã㪠ããŒã¿ãå«ããªããžããªã®åãæ±ã
第äºã®çš®é¡ã®å·šå€§ãªããžããªã¯ã巚倧ãªãã€ã㪠ããŒã¿ãå«ãã³ãŒãããŒã¹ãããªããªããžããªã§ããäŸãã°ã²ãŒã éçºããŒã ã¯å·šå€§ãªäžæ¬¡å ã¢ãã«ãæ±ããªããã°ãªããªããããŠã§ãéçºããŒã ã¯ç»åã®çããŒã¿ãèšé²ããªããã°ãªããªãããšããããŸããCAD éçºããŒã ã¯ãã€ããªæŽŸçç©ã®åŠçãèšé²ãè¡ãå ŽåãçããŸãã å³ã¡ãgit ãå©çšããããŸããŸãªåéã®ãœãããŠã§ã¢éçºããŒã ããã®åé¡ã«çŽé¢ããã®ã§ãã
Git ã®ãã€ã㪠ããŒã¿åŠçèœåã«ç¹æ®µã®åé¡ãããããã§ã¯ãªãã§ããããã®ç¹ã§ Git ãç¹å¥åªããŠããããã§ããããŸãããããã©ã«ãã§ã¯ git ã¯ãã€ã㪠ããŒã¿ã«ã€ããŠäžé£ã®ããŒãžã§ã³ã®ãã¹ãŠãå§çž®ããŠæ ŒçŽããŸãããããã¯ããŒãžã§ã³æ°ãå€ãå Žåã¯æããã«åŸçã§ã¯ãããŸããã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ git gc ã®å®è¡ã.gitattributes ã«ãããŠæå®ããããã€ãã®ãã€ããªã¿ã€ãã«å¯Ÿã㊠delta å§çž® (å·®åå§çž®) ã䜿çšããã³ããããé©çšãããªã©ããã®ç¶æ³ãæ¹åããåºæ¬çãªææ³ãããã€ããããŸãã
ãããçéã¯ååšããªãããããã€ã㪠ããŒã¿ã®ç¹æ§ãåã ã«èæ ®ããããšãéèŠãšãªããŸããäŸãšããŠã確èªããã¹ãç¹ã 3 ã€æããŸã (Stefan Saasen ã«æèŠãé ããŸãã):
- ããçš®ã®ã¡ã¿ããŒã¿ããããŒã«éããã倧ããªå€æŽã®ãããã€ããªãã¡ã€ã«ã«ã€ããŠã¯å€ãã®å Žå delta å§çž®ã¯æå¹ã§ã¯ãªãããããã£ãŠäœèšãª delta å§çž®åäœããªããã¯æã«çºçããããšã鲿¢ããããã« delta off ãšããããšãæšå¥šããŸãã
- äžã®ã·ããªãªã«åŸããšããããã®ãã¡ã€ã«ã«å¯ŸããŠã¯ zlib å§çž®ãããŸãæå¹ã§ã¯ãªãããããã£ãŠ core.compression 0 ã core.loosecompression 0 ãæå®ããŠå§çž®ãç¡å¹ã«ããŠãããã§ãããã ããããã¯å§çž®ãæå¹ãªãã¹ãŠã®éãã€ããªãã¡ã€ã«ã«æªåœ±é¿ãäžããå¯èœæ§ã®ããã°ããŒãã«èšå®ã§ããããããã®æšå¥šèšå®ã¯ãã€ã㪠ããŒã¿ãå¥ã®ãªããžããªã«åé¢ããå Žåã®ã¿æçšãšèšããŸãã
- ãªããgit gc ã¯ãéè€ãããã«ãŒãºãªããžã§ã¯ãã 1 åã®ããã¯ãã¡ã€ã«ã«å€æããŸãããããã§ãçµæãšããŠçæãããããã¯ãã¡ã€ã«ã®å§çž®å¹æã¯å°ãããšæãããããšã«çæããŠãã ããã
- core.bigFileThreshold ã®åŸ®èª¿æŽã .gitattributes ã«ãããèšå®ããªãå Žåã¯512 MiB ãã倧ããªãã¡ã€ã«ã¯ delta å§çž®ãããªãããããã®æ¹æ³ã詊ã䟡å€ã¯ããã§ãããã
ãã¯ãã㯠1: sparse checkout
sparse checkout (Git 1.7.0] 以éã«ãããŠæäŸ) ã¯ããã€ã㪠ããŒã¿ã®åé¡ã«å¯ŸåŠããããã®ã¡ãã£ãšããå©ãã«ãªããŸãããã®ãã¯ããã¯ã§ã¯ãã§ãã¯ã¢ãŠããããã©ã«ããŒãæå®ã§ãããããäœæ¥ãã£ã¬ã¯ããªã¯ã¯ãªãŒã³ã«ä¿ãããŸããæ®å¿µãªããããã¯ããŒã«ã«ãªããžããªå šäœã®ãµã€ãºã«ã¯åœ±é¿ããªããã®ã®ããã©ã«ããŒããªãŒã®ãµã€ãºã巚倧ãªãã®ã«ãªã£ãŠããå Žåã¯æçšãªãã¯ããã¯ã§ãã
ããã«é¢é£ããã³ãã³ãã®äŸãæããŸããã (ã¯ã¬ãžãã):
- ãªããžããªå šäœãäžåºŠã ãã¯ããŒã³ãã: git clone
- sparse checkout ãæå¹ã«ãã: git config core.sparsecheckout true
-
ããŒã¿ãã©ã«ããŒãé€å€ããå¿ èŠãªãã©ã«ããŒã®ã¿ãæå®ãã:
echo src/ ? .git/info/sparse-checkout
æå®ã«åŸã£ãŠããªãŒãèªã¿èŸŒã: git read-tree -m -u HEAD
äžèšæäœãè¡ã£ãåŸã¯éåžžã® git ã³ãã³ãã䜿çšããããšãã§ããŸããããã ãäœæ¥ãã£ã¬ã¯ããªã«ã¯äžã§æå®ãããã©ã«ããŒã®ã¿ãå«ãŸããŸãã
ãã¯ãã㯠2: ãµãã¢ãžã¥ãŒã«ã®äœ¿çš
巚倧ãªãã€ããªããŒã¿ãã©ã«ããŒãåãæ±ãå¥ã®æ¹æ³ãšããŠãããããå¥ã®ãªããžããªã«åé¢ãããµãã¢ãžã¥ãŒã«ã䜿çšããŠã¡ã€ã³ã®ãªããžããªã«ãã«ãããšããææ³ããããŸãããã®ææ³ã§ã¯ãããŒã¿ãã¢ããããŒããããšãã®ç®¡çãå¯èœã§ãããµãã¢ãžã¥ãŒã«ã«ã€ããŠã¯æ¬¡ã®èšäºã Git Submodules: ã³ã¢ã³ã³ã»ãããã¯ãŒã¯ãããŒãã³ã ããã³ Git Submodule ã®ä»£æ¿: Git Subtreeãåèãšãªãã§ãããã
submodules ãå©çšããæ¹æ³ããšãå Žåã¯ã巚倧ãã€ããªãã¡ã€ã«ã®åé¡ã«å¯ŸããŠåèãšãªãããã€ãã®ã¢ãããŒãã説æãã complexities of handling project dependencies ãåç §ãããšããã§ãããã
ãã¯ãã㯠3: git annex ãŸã㯠git-bigfiles ã®æŽ»çš
git ã«ãããŠãã€ã㪠ããŒã¿ãåãæ±ã第äžã®ãªãã·ã§ã³ã¯é©åãªãµãŒãããŒãã£ãŒè£œæ¡åŒµããŒã«ãå©çšããããšã§ãã
æåã«åãäžãããã®ã git-annex ã§ããã¡ã€ã«ã®å 容ããªããžããªã«ãã§ãã¯ããããšãªããã€ããªãã¡ã€ã«ã®ç®¡çãå¯èœãªããŒã«ã§ããgit-annex ã§ã¯ãã¡ã€ã«ãç¹å¥ãª key-value ã¹ãã¢ãšããŠä¿åããgit ã«ã¯ã·ã³ããªãã¯ãªãªã³ã¯ã®ã¿ããã§ãã¯ããŠéåžžã®ãã¡ã€ã«ã®ããã«ããŒãžã§ã³ç®¡çãè¡ãããšãã§ããŸããäœ¿çšæ¹æ³ã¯ç°¡åã§ãããå©çšäŸãçè§£ããããã§ãããã
åãäžãããäºã€ç®ã¯ git-bigfilesã§ãããããã¯éåžžã«å€§ããªãã¡ã€ã«ãæ±ããããžã§ã¯ãã«ãã㊠Git ãå©çšããéçºè ãæ¯æŽããããšãæå³ãã git ã®ãã©ãŒã¯ã§ãã
çµè«
ãªããžããªã®å±¥æŽã巚倧ãªãã®ã«ãªã£ãŠãããšããŠãããŸã巚倧ãªããŒã¿ãåãæ±ããªããã°ãªããªããšããŠããgit ã®ãã°ãããæ©èœã掻çšã§ããªããšè«Šããå¿ èŠã¯ãããŸãããã©ã¡ãã®åé¡ã«å¯ŸããŠãæçšãªãœãªã¥ãŒã·ã§ã³ãããã®ã§ãã
忣åããŒãžã§ã³ç®¡çã·ã¹ãã ã®è©³ããããšã¯ã
@durdn ã@AtlDevtoolsã§ç§ãéçºããŒã ãã©ããŒããŠãã ããã
æ¬çš¿ã¯ãAtlassian Blogs æ¥æ¬èªçã®è»¢èŒã§ããæ¬æäžã®æ¥æãªã©ã¯Atlassian Blogs è±èªçã§ã®æçš¿åœæã®ãã®ã§ãã®ã§ãäºæ¿ãã ããã