Try using bare repository (http://git-scm.com/book/ch4-2.html)
Basically, you intiate a new git bare repo like
git init --bare
Add this repository to the remote for each of your developer using
git add remote upstream_intermediate_bare path/to/bare/repo
And then push your commit to the upstream bare repository using
git push upstream_intermediate_bare branch_name
Next, in your official git repo, add another remote
git add remote downstream_intermediate_bare path/to/bare/repo
git pull downstream_intermediate_bare branch_name
Bare repositories are important for the common case of a remote repository used only as a push and pull source. Check this.
Edit: Sample example
cd ~/Desktop/test
mkdir dev1
mkdir official
cd dev1 && git init && touch file && git add . && git commit -m "msg" && cd ..
cd official && git init && cd ..
git init --bare interim
cd dev1 && git remote add upstream_intermediate_bare ../interim && cd ..
cd official && git remote add downstream_intermediate_bare ../interim && cd ..
cd dev1 && git push upstream_intermediate_bare master && cd ..
cd official && git pull downstream_intermediate_bare master && cd ..
So with the above example, the developer code is in directory dev1, he pushes to a bare repository inside within which you can't do a pull or a push, you have to add add it in your remotes and operate upon it, and the official repo just pulls from the bare repository.