The difference here is that git objects don't change. When you do a `git gc`, you do get new objects at new inodes, but they don't get written to the existing ones. Try this out and you'll see local git clones do indeed create hardlinks:
```
cd $(mktemp -d)
git init test
( cd test; touch README.md; git add README.md; git commit -m "Test"; )
git clone test/.git test_clone
find test_clone/.git/objects test/.git/objects -type f -printf "%i\t%p\n" | sort
```
``` cd $(mktemp -d) git init test ( cd test; touch README.md; git add README.md; git commit -m "Test"; ) git clone test/.git test_clone find test_clone/.git/objects test/.git/objects -type f -printf "%i\t%p\n" | sort ```
You'll see the same inodes used in both clones.