GitHub: add remote for pulls and merges
After looking at @filosottile's totally awesome protip demonstrating how to checkout a pull request as a branch I got to thinking that there has to be a better way to do this than having to hammer out that whole refspec every time.
Initially I looked for ways to specify multiple refspec
s for the fetch
attribute for the GitHub remote
...
[remote "origin"]
url = git@github.com:user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
... but, AFAICT, the fetch
attribute takes just the single refspec
. Then it struck me, if we can't add more refspec
s to a remote, maybe we could just add more remote
s! So I fired up git config -e
and did this...
[remote "origin"]
url = git@github.com:user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[remote "origin-pull"]
url = git@github.com:user/repo.git
fetch = +refs/pull/*/head:refs/remotes/origin-pull/*
[remote "origin-merge"]
url = git@github.com:user/repo.git
fetch = +refs/pull/*/merge:refs/remotes/origin-merge/*
... et viola! A git remote update
gave me this...
$ git remote update
Fetching origin
Fetching origin-pull
From github.com:user/repo
* [new ref] refs/pull/1/head -> origin-pull/1
Fetching origin-merge
From github.com:user/repo
* [new ref] refs/pull/1/merge -> origin-merge/1
Now I can merge
/rebase
commits from GitHub pull requests without having to add a remote
for the author's fork (and without having to remember that refspec
. Given that GitHub closes issues once you merge and push to the branch, this makes for some cool pull request handling using just git
tools!
PS- I'm pretty sure we can also extend this to cover git-notes
.
Written by Saager Mhatre
Related protips
5 Responses

hmmm pretty savvy buddy. I like this idea. nice tip :)

@jwebcat Thanks. Anything to keep from leaving the shell! ;)

How about a single pr remote with fetch attribute below:
fetch = +refs/pull/*:refs/remotes/pr/*

I don't believe that would work as refs/pull/*
would not refer to a specific ref
.

You can just add lines like these instead:
[remote "origin"]
url = git@github.com:user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pull-requests/*
fetch = +refs/pull/*/merge:refs/remotes/origin/pull-merges/*
This can be a problem if people actually commit changes into pull-requests/new-feature
or something..