How to Upgrade and Deploy WordPress Install as a Git Submodule?

I am using a WordPress directory struture similar to Mark Jaquith’s WordPress Skeleton, which has WordPress in a separate directory from the content as a submodule:

/content
/wp
/local-config.php
/wp-config.php
/index.php

I also use git and post-receive hooks to push my code changes up to my live server. It all works great except for when I try to upgrade WordPress and push that up to the live server.

Read More

This is how I setup the repo on my local machine and the remote server:

Local Machine

cd /www
git init .
git submodule add git://github.com/WordPress/WordPress.git wp
git commit -m "Add WordPress submodule."
cd wp
git checkout 3.5

After checking out the tag, I get a warning from git about being in a ‘detached HEAD’ state. Since I don’t plan on making any commits to WordPress, I don’t think that should be an issue.

cd ..
git commit -am "Checkout WordPress 3.5"

Remote Server

git init --bare
cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/home/public git checkout -f

chmod +x hooks/post-receive

git remote add web ssh://user@server/home/private/code/wordpress.git

git push web +master:refs/heads/master

I get this error:

No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'ssh://userserver/home/private/code/wordpress.git'

After some googling, it looks like I can use this command to sync up the master branch up to the server (I have no idea how this works)

git push web +master:refs/heads/master

This doesn’t help me though because I don’t want to track master, I want to track a release tag, 3.5. Some more googling got me to this command:

git push web +3.5~0:refs/heads/master

To upgrade the submodule, I do this:

cd wp
git fetch && git fetch --tags
git checkout 3.5.1
git push web +3.5.1~0:refs/heads/master

Am I doing this correctly? All the tutorials I see for this just have git push web and they’re done. Most don’t even cover upgrading the submodule. This does work but I don’t feel comfortable using this weird push syntax if I don’t have to.

How do I push this detached HEAD state up to the server correctly?

I’ve also tried this using a branch with git checkout -b mywp 3.5 but when it comes time to upgrade, I don’t know how to bring in the new 3.5.1 tag into my mywp branch.

Asked this on WP Answers, but it might be more appropriate here.

Related posts

Leave a Reply

1 comment

  1. On the remote server try:

    git submodule update --init --recursive
    

    This will update all your submodules recursively

    You can also issue:

    git fetch --tags
    

    This will update your local tags fetching updated list from the central remote repo.