Skip to content
  • Duy Nguyen's avatar
    clone: support remote shallow repository · beea4152
    Duy Nguyen authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Cloning from a shallow repository does not follow the "8 steps for new
    .git/shallow" because if it does we need to get through step 6 for all
    refs. That means commit walking down to the bottom.
    
    Instead the rule to create .git/shallow is simpler and, more
    importantly, cheap: if a shallow commit is found in the pack, it's
    probably used (i.e. reachable from some refs), so we add it. Others
    are dropped.
    
    One may notice this method seems flawed by the word "probably". A
    shallow commit may not be reachable from any refs at all if it's
    attached to an object island (a group of objects that are not
    reachable by any refs).
    
    If that object island is not complete, a new fetch request may send
    more objects to connect it to some ref. At that time, because we
    incorrectly installed the shallow commit in this island, the user will
    not see anything after that commit (fsck is still ok). This is not
    desired.
    
    Given that object islands are rare (C Git never sends such islands for
    security reasons) and do not really harm the repository integrity, a
    tradeoff is made to surprise the user occasionally but work faster
    everyday.
    
    A new option --strict could be added later that follows exactly the 8
    steps. "git prune" can also learn to remove dangling objects _and_ the
    shallow commits that are attached to them from .git/shallow.
    
    Signed-off-by: default avatarNguyễn Thái Ngọc Duy <pclouds@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    beea4152