blob: 6506ca459c91b70ac871390f962c73384880f617 [file] [log] [blame]
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
}