cite about-plugin about-plugin 'git helper functions' function git_remote { about 'adds remote $GIT_HOSTING:$1 to current repo' group 'git' echo "Running: git remote add origin ${GIT_HOSTING}:$1.git" git remote add origin $GIT_HOSTING:$1.git } function git_first_push { about 'push into origin refs/heads/master' group 'git' echo "Running: git push origin master:refs/heads/master" git push origin master:refs/heads/master } function git_pub() { about 'publishes current branch to remote origin' group 'git' BRANCH=$(git rev-parse --abbrev-ref HEAD) echo "Publishing ${BRANCH} to remote origin" git push -u origin $BRANCH } function git_revert() { about 'applies changes to HEAD that revert all changes after this commit' group 'git' git reset $1 git reset --soft HEAD@{1} git commit -m "Revert to ${1}" git reset --hard } function git_rollback() { about 'resets the current HEAD to this commit' group 'git' function is_clean() { if [[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]]; then echo "Your branch is dirty, please commit your changes" kill -INT $$ fi } function commit_exists() { git rev-list --quiet $1 status=$? if [ $status -ne 0 ]; then echo "Commit ${1} does not exist" kill -INT $$ fi } function keep_changes() { while true do read -p "Do you want to keep all changes from rolled back revisions in your working tree? [Y/N]" RESP case $RESP in [yY]) echo "Rolling back to commit ${1} with unstaged changes" git reset $1 break ;; [nN]) echo "Rolling back to commit ${1} with a clean working tree" git reset --hard $1 break ;; *) echo "Please enter Y or N" esac done } if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then is_clean commit_exists $1 while true do read -p "WARNING: This will change your history and move the current HEAD back to commit ${1}, continue? [Y/N]" RESP case $RESP in [yY]) keep_changes $1 break ;; [nN]) break ;; *) echo "Please enter Y or N" esac done else echo "you're currently not in a git repository" fi } function git_remove_missing_files() { about "git rm's missing files" group 'git' git ls-files -d -z | xargs -0 git update-index --remove } # Adds files to git's exclude file (same as .gitignore) function local-ignore() { about 'adds file or path to git exclude file' param '1: file or path fragment to ignore' group 'git' echo "$1" >> .git/info/exclude } # get a quick overview for your git repo function git_info() { about 'overview for your git repo' group 'git' if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then # print informations echo "git repo overview" echo "-----------------" echo # print all remotes and thier details for remote in $(git remote show); do echo $remote: git remote show $remote echo done # print status of working repo echo "status:" if [ -n "$(git status -s 2> /dev/null)" ]; then git status -s else echo "working directory is clean" fi # print at least 5 last log entries echo echo "log:" git log -5 --oneline echo else echo "you're currently not in a git repository" fi } function git_stats { about 'display stats per author' group 'git' # awesome work from https://github.com/esc/git-stats # including some modifications if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then echo "Number of commits per author:" git --no-pager shortlog -sn --all AUTHORS=$( git shortlog -sn --all | cut -f2 | cut -f1 -d' ') LOGOPTS="" if [ "$1" == '-w' ]; then LOGOPTS="$LOGOPTS -w" shift fi if [ "$1" == '-M' ]; then LOGOPTS="$LOGOPTS -M" shift fi if [ "$1" == '-C' ]; then LOGOPTS="$LOGOPTS -C --find-copies-harder" shift fi for a in $AUTHORS do echo '-------------------' echo "Statistics for: $a" echo -n "Number of files changed: " git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f3 | sort -iu | wc -l echo -n "Number of lines added: " git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f1 | awk '{s+=$1} END {print s}' echo -n "Number of lines deleted: " git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f2 | awk '{s+=$1} END {print s}' echo -n "Number of merges: " git log $LOGOPTS --all --merges --author=$a | grep -c '^commit' done else echo "you're currently not in a git repository" fi } function gittowork() { about 'Places the latest .gitignore file for a given project type in the current directory, or concatenates onto an existing .gitignore' group 'git' result=$(curl -L "Https://www.gitignore.io/api/$1" 2>/dev/null) if [[ $result =~ ERROR ]]; then echo "Query '$1' has no match. See a list of possible queries with 'gittowork List'" elif [[ $1 = list ]]; then echo "$result" else if [[ -f .gitignore ]]; then result=`echo "$result" | grep -v "# Created by http://www.gitignore.io"` echo ".gitignore already exists, appending..." echo "$result" >> .gitignore else echo "$result" > .gitignore fi fi }