When working with a new git project, I like to publish my patches in git branches on my public git server. I usually use the collabora git server, but some people also have account on freedesktop, etc. But it’s a bit long just to publish a branch:
- locally: git clone ssh://git.gnome.org/git/empathy
- locally: ssh git.collabora.co.uk
- collabora: cd public_html/git && git init --bare git://git.gnome.org/empathy
- locally: git remote add xclaesse git+ssh://git.collabora.co.uk/git/user/xclaesse/empathy
Note how GNOME urls are different in 1) and 3), not only the ssh:// VS git:// but also the extra /git/ and it’s different with freedesktop.
So my first step to simplify this is to define insteadOf URLs in ~/.gitconfig both locally and on server:
locally:
[url "ssh://git.gnome.org/git/"]
insteadof = gnome:
[url "git+ssh://git.collabora.co.uk/git/user/xclaesse/"]
insteadof = collabora:
on server:
[url "git://git.gnome.org/"]
insteadof = gnome:
Now the steps are:
- locally: git clone gnome:empathy
- locally: ssh git.collabora.co.uk
- collabora: cd public_html/git && git init --bare gnome:empathy
- locally: git remote add xclaesse collabora:empathy
Still I’m lazy so I don’t like sshing the server manually, so the final step is to add this git alias in your local ~/.gitconfig:
[alias]
fork = !git config --get remote.origin.url | xargs -n 1 ssh git.collabora.co.uk \"cd ~/public_html/git && git init --bare\"
That will create a public repository for the project you’re currently in, just by typing “git fork”! Steps are now:
- locally: git clone gnome:empathy
- locally: git fork
- locally: git remote add xclaesse collabora:empathy
Update: It’s more flexible with a python script, save it as “git-fork”, put it somewhere in your PATH and chmod +x
#!/usr/bin/python
import subprocess
remote_host = "git.collabora.co.uk"
git_remote_prefix = "collabora:"
git_remote_name = "zdra"
# Get current git repository's name
remote = subprocess.check_output(["git", "config", "--get", "remote.origin.url"]).strip()
name = remote[max (remote.rfind("/"), remote.rfind(":")) + 1:]
if not name.endswith(".git"):
name = name + ".git"
# Create a remote repository
remote_cmd = "cd ~/public_html/git && git init --bare " + name
subprocess.call (["ssh", remote_host, remote_cmd])
# Add the remote repository to git remotes and push master
subprocess.call (["git", "remote", "add", git_remote_name, git_remote_prefix + name])
subprocess.call (["git", "push", git_remote_name, "master"])