GitOnSharedHost

Created Friday 02 December 2022

Recently I set up read-only Git repository hosting on Dreamhost for my project JACL. This was kind of tricky, so here are the steps:

  1. In the Dreamhost control panel, set up SSH for a user.
  2. Once you can log in with a password, you probably want to set up key-based authentication.
  3. On the remote host, cd into the directory corresponding to your hosted domain.
  4. mkdir your-repo.git
  5. cd your-repo.git
  6. git init --bare
  7. cp hooks/post-update.sample hooks/post-update
  8. Back in your local repo, run a command like the following: git remote add origin ssh://user@northbend.dreamhost.com:/home/user/example.com/your-repo.git substituting user, northbend.dreamhost.com, and example.com with your particulars.
  9. git push -u origin master
  10. Now, you should be able to git push and anyone on the Internet should be able to git clone https://example.com/your-repo.git

Cloning or fetch failures on shared hosts

On shared hosting, git clone or git fetch over SSH can fail with errors like:

  • fatal: unable to create thread: Resource temporarily unavailable
  • git upload-pack: git-pack-objects died with error
  • fatal: early EOF
  • misleading messages about possible repository corruption

These errors are misleading. The repository is usually fine. The real issue is strict process and thread limits on shared hosting. When Git tries to pack objects with multiple threads, git pack-objects can exceed those limits and die.

Force single-threaded packing on the server:

git config --global pack.threads 1

Optional conservative memory limits that are often needed on shared hosts:

git config --global pack.windowMemory 10m
git config --global pack.packSizeLimit 50m

These settings are safe defaults for shared hosts and avoid the thread limit failures.

If SSH cloning still fails, fall back to:

  • Shallow clones (git clone --depth 1)
  • git bundle to transfer repositories when SSH cloning is unreliable