gitosis
Setup and use of git repository on Fedora
Please read the full documentation before you try it!
Install Gitosis
sudo yum install gitosis
Update ssh pub key
If you are an admin, copy your ~/.ssh/id_rsa.pub (or id_dsa.pub) to the remote server system and add it to the repo using:
sudo -H -u gitosis gitosis-init < /path/to/id_rsa.pub
Test
From your local system, try to get the repo via clone:
git clone gitosis@server_name:gitosis-admin.git
Add project, user and test
Add the following to gitosis.conf:
[group hello-project] writable = hello_project members = shaks@fedora
Commit the same using:
git commit -a -m "Allow shaks to hello_project repo"
Push to server:
git push
Create local directory, and push to server
Create local directory:
mkdir hello_project
Add files:
cp -r /path/to/files hello_project/*
git-init, add and push:
git init git remote add origin gitosis@server_name:hello_project.git git add . git commit -m "Comment" git push origin master:refs/heads/master
You will get an output like:
Initialized empty Git repository in ./ Counting objects: 1734, done. Compressing objects: 100% (1703/1703), done. Writing objects: 100% (1734/1734), 2.48 MiB | 2061 KiB/s, done. Total 1734 (delta 693), reused 0 (delta 0) To gitosis@server_name:hello_project.git * [new branch] master -> master
Adding new users
Copy the user.pub file to gitosis-admin/keydir. Update the gitosis.conf, to say:
members = shyam anita
The corresponding .pub files are shyam.pub, and anita.pub. Commit it.
git add . git commit -m "Added anita to repository" git push
Now, the user can clone the repo from his/her system:
git clone gitosis@server_name:demo.git
The user repo only needs to make changes and push the changes to the server using git push, after committing the same for the master. If you create new branches, you need to tell git about it:
git push origin branch_name
When you checkout, the branches will be seen in git branch -r output. You can then check them out, if you want using:
git checkout -tb remote_branch_name origin/remote_branch_name
So, the remote_branch_name will be the same name as origin/remote_branch_name, so git knows where to push back the changes. Make some changes, commits, and push:
git push origin remote_branch_name
If you don't want to give -t in the command line (you will still need to checkout -b the remote_branch to a local branch with the same name), and you want to keep track for all repositories, do the following:
git config --global branch.autosetupmerge true
OR
Add the following to your ~/.gitconfig:
[branch] autosetupmerge = true
Fetching changes from remote repo
If you already have cloned a git repo and have it locally, you can get updates from remote repo or upstream using:
git fetch
The remote branch is listed with:
git branch -r
and it shows:
origin/master
You can see the changes between the local master and the remote origin/master using:
git diff master..origin/master
To merge the changes to your local repo, you can use:
git merge origin/master
So, fetch only downloads the changes, and you can see the changes before doing a merge. git pull will do a fetch and a merge. But, you need to add the following in your project .git/config.
[branch "master"] remote = origin merge = refs/heads/master
Or, you can simply do from the current master branch:
git pull . remotes/origin/master
Deleting a repo
Clone the gitosis-admin.git, remove the entry for the project (the [group project_name]) in gitosis.conf. Commit the same, and push it to the server:
git add gitosis.conf git commit -m "Removed project_name repo" git push
Login to the remote server, and remove the directory, /var/lib/gitosis/repositories/project_name.git.
.gitignore
*.log *.sqlite3 config/database.yml config/settings.yml tmp/**/* *.o a.out *.svn
Project file description hasn't been set
If you get the above error:
$ git push Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 400 bytes, done. Total 3 (delta 1), reused 0 (delta 0) *** Project description file hasn't been set error: hooks/update exited with error code 1 error: hook declined to update refs/heads/master To gitosis@192.168.1.17:gitosis-admin.git ! [remote rejected] master -> master (hook declined) error: failed to push some refs to 'gitosis@192.168.1.17:gitosis-admin.git'
Update .git/description on local copy and remote /var/lib/repositories/repository_name.git/description file, and git push.
git-daemon
Install git-daemon on the server:
sudo yum install git-daemon
You can start it on the server using:
sudo -u gitosis git-daemon --base-path=/var/lib/gitosis/repositories/ --export-all
Now, anyone can checkout the repository code as read-only:
git clone git://server_name/hello_project.git
But, if you want to push, you will need to have your SSH keys uploaded to the repo, and you will need to use:
git clone gitosis@server_name:project.git
git-daemon can be started from xinetd with the following sample /etc/xinetd.d/git:
# default: off # description: The git dæmon allows git repositories to be exported using # the git:// protocol. service git { disable = no socket_type = stream wait = no user = gitosis server = /usr/bin/git-daemon server_args = --base-path=/var/lib/gitosis/repositories/ --export-all --syslog --inetd --verbose log_on_failure += USERID # xinetd doesn't do this by default. bug #195265 flags = IPv6 }
Restart xinetd:
/etc/init.d/xinetd restart
You can check if git-daemon is running from the output of:
netstat -na | grep :9418