I haven't found the perfect answer to my question but here's an OK workaround.
You can override the default Heroku boot script (and much more) by creating a file called Procfile at the root of your project.
Here's the Procfile :
# run custom boot scirpt
web: sh /app/config/web-boot.sh
It tells Heroku that this script boots Redmine.
I'm using Bitbucket with a private repository, so I created a SSH key pair and placed them in 'config/ssh/'. Then, I added the Public key to my Bitbucket account's deploy keys and added Bitbucket's public Key to my 'config/ssh/know_hosts' file
Here's the 'config/web-boot.sh' file :
# move ssh keys
mkdir /app/.ssh
cp /app/config/ssh/* /app/.ssh/
# git clone code repos
mkdir /tmp/repos
# Do this for every repo you want to clone
git clone --bare ssh://[email protected]/[YOUR_ACCOUNT]/[YOUR_REPO].git /tmp/repos/[YOUR_REPO]
git --git-dir=/tmp/repos/[YOUR_REPO] remote add origin ssh://[email protected]/[YOUR_ACCOUNT]/[YOUR_REPO].git
git --git-dir=/tmp/repos/[YOUR_REPO] fetch origin
# run Unicorn http server
cd /app
bundle exec unicorn -p $PORT -c ./config/unicorn.rb
Then you can just add the Git repository to your Redmine project by specifying '/tmp/repos/[YOUR_REPO]'
You can use Redmine Bitbucket Hook plugin to pull changes to your repository when you push changes to Bitbucket.
It's not ideal to have a private key hoping around like this, but in my specific case, this key is unique to this app and is only used to gain readonly access to my code repository.