Git repository URL - SSH syntax without absolute path
GitSshGit Problem Overview
I'm running a git repository server accessible via SSH, on a custom port (let's say 12345). I have found that in this case the repository URLs need to be specified using SSH syntax:
git clone ssh://[email protected]:12345/absolute/path/to/repository
I'd like to setup it in such a way that it would be possible for users to clone repositories without specifying the absolute path.
git clone ssh://[email protected]:12345/repository.git
I have researched the topic and found the following options:
- Remove the custom port from the URL and make the users add it to their
~/.ssh/config
file (a last-resort workaround rather than a solution). - Drop SSH and use
git-daemon
and specify its--base-path
parameter (still a workaround...) - Use an utility like
gitosis
orgitolite
- but wouldn't it be an overkill to use it for this purpose only? Gitosis is discontinued, gitolite is a quite huge piece of software...
All I want is a "prettier" SSH URL with custom port (so I can distribute the whole git clone
command and require nothing more from the remote user). Which one of the above solutions would be the most viable in my case?
Git Solutions
Solution 1 - Git
If you use the alternate form of ssh
URLs you don't need an absolute path. For example...
git clone [email protected]:repos/myrepo.git
...will clone repository repos/myrepo.git
relative to my home directory, although this doesn't permit use of an alternate port. However, you can also use ~
in either form to indicate the user's home directory, e.g.:
git clone ssh://[email protected]:12345/~/repository.git
Incidentally, despite being discontinued, gitosis
functions quite well, and the code is both small and easy to understand. It offers a useful set of access controls and self-service management of repositories. I wouldn't discount it completely.
Solution 2 - Git
I do this, not exactly what you asked, but close and with prettier links:
create a path like
/srv/git
where you place you git projects
next make a symbolic link to home:
ln -s /srv/git $HOME
next you can have shorter links
git clone user@server:git/myproject.git
if you have a single project you can get rid of the git/ part in the url
ln -s /srv/git/myproject.git $HOME
next
git clone user@server:myproject.git
will work. Of course the .git at the end of the URL comes only from creating the bare with .git in the name. Note also that ssh:// part is not needed: the @ implies it is an ssh URL for git.
Updated: let me add a sidenote: following the most recent Filesystem Hierarchy Standard I use now /srv/git
as repository location.
Solution 3 - Git
I'm not sure this really deserves to be a whole answer, but I'm sick of fighting with comment-specific formatting rules. I come to say:
I just want to add that this seems to be a version-specific change, though I'm not sure if it's client-side or server/repo-holder side: I have a .git/config
file with lots of URLs like:
[remote "bob"]
url = ssh://ME@MACHINE<strong>/~ME</strong>/repositories/REPO.git
fetch = +refs/heads/*:refs/remotes/bob/*
They all worked when I set them up ... in 2010, and were still working the last time I used those remotes, in 2016 or so.
Now, on version 2.18.0, those don't work, and I need to use the :/~ME/foo
or :/~/foo
notation. Which is to say that what you're trying to do no hasn't always been wrong.