Neo
Neo

Reputation: 1236

Git repository URL - SSH syntax without absolute path

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:

  1. 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).
  2. Drop SSH and use git-daemon and specify its --base-path parameter (still a workaround...)
  3. Use an utility like gitosis or gitolite - 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?

Upvotes: 75

Views: 110679

Answers (3)

larsks
larsks

Reputation: 311506

If you use the alternate form for ssh remote specifications 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.

Upvotes: 92

Eric Anderson
Eric Anderson

Reputation: 1966

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.

Upvotes: 1

user1708042
user1708042

Reputation: 1863

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.

Upvotes: 6

Related Questions