badd10de.dev

Git


Hosting private or shared git repositories without dependencies

Tools like Gitea/GitLab/cgit exist to be able to manage and browse code repositories in a simple way. However, I prefer to have as few dependencies as possible. For hosting my own private or shared git repositories it would be sufficient to set up some bare repositores on a target machine. The main hassle is to create new repositories there or assign permissions. But is it really a problem?

Putting an existing repository from a local machine into the remote

git clone --bare my_project my_project.git
scp -r my_project.git user@git.example.com:/srv/git

Making a remote repository shared by a group of users

Access the folder via SSH:

ssh user@git.example.com
cd /srv/git

Running the following command will allow any user on the machine within the group name_of_group to access and push to this repository. Additionally, the default branch name is main instead of master.

git init --bare --shared=name_of_group
git symbolic-ref HEAD refs/heads/main

Remove a branch in Git

Delete a local branch:

git branch -d branch-name

Delete a remote branch:

git push origin --delete branch-name-on-remote

Send and receive patches

There are 2 ways of generating patches with git. The first one is to generate a git diff with:

# Send the last commit
git diff HEAD~1 > name.of.patch

# Send the patch since a given commit with hash: 01020304
git diff 01020304 > name.of.patch

If git-send-email is correctly configured we can send a mail directly with our patch:

git send-email --to="bd@badd10de.dev" HEAD^

To apply patches from git diff or if the message was downloaded as an attachment use:

# Check if there are any issues with the patch.
git apply --check <patchname>

# Apply the patch.
git apply <patchname>

This will only apply the patch, meaning we need to commit the changed files afterwards. If the patch was sent with git send-email, we can send the entire email to git am which will update the index list with all the authors. If using mutt you can pipe the email directly to the index. If not, download the full mail and save it somewhere in your path and then:

git am pathname.mail

Resources