├── git-delete-branch ├── git-delete-merged-branches ├── git-delete-merged-branches-with-remote ├── git-log-gh-emoji ├── git-own ├── git-pushself ├── git-reviewer └── git-sel /git-delete-branch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git branch | grep $1 | xargs git br -d 4 | 5 | -------------------------------------------------------------------------------- /git-delete-merged-branches: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | base_branch=$1 4 | if [ -z $base_branch ] ; then 5 | echo 'usage: git-delete-merged-branches [base_branch]' >&2 6 | exit 1 7 | fi 8 | 9 | git show-ref --verify --quiet refs/heads/$base_branch 10 | if [ $? -ne 0 ] ; then 11 | echo "error: base branch '$base_branch' not found" >&2 12 | exit 1 13 | fi 14 | 15 | git branch --merged $base_branch | 16 | xargs -n 1 | grep -Ev "^(\*|$base_branch)$" | 17 | xargs -n 1 git branch -d 18 | 19 | -------------------------------------------------------------------------------- /git-delete-merged-branches-with-remote: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | base_branch=$1 4 | if [ -z $base_branch ] ; then 5 | echo 'usage: git-delete-merged-branches-with-remote [base_branch]' >&2 6 | exit 1 7 | fi 8 | 9 | git show-ref --verify --quiet refs/heads/$base_branch 10 | if [ $? -ne 0 ] ; then 11 | echo "error: base branch '$base_branch' not found" >&2 12 | exit 1 13 | fi 14 | 15 | git branch --merged $base_branch | 16 | xargs -n 1 | grep -Ev "^(\*|$base_branch)$" | 17 | xargs -n 1 git branch -d 18 | 19 | git fetch --prune 2>&1 >/dev/null 20 | 21 | git branch -r --merged $base_branch | 22 | grep -v ' -> ' | 23 | sed 's/\([^\/]*\)\/\(.*\)/\1 :\2/' | 24 | grep -v ":$base_branch$" | 25 | xargs -n 2 git push 2>&1 | # All of outputs go to stderr 26 | { 27 | while read result; do 28 | echo $result | grep -v '^error:' 2>&1 >/dev/null && echo $result 29 | done 30 | } 31 | 32 | -------------------------------------------------------------------------------- /git-log-gh-emoji: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # coding: utf-8 3 | 4 | require "tempfile" 5 | require "gemoji" 6 | 7 | def get_git_log 8 | log = `git --no-pager log --color` 9 | if $?.exitstatus > 0 10 | exit $?.exitstatus 11 | end 12 | 13 | log 14 | end 15 | 16 | def get_pager_env 17 | pager = `git config core.pager` 18 | if pager.empty? 19 | pager = 'less -r' 20 | end 21 | return pager 22 | end 23 | 24 | def replace_to_emoji (git_log) 25 | log = '' 26 | git_log.each_line do |line| 27 | if not line.match(/^(?:Author:|Date:|Merge:)/) 28 | line.gsub! (/:([^\s]+?):/) { 29 | replaced ='' 30 | target_str = "#{$1}" 31 | begin 32 | replaced = Emoji.find_by_alias(target_str).raw 33 | rescue 34 | replaced = ":#{target_str}:" 35 | end 36 | 37 | replaced 38 | } 39 | end 40 | 41 | log << line 42 | end 43 | log 44 | end 45 | 46 | def main 47 | log = replace_to_emoji(get_git_log) 48 | pager = get_pager_env 49 | 50 | tmpfile = Tempfile.open('') 51 | begin 52 | tmpfile.write(log) 53 | system("cat #{tmpfile.path} | #{pager}") 54 | ensure 55 | tmpfile.close 56 | end 57 | end 58 | 59 | main 60 | 61 | -------------------------------------------------------------------------------- /git-own: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | verbose=false 4 | while getopts v OPT 5 | do 6 | case $OPT in 7 | v) verbose=true 8 | break 9 | ;; 10 | *) break 11 | ;; 12 | esac 13 | done 14 | 15 | upstream_url=$(git config --get remote.origin.url) 16 | user_name=$(git config user.name) 17 | origin_url=$(echo $upstream_url | sed -e "s/\(github.com[:/]\).*\//\1$user_name\//") 18 | 19 | if [ $upstream_url == $origin_url ] ; then 20 | if [ $verbose == true ] ; then 21 | echo -e "\033[0;33m[INFO] Not changed (still own as \"origin\", or not GitHub repos) \033[m" 22 | fi 23 | exit 0 24 | fi 25 | 26 | git remote add upstream $upstream_url 27 | git remote set-url origin $origin_url 28 | 29 | exit 0 30 | 31 | -------------------------------------------------------------------------------- /git-pushself: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $# -eq 0 ]; then 4 | echo 'Error: specify upstream' 5 | exit 1 6 | fi 7 | 8 | git push $1 $(git rev-parse --abbrev-ref HEAD) 9 | 10 | -------------------------------------------------------------------------------- /git-reviewer: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # Usage 4 | # 5 | # git reviewer 6 | # git reviewer 7 | # 8 | 9 | if ARGV.length < 1 then 10 | $stderr.puts 'Missing mandatory parameter(s)' 11 | exit(1) 12 | end 13 | 14 | into = "" 15 | from = ARGV[1] 16 | if ARGV.length == 1 then 17 | into = `git --no-pager log --pretty=oneline`.split(/\r?\n/)[0].split(/ /)[0] # current revision 18 | from = ARGV[0] 19 | end 20 | 21 | diff = `git --no-pager diff #{into} #{ARGV.join(' ')}` 22 | 23 | row_number = 0 24 | file_diff_map = {} 25 | current_file = '' 26 | 27 | diff.each_line do |line| 28 | if (line.match(%r!\A--- a?/(.+)\Z!)) then 29 | current_file = $1 30 | file_diff_map[current_file] = [] 31 | next 32 | end 33 | 34 | if (line.match(/\A@@ -([0-9]+),/)) then 35 | row_number = $1.to_i 36 | next 37 | end 38 | 39 | if (line.match(/\A\+/)) then 40 | # ignore 41 | next 42 | end 43 | 44 | if (line.match(/\A-/)) then 45 | file_diff_map[current_file].push(row_number) 46 | row_number = row_number + 1 47 | next 48 | end 49 | 50 | row_number = row_number + 1 51 | end 52 | 53 | oldest_commit = `git --no-pager log --pretty=oneline ..#{from}`.split(/\r?\n/)[-1].split(/ /)[0] 54 | 55 | reviewer_candidates = {} 56 | authors = {} 57 | 58 | file_diff_map.each do |file, row_numbers| 59 | if row_numbers.empty? then 60 | # when no any deleted line 61 | if file == 'dev/null' then 62 | next 63 | end 64 | 65 | `git blame #{oldest_commit}^ -- #{file}`.each_line do |line| 66 | if line =~/\((.+) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [+\-][0-9]{4} [0-9]+\)/ then 67 | if authors.key?($1) then 68 | authors[$1] = authors[$1] + 1 69 | else 70 | authors[$1] = 1 71 | end 72 | end 73 | end 74 | 75 | next 76 | end 77 | 78 | row_numbers.each do |num| 79 | blame = `git blame -L#{num},#{num} #{oldest_commit}^ -- #{file}` 80 | if blame =~ /\((.+) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [+\-][0-9]{4} [0-9]+\)/ then 81 | if reviewer_candidates.key?($1) then 82 | reviewer_candidates[$1] = reviewer_candidates[$1] + 1 83 | else 84 | reviewer_candidates[$1] = 1 85 | end 86 | end 87 | end 88 | end 89 | 90 | (reviewer_candidates.empty? ? authors : reviewer_candidates).sort {|(_, occur1), (_, occur2)| occur2 <=> occur1}.each do |author, occur| 91 | puts "#{occur}: #{author}" 92 | end 93 | 94 | -------------------------------------------------------------------------------- /git-sel: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | FILE=$(git status --short | peco | awk '{print $2}') 4 | 5 | if [ $# -eq 0 ]; then 6 | echo $FILE 7 | exit 0 8 | fi 9 | 10 | git $@ $FILE 11 | 12 | --------------------------------------------------------------------------------