Setup a Git Server over SSH
Plan server
Like GitHub, I want to have git url like git@example.com:repos/myrepo.git
,
so I can clone as:
$ git clone git@example.com:repos/myrepo.git
Create git user
To do this, I need create a user named git on my Linux server:
$ sudo useradd -m git --shell /usr/bin/git-shell
To prevent git user ssh login,
use --shell /usr/bin/git-shell
set git user shell to git-shell
.
git-shell
is a login shell for SSH accounts to provide restricted Git access.
It permits execution only of server-side Git commands implementing the pull/push functionality,
plus custom commands present in a subdirectory named git-shell-commands in the user’s
home directory.
NOTE
You can not set shell to /usr/sbin/nologin or /bin/false, it will cause git clone failure. You may get error like following:
$ git clone git@my-example-server.com:repos/myrepo.git fatal: protocol error: bad line length character: This
Add ssh public key authentication
The ssh public key authentication is more secure than username / password authentication.
ssh server use $HOME/.ssh/authorized_keys
to authenticate user.
The authorized_keys
file in SSH specifies the SSH keys that can be used for
logging into the user account for which the file is configured.
$ cd
$ mkdir .ssh
$ touch authorized_keys
$ chmod 600 authorized_keys
Then add client’s ssh public key ($HOME/.ssh/id_rsa.pub
) to authorized_keys
Prepare a bare repo
To host a git repo, it need a bare repository — a Git repository that has no working directory. It roughly equal the .git directory.
Create bare repo by git init
Create a bare empty repo with --bare
option:
$ cd $HOME/repos
$ git init --bare myrepo.git
Initialized empty Git repository in /Users/git/repos/myrepo.git/
$ ls -l myrepo.git
total 24
-rw-r--r-- 1 git staff 23 Jul 07 16:55 HEAD
-rw-r--r-- 1 git staff 111 Jul 07 16:55 config
-rw-r--r-- 1 git staff 73 Jul 07 16:55 description
drwxr-xr-x 13 git staff 416 Jul 07 16:55 hooks
drwxr-xr-x 3 git staff 96 Jul 07 16:55 info
drwxr-xr-x 4 git staff 128 Jul 07 16:55 objects
drwxr-xr-x 4 git staff 128 Jul 07 16:55 refs
Create bare repo by git clone
Create a bare repo from exist repo by clone with --bare
:
$ git clone --bare https://github.com/github/fetch.git
Cloning into bare repository 'fetch.git'...
remote: Enumerating objects: 2129, done.
remote: Total 2129 (delta 0), reused 0 (delta 0), pack-reused 2129
Receiving objects: 100% (2129/2129), 446.70 KiB | 924.00 KiB/s, done.
Resolving deltas: 100% (1369/1369), done.
$ ls fetch.git
HEAD config description hooks info objects packed-refs refs
Git clone
After the setup, now can clone it:
$ git clone git clone git@my-example-server.com:repos/myrepo.git
Reference

OmniLock - Block / Hide App on iOS
Block distractive apps from appearing on the Home Screen and App Library, enhance your focus and reduce screen time.

DNS Firewall for iOS and Mac OS
Encrypted your DNS to protect your privacy and firewall to block phishing, malicious domains, block ads in all browsers and apps