Quick git add, commit, push, and deploy

Posted by matt
on Monday, August 11
Last week, I was preparing a presentation and found myself doing a lot of quick fixes and deployments to prepare a web application for a demonstration. I thought instead of running the following four commands each time:
git add .
git commit -a -m 'A description of the change'
git push
cap production deploy
It would be nice if I could do all of the above with just one command. So I created this shell script:
push() {
	
	# Defaults
	MINLEN=25
	DIRTY=false
	DEPLOY="production deploy"
	REMOTE_REPO = "origin master"
	
	# Check if we have any untracked files
	if git status | grep -q "modified:"	
	then
		DIRTY=true
	fi
	
	# Make sure there is a message with the commit 
	if [ -z "$1" ] && (test $DIRTY == true)
	then
	  echo "You must specify a message with your commit"
	  return
	elif [ ${#1} -lt $MINLEN ] && (test $DIRTY == true)
	then
	  echo "Your message must have at least $MINLEN letters."
	  return
	fi
	
	# Commit all the changes by default
	if (test $DIRTY == true)
	then
		echo "Adding new files to Git repository"
		git add .
	
		echo "Commiting to local Git repository"
		git commit -a -m "$1"
		
		# Push changes if a remote repository exists
		if git remote | grep -q "origin"	
		then
			echo "Pushing changes to remote repository"
			git push $REMOTE_REPO
		fi
	fi
	
	# Deploy changes via Capistrano
	if ls | grep -q Capfile	
	then
		cap $DEPLOY
	fi
}
The 'push' function will first check to make sure you supplied a description if any recent changes were made. Second, it will commit all the code and push it to the remote repository (if one exists).

If none of the code was modified or added, it will skip the Git commands and simply run the Capistrano deploy command and not require a description for the changes.

To use this script, copy and paste the above function to the end of your ~/.bash_profile file. To run it, simply run the 'push' command.
push "The description for the committed changes."
That's it! All the code is added, commited, pushed, and deployed.