Insipration

Block Heap

Web Developer's Blog

Production Deployment Using Git on a “Bare” Repository

The aim is to push only specific files and directories to your production server.

Problem:
I had run into a number of articles demonstrating solutions with subtrees and branches, but most required a working tree on the production side. Maybe I just don’t understand how to properly use a subtree…

Solution:
Create a new branch and push that to my production server. The secret sauce turned out to be copying files with post-receive on the production side.

Explanation:
Assuming we already have a local project repo, we will create a new branch called ‘prod-dist’ based off of an existing master

$ git checkout master
$ git checkout -b prod-dist

A simple push of our development branch would expose far too much and still places our dist files in a subdirectory. Here’s a sample of contents from a Vue.js project:


$ pwd
    /Users/charlie/dev
$ ls
    /build
    /config
    /dist
    /src
    /static
    .babelrc
    .editorconfig
    .eslintignore
    .eslintrc.js
    .gitignore
    .htaccess
    .postcssrc.js
    README.md
    index.html
    package-lock.json
    package.json

Next, we SSH into your production server:

$ ssh -i /Users/charlie/.ssh/joe-key-pair-ncalifornia.pem [email protected]

Create a place for your repo and files. I chose /var/ because it seemed like a reasonable spot, but you may know of a better location.

$ cd /var/
$ mdkir repos
$ cd repos

Create a directory that will contain the files pushed from your local branch

$ mkdir source

Create new bare repository (You would create a bare repository to git push and git pull from, but never directly commit to it)

$ mkdir myproject.git
$ cd myproject.git
$ git init --bare

Create post-receive hook and make file executable

$ cd hooks
$ mkdir post-receive
$ chmod +x post-receive

Edit post-receive with vim (link to vim)

#!/bin/bash
GIT_WORK_TREE=/var/repos/source git checkout -f
cp -r /var/repos/source/dist/* /var/www/html/
cp /var/repos/source/.htaccess /var/www/html/.htaccess
echo "Production is a go"

Line 2 (above) informs GIT to place files in the /source/ directory we created earlier. After lines 1 & 2, you should copy or perform any other action that suits your needs, like copying third-party libraries.

As you can see, our resulting web root will contain only the files that we need from our branch.

$ cd /var/www/html
$ ls
    index.html static

That’s it!

Conclusion:
This may not be the most efficient or smart way of pushing to production, but it worked for me. Please write me with suggestions on what I could be doing better or if you have any questions on my setup.

2 responses to “Production Deployment Using Git on a “Bare” Repository

  1. Yes! It’ll work for any framework that uses a build process to output distribution files. Of course, you’ll have to make minor tweaks to match your configuration like renaming ‘dist’ with ‘whatever’, etc.

Leave a Reply

Your email address will not be published.

SIDEBAR HERE