Skip to Content
We are live but in Staging 🎉
CLI GuideClone & Push

Clone & Push

Moving commits is plain git against the wire. The CLI’s job is to hand you the URLs.

clone-url

dodil git clone-url my-service # HTTP: https://git.dodil.io/<repo_id>.git # SSH: [email protected]:<repo_id>.git

-o json returns {"http": "…", "ssh": "…"} for scripting. Both URLs address the repo by its repo_id — stable across renames.

Smart-HTTP

The dk_ org API key (issue one here) is the Basic password; the username is ignored:

git clone https://user:[email protected]/<repo_id>.git my-service cd my-service git push origin main

For anything beyond a one-off, keep the key out of the remote URL with a credential helper:

git config --global credential.helper store git clone https://git.dodil.io/<repo_id>.git my-service # Username: user (anything) # Password: dk_XXXX (the API key secret)

In CI, inject the key from a secret:

git clone "https://ci:${DODIL_GIT_KEY}@git.dodil.io/${REPO_ID}.git"

Public repos clone anonymously — no credential needed for read.

SSH

With a public key uploaded on the console’s SSH Keys page:

git clone [email protected]:<repo_id>.git my-service git push origin main

A key marked read-only can clone and fetch but any push is rejected on the channel.

Adding Dodil as a remote

For an existing local repo (see the mirror recipe for the full flow):

git remote add dodil https://git.dodil.io/<repo_id>.git git push dodil --all git push dodil --tags

What the wire enforces

Pushes are checked server-side against your role and the branch’s protection rules: git.viewer credentials and read-only SSH keys cannot push; protected branches reject force-pushes and deletions when configured.

See also