| 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 |
| } |
| |