github.com/saracen/git-lfs@v2.5.2+incompatible/t/t-prune-worktree.sh (about) 1 #!/usr/bin/env bash 2 3 . "$(dirname "$0")/testlib.sh" 4 5 ensure_git_version_isnt $VERSION_LOWER "2.5.0" 6 7 begin_test "prune worktree" 8 ( 9 10 set -e 11 12 reponame="prune_worktree" 13 setup_remote_repo "remote_$reponame" 14 15 clone_repo "remote_$reponame" "$reponame" 16 17 git lfs track "*.dat" 2>&1 | tee track.log 18 grep "Tracking \"\*.dat\"" track.log 19 20 content_head="First checkout HEAD" 21 content_worktree1head="Worktree 1 head" 22 content_worktree2head="Worktree 2 head" 23 content_oldcommit1="Always pruned 1" 24 content_oldcommit2="Always pruned 2" 25 content_oldcommit3="Always pruned 3" 26 27 oid_head=$(calc_oid "$content_head") 28 oid_worktree1head=$(calc_oid "$content_worktree1head") 29 oid_worktree2head=$(calc_oid "$content_worktree2head") 30 oid_oldcommit1=$(calc_oid "$content_oldcommit1") 31 oid_oldcommit2=$(calc_oid "$content_oldcommit2") 32 oid_oldcommit3=$(calc_oid "$content_oldcommit3") 33 34 echo "[ 35 { 36 \"CommitDate\":\"$(get_date -40d)\", 37 \"Files\":[ 38 {\"Filename\":\"file.dat\",\"Size\":${#content_oldcommit1}, \"Data\":\"$content_oldcommit1\"}] 39 }, 40 { 41 \"CommitDate\":\"$(get_date -35d)\", 42 \"NewBranch\":\"branch1\", 43 \"Files\":[ 44 {\"Filename\":\"file.dat\",\"Size\":${#content_oldcommit2}, \"Data\":\"$content_oldcommit2\"}] 45 }, 46 { 47 \"CommitDate\":\"$(get_date -20d)\", 48 \"Files\":[ 49 {\"Filename\":\"file.dat\",\"Size\":${#content_worktree1head}, \"Data\":\"$content_worktree1head\"}] 50 }, 51 { 52 \"CommitDate\":\"$(get_date -30d)\", 53 \"ParentBranches\":[\"master\"], 54 \"NewBranch\":\"branch2\", 55 \"Files\":[ 56 {\"Filename\":\"file.dat\",\"Size\":${#content_oldcommit3}, \"Data\":\"$content_oldcommit3\"}] 57 }, 58 { 59 \"CommitDate\":\"$(get_date -15d)\", 60 \"Files\":[ 61 {\"Filename\":\"file.dat\",\"Size\":${#content_worktree2head}, \"Data\":\"$content_worktree2head\"}] 62 }, 63 { 64 \"CommitDate\":\"$(get_date -30d)\", 65 \"ParentBranches\":[\"master\"], 66 \"Files\":[ 67 {\"Filename\":\"file.dat\",\"Size\":${#content_head}, \"Data\":\"$content_head\"}] 68 } 69 ]" | lfstest-testutils addcommits 70 71 # push everything so that's not a retention issue 72 git push origin master:master branch1:branch1 branch2:branch2 73 74 # don't keep any recent, just checkouts 75 git config lfs.fetchrecentrefsdays 0 76 git config lfs.fetchrecentremoterefs true 77 git config lfs.fetchrecentcommitsdays 0 78 79 # before worktree, everything except current checkout would be pruned 80 git lfs prune --dry-run 2>&1 | tee prune.log 81 grep "prune: 6 local object(s), 1 retained, done" prune.log 82 grep "prune: 5 file(s) would be pruned" prune.log 83 84 # now add worktrees on the other branches 85 git worktree add "../w1_$reponame" "branch1" 86 git worktree add "../w2_$reponame" "branch2" 87 # now should retain all 3 heads 88 git lfs prune --dry-run 2>&1 | tee prune.log 89 grep "prune: 6 local object(s), 3 retained, done" prune.log 90 grep "prune: 3 file(s) would be pruned" prune.log 91 92 # also check that the same result is obtained when inside worktree rather than main 93 cd "../w1_$reponame" 94 git lfs prune --dry-run 2>&1 | tee prune.log 95 grep "prune: 6 local object(s), 3 retained, done" prune.log 96 grep "prune: 3 file(s) would be pruned" prune.log 97 98 # now remove a worktree & prove that frees up 1 head while keeping the other 99 cd "../$reponame" 100 rm -rf "../w1_$reponame" 101 git worktree prune # required to get git to tidy worktree metadata 102 git lfs prune --dry-run 2>&1 | tee prune.log 103 grep "prune: 6 local object(s), 2 retained, done" prune.log 104 grep "prune: 4 file(s) would be pruned" prune.log 105 106 107 ) 108 end_test 109