Although I'm a happy (also paying) user of GitHub's offerings, there are times when I prefer to host a private repository on a server I control. Setting up your own Git server can be useful if you're isolated from the public internet, if you're subject to inflexible regulations, or if you simply want features different from those offered by GitHub (and other similar providers). Setting up a Git server on a Unix (Linux, Mac OS X, *BSD, Solaris, AIX) machine isn't difficult, but there are many details to observe. Here is a complete guide.
Through the following steps you can setup and use your own
Git server at a server, say myhost.example.com
.
Some of the steps,
like email notifications, users with a restricted shell, and
access control for a particular group,
are optional depending on your requirements and the situation at hand.
For many of the commands you will need administrator (root) privileges,
so prefix them with sudo
or (heaven forbid) run them
from within a root shell.
groupadd
command, using vigr
to edit
the group file, or editing directly the file /etc/group
.
In the end you want to have a line like the following in the
/etc/group
file.
repogroup:*:10005:marry,john,violetwhere
repogroup
is the name of the group that will get access to the
specific repository,
10005 is a unique group identification number,
and marry,john,violet
are the user identifiers of people
that will get access to the repository.
/home/yourname/gitroot
)
or in a dedicated directory
(e.g. /var/gitroot
).
chmod g+rx /path-to/gitroot
chown :grouprepo /path-to/gitroot
newrepo
.
cd /path-to/gitroot
git init --bare newrepo.git
cd newrepo.git
chown -R :grouprepo .
git config core.sharedRepository group
find . -type d -print0 | xargs -0 chmod 2770
find . -type f -print0 | xargs -0 chmod g=u
echo 'One-line project description' >description
git config --local hooks.mailinglist email-a@example.com,email-b@example.com,...
git config --local hooks.emailprefix '[DI-PR] '
git config --local hooks.showrev "git show -C %s; echo"
git config --local hooks.emailmaxlines 100
cd hooks
cp post-receive.sample post-receive
chmod +x post-receive
#
from the last line of the post-receive
script,
so that it will be as follows.
. /path-to-hooks/post-receive-email
cd to-your-personal-working-directory
git clone myhost.example.com:/path-to/gitroot/newrepo.git
echo "Short project description" >README.txt
git add README.txt
git commit -a -m "Add README file"
git push origin master # This first time only "origin master" args needed
useradd
or
adduser
.
ssh-keygen
(accepting the default responses),
and send you the file .ssh/id_rsa.pub
.
sudo su - username
mkdir -p .ssh
cat >>.ssh/authorized_keys <<\EOF
paste-key-as-one-line
EOF
exit
/usr/libexec/git-core/git-shell
or
/usr/local/libexec/git-core/git-shell
.
Therefore, for each user you want to offer restricted access run a command
like the following.
sudo chsh -s /usr/libexec/git-core/git-shell username
git clone myhost.example.com:/path-to/gitroot/newrepo.git
Last modified: Wednesday, June 19, 2013 2:20 pm
Unless otherwise expressly stated, all original material on this page created by Diomidis Spinellis is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.