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"])
You could also use ~/.ssh/config to add some lines like
Host collabgit
User xclaesse
HostName git.collabora.co.uk
and you would then switch from
ssh git.collabora.co.uk
to
ssh collabgit
which even provides tab completion.
(Basically this is the same feature as the git insteadof but for ssh)