When it comes to Git hosting, you have a number of options available.  GitHub, Gitlab and Bitbucket are popular solutions, but running your  own Git server is an alternative worth considering.

Setting up a Git Server allows you to create private repositories without the restrictions of the providers’ free plans.
In  this guide, we explain how to set up a bare Git server on Linux. This  setup is good if you have few repositories and the collaborators are  tech-savvy. Otherwise, you should consider installing a self-hosted git  application such as Gitea, Gogs, or Gitlab.

The Git server can be set up on any remote Linux machine or even on your local system.

Setting Up the Git Server

The first step is to install Git on your server.

If you are using Debian or Ubuntu, refresh the local package index and install git by running the following commands as sudo user:

sudo apt update && sudo apt install git

To install the git package on CentOS servers type:

sudo yum install git

Next, create a new user that will manage the Git repositories:

sudo useradd -r -m -U -d /home/git -s /bin/bash git

The user home directory is set to /home/git.  All the repositories will be stored under this directory. We did not  set a password for the user “git”, the login will be possible only using  the ssh keys.

Switch to user “git” using the su command:

sudo su - git

Run the following commands to create the SSH directory and set the correct permissions:

mkdir -p ~/.ssh && chmod 0700 ~/.ssh

Create a file named ~/.ssh/authorized_keys which will hold the authorized users’ SSH keys:

touch ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys

That’s it. The server setup is complete. You’re now ready to create your first Git repository.

Run the following command to initiate a new empty repository:

git init --bare ~/projectname.git

You can name the directory as you want. The important thing is to create the repository under the “git” user home directory.

Initialized empty Git repository in /home/git/projectname.git/

Configuring Local Git Repository

To  be able to push the local git changes to the Git server you’ll to add  your local user SSH public key to the remote “git” user’s authorized_keys file.

If you already have an SSH key pair created on your local system, you can display the public key by typing:

cat ~/.ssh/id_rsa.pub

The output should look something like the following:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDd/mnMzHwjUzK8g3ldfsfRpJuC16mhWamaXRk8ySQrD/dzpbRLfDnZsLxCzRoq+ZzFHGwcQlJergtergdHGRrO8FE5jl3IWRRp+mP12qYw== danny@justla.me

If you get an error message saying No such file or directory, it means that you do not have an SSH key pair generated on your local machine.

To generate a new SSH key pair use the following command:

ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

Copy the output from the cat command above and go back to the Git server console.

On the server, open your text editor and paste the public key that you copied from your local machine into the ~/.ssh/authorized_keys file:

sudo nano /home/git/.ssh/authorized_keys

The entire public key text should be on a single line.

We’re  assuming that Git package is already installed on your local machine.  If not, install it in the same way as explained in the previous  sections.

If you have an existing unversioned project, navigate to  the project directory. If you are starting from scratch, create the  project directory, and navigate to it:

cd /path/to/local/project

Initialize a git repository:

git init .

The last step is to add the git remote to your local repository:

git remote add origin git@git_server_ip:projectname.git

Do not forget to replace git_server_ip with your Git server hostname or IP address.

To verify that everything is setup up correctly, create a test file:

touch test_file

Add the changes to the staging area:

git add .

Commit the changes:

git commit -m "descriptive message"

Push the local repository changes to a remote repository:

git push -u origin master

If everything is set up correctly, the output should look something like this:

Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git_server_ip:projectname.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

To add a new collaborator, just copy its public SSH key to the “git” user’s ~/.ssh/authorized_keys file.

You  can use the same steps to create new repositories. It is important to  note that the remote repository must exist before you add the git remote  to your local repository.


In this tutorial, we have shown you how to set up your own private Git server and create repositories.

If you hit a problem or have feedback, leave a comment below.