Get out, git!
There are lots of good reasons to have your server's codebase be an actual git checkout. But there's one potential flaw: your entire repository's history ends up in your webroot inside a .git folder.
You can block access to it in your .htaccess, but that's hacking core (until this patch lands at least).
There is however an alternative method that lets you keep the entirety of git's working folder outside the webroot completely.
Here's how to convert an existing repository to this format:
- Move the .git folder to another location, renaming it in the process so it's no longer hidden. The convention is to leave it with a .git ending though, so for example, 'mysite.git'. I put these inside a folder called 'git' in the user's home folder, for instance.
$ mv .git ~/git/mysite.git
- In its original place in your webroot, create a new file called '.git'. Into this file place a single line thus:
This needs to be an absolute path; relative ones confuse git when you go into subfolders. Using '~' to start at the user's home folder doesn't seem to work either.
- Finally, we need to tell the config file where the work folder is. This step isn't completely necessary, but it allows you to invoke the git command while standing in subfolders of your webroot, which is too handy a thing to lose.
Standing either in the webroot or in the git folder, do:
$ git config core.worktree "/absolute/path/to/your/webroot"
You can also edit the git config file by hand to set this, which allows you to also add a comment explaining the manoeuvre for future reference.
That's all there is to it. You now have a working git repository whose working folder is completely inaccessible from the outside world.
For creating a new repo, you can use the following finger-twister:
$ git --git-dir=/path/to/repo.git --work-tree=. init && echo "gitdir: /path/to/repo.git" > .git