How to use git effectively

  |   Source

To take the full power of git, you need forget GUI and use CLI only. A little knowledge of script language like Bash/Perl/Python may be helpful.

Here is an example how I use git.

Problem

I'm working for a big enterprise project which uses git as version control software. My daily routine is find what files I changed. So I often use git commands with "–stat" paramters.


git show --stat

git diff --cached --stat

git log --stat

git diff --stat

Since I use CLI git in bash shell only. I set alias for these commands in bash. For example, I need only type gds in bash instead of "git diff –stat".

Git commands with "–stat" option usually only display relative paths, so I write some bash function which enable me select that relative path interactively (without using mouse, of course), convert that path to absolute path, and copy that absolute path into clipboard.

Getting full path into clipboard is useful because in big projects I need do lots of communication with managers and colleagues. For example, I need list files I changed in our bug tracking system (JIRA) and also email them by using Outlook. If you still don't understand why it's hard in big project, let me give you some hint. Big project is usually a big shit. Say you will edit file A, you will find another 10 files distributed in different location with same file name and similar code. Those another 10 files are not your business and if you dare touch them, you need deal with another 10 managers from ten teams.

Set up

Now you understand the problme. Here comes the solution.

Step 1, You need install percol by sudo pip install percol. Percol will provide some interactive UI to help you select the line in shell.

Step 2, install xsel or xclip under Linux to support paste text into X clipboard. BTW, you did install some clipboard manager under Linux, didn't you?

Step 3, insert below code into your ~/.bash:


# search the file and pop up dialog, then put the full path in clipboard



function pclip() {
    if [ $OS_NAME == CYGWIN ]; then
        putclip $@;
    elif [ $OS_NAME == Darwin ]; then
        pbcopy $@;
    else
        if [ -x /usr/bin/xsel ]; then
            xsel -ib $@;
        else
            if [ -x /usr/bin/xclip ]; then
                xclip -selection c $@;
            else
                echo "Neither xsel or xclip is installed!"
            fi
        fi
    fi
}



function glsf () {
    local str=`git --no-pager log --oneline --decorate --stat $* |percol`
    if [[ $str =~ ^[[:space:]]*([a-z0-9A-Z_.\/-]*).*$ ]]; then
        echo -n ${BASH_REMATCH[1]} |pclip;
        echo ${BASH_REMATCH[1]}
    fi
}



function ff()

{
    # @see http://stackoverflow.com/questions/13373249/extract-substring-using-regexp-in-plain-bash
    local fullpath=$*
    local filename=${fullpath##*/}
    local filter=${fullpath##*./}
    #  only the filename without path is needed
    # filename should be reasonable
    local cli=`find $PWD -type f -iname '*'${filename}'*'|grep ${filter}|percol`
    echo ${cli}
    echo -n ${cli} |pclip;
}

Usage


glsf

ff line-from-clipboard

# now I can paste the full path into firefox, outlook ...

Here is the screen cast: https://dl.dropboxusercontent.com/u/858862/screencast/git-find-full-path.gif

Comments powered by Disqus