Skip to content

Instantly share code, notes, and snippets.

@carmat
Last active July 14, 2018 00:14
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save carmat/8728901 to your computer and use it in GitHub Desktop.
Save carmat/8728901 to your computer and use it in GitHub Desktop.
## Open the current branch in browser
## ====================================
## Open the current repo & branch from the command line
## Use flags to navigate to other areas of the repo such as
## commits, branches, pull requests or issues.
## ====================================
## This is an adaptation of @jasonneylon's script.
## Source: http://jasonneylon.wordpress.com/2011/04/22/opening-github-in-your-browser-from-the-terminal/
## ====================================
## @usage: gh
## @usage: gh c
## @usage: gh pr branch-name
function gh() {
giturl=$(git config --get remote.origin.url)
if [ "$giturl" == "" ]
then
echo "Not a git repository or no remote.origin.url set"
exit 1;
fi
giturl=${giturl/git\@github\.com\:/https://github.com/}
branch="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch="(unnamed branch)" # detached HEAD
branch=${branch##refs/heads/}
if [ "$1" = "" ]; then ## default => code
giturl=${giturl/\.git/\/tree/}
giturl=$giturl$branch
open $giturl
elif [ "$1" = "h" ]; then ## h => help
echo ""
echo "========================================"
echo "Did you know that 'gh' can be used as is?"
echo "There are also some other options, listed below:"
echo " [h] => View help"
echo " [c] => View commits"
echo " [c {SHA}] => View specific commit from commit SHA"
echo " [b] => View branches"
echo " [pr] => View current branch compared to master"
echo " [pr branch] => View current branch compared to specified branch"
echo " [i] => View issues"
echo " [a] => View assigned issues (in dev)"
echo " [w] => View wiki"
echo " [s] => View settings"
echo " [p] => View pulse"
echo " [g] => View graphs"
echo " [n] => View network"
echo " [<filename.ext>] => Open a file in it's current state in the current branch"
echo "========================================"
echo ""
elif [ "$1" = "c" ]; then ## c => commits
if [ "$2" ]; then
giturl=${giturl/\.git/\/commit/$2}
else
giturl=${giturl/\.git/\/commits/}
giturl=$giturl$branch
fi
open $giturl
elif [ "$1" = "b" ]; then ## b => branches
giturl=${giturl/\.git/\/branches}
open $giturl
elif [ "$1" = "pr" ]; then ## pr => pull requests
if [[ -z "$2" ]]; then
# if a branch has not been specified, compare with master
giturl=${giturl/\.git/\/compare/$branch?expand=1}
else
# if a branch has been specified, compare with current branch
giturl=${giturl/\.git/\/compare/$2...$branch?expand=1}
fi
open $giturl
elif [ "$1" = "i" ]; then ## i => issues
giturl=${giturl/\.git/\/issues}
open $giturl
# This would be incredibly useful when I have the time
# elif [ "$1" = "a" ]; then ## a => assigned issues
# giturl=${giturl/\.git/\/issues/assigned/$github_user}
# open $giturl
elif [ "$1" = "w" ]; then ## w => wiki
giturl=${giturl/\.git/\/wiki}
open $giturl
elif [ "$1" = "s" ]; then ## w => settings
giturl=${giturl/\.git/\/settings}
open $giturl
elif [ "$1" = "p" ]; then ## w => pulse
giturl=${giturl/\.git/\/pulse}
open $giturl
elif [ "$1" = "g" ]; then ## w => graphs
giturl=${giturl/\.git/\/graphs}
open $giturl
elif [ "$1" = "n" ]; then ## w => network
giturl=${giturl/\.git/\/network}
open $giturl
elif [ -f "$1" ]; then ## w => <filename.ext>
giturl=${giturl/\.git/\/blob/$branch/$1}
open $giturl
# elif [ "$1" = "files" ]; then ## w => files
# giturl=${giturl/\.git/\/network}
# open $giturl
else
echo ""
echo "========================================"
echo "That option is invalid."
echo "Did you mean:"
echo " [h] => View help"
echo " [c] => View commits"
echo " [c {SHA}] => View specific commit from commit SHA"
echo " [b] => View branches"
echo " [pr] => View current branch compared to master"
echo " [pr branch] => View current branch compared to specified branch"
echo " [i] => View issues"
echo " [a] => View assigned issues (in dev)"
echo " [w] => View wiki"
echo " [s] => View settings"
echo " [p] => View pulse"
echo " [g] => View graphs"
echo " [n] => View network"
echo " [<filename.ext>] => Open a file in it's current state in the current branch"
echo "========================================"
echo ""
fi
}

This is an adaptation of https://twitter.com/jasonneylon script.

In the terminal window, you can open your current repo (at the current branch) in your default browser.

My adaptation was adding options to view the commits, branches, pull requests or issues for the repo using one of the additional options (added support for wiki, settings, pulse, graphs, network):

[h]               => View help
[c]               => View commits
[c {SHA}]         => View specific commit from commit SHA
[b]               => View branches
[pr]              => View current branch compared to master
[pr branch]       => View current branch compared to specified branch
[i]               => View issues
[a]               => View assigned issues (in dev)
[w]               => View wiki
[s]               => View settings
[p]               => View pulse
[g]               => View graphs
[n]               => View network
[<filename.ext>]  => Open a file in it's current state in the current branch

Installation

This is a bash script, so it would be recommended that you include it in your ~/.bashrc (or ~/.bash_profile) file.

Using the command line (as it's generally easier than searching for potentially hidden files):

  • $ vi ~/.bash_rc - or use your preferred text editor e.g. mate, subl etc.
  • Paste function gh() { ... } into ~/.bashrc file
    • If you opted to use $ vi, you may need to press a to allow you to edit the file
  • Save .bashrc (you may also close the file)
    • If you opted to use $ vi, save and close the file: ESC and :wq
  • $ source ~/.bashrc - updates the Terminal/Shell with your changes, activating them ready for use

Usage

  • $ gh Open your repo from the command line
  • $ gh i View/list helper options
  • $ gh c Open your branches Commits from the command line
  • [c {SHA}] View specific commit from commit SHA
  • $ gh b Open your repo's Branches from the command line
  • $ gh pr Compare the current branch to master from the command line, ready for a pull request
  • $ gh pr branch Compare the current branch to the branch specified from the command line, ready for a pull request
  • $ gh i Open your repo's Issues from the command line
  • $ gh w Open your repo's Wiki from the command line
  • $ gh s Open your repo's Settings from the command line
  • $ gh p Open your repo's Pulse Activity from the command line
  • $ gh g Open your repo's Graphs/Analytics from the command line
  • $ gh n Open your repo's Network Graph from the command line
  • $ gh <filename.ext> Open a file in it's current state in the current branch

Improvements

I plan on making some improvements to this script (when I get the time to study bash/github a little more):

  • Add elif [ "$1" = "a" ]; to only show Issues assigned to a particular user, either the current user, or a specified user

Thanks for using

Any thoughts, suggestions or improvements? Let me know https://twitter.com/carmat71

Source: http://jasonneylon.wordpress.com/2011/04/22/opening-github-in-your-browser-from-the-terminal/

N.B. This script works for most* operating systems, although it does involve editing slightly. The only parts that should need editing are wher you see the command open. This is specific to Mac OS. Other OS's will need to be customised like so:

  • Mac open
  • Windows start or cmd /c start
  • Linux/Unix xdg-open
  • Cygwin cygstart

*Mac OS and MS Windows are the only operating sytems I have been able to test.

@kurkale6ka
Copy link

Thanks for sharing.
Here is my version:

gh() {
   if [[ $1 == -@(h|-h)* ]]
   then
      echo 'Usage: gh [origin|-b|-i|-p|-c]'; return 0
   fi

   local origin
   [[ $1 != -* ]] && origin="${1}"
   local remote=remote."${origin:-origin}".url

   local giturl="$(git config --get "$remote")"
   [[ $giturl ]] || {
      echo "Not a git repository or no $remote set"
      return 1
   }

   local branch
   branch="$(git symbolic-ref HEAD 2>/dev/null)" || branch='(unnamed branch)'
   branch="${branch#refs/heads/}"

   giturl=https://github.com/"${giturl#*:}"

   local path
   case "$1" in
      -b) path=branches;;
      -i) path=issues;;
      -p) path=pulls;;
      -c) path=commits/"$branch";;
       *) path=tree/"$branch";;
   esac
   giturl="${giturl%.git}"/"$path"

   xdg-open "$giturl" 2>/dev/null
}

@carmat
Copy link
Author

carmat commented Jan 31, 2014

👍

@rodericj
Copy link

Good stuff

@carmat
Copy link
Author

carmat commented Apr 2, 2014

Update

I've removed the - from each option as they more annoying to use

@carmat
Copy link
Author

carmat commented May 5, 2014

Update

I've made an improvement to the 'gh c' command, whereby you can enter a commit SHA and have the browser open up at the commit. Useful for viewing changes in a particular.

How to...

  • gh c 8c72f05
  • gh c 8c72f05fc9074d6db70dfd1e6806dcd8a1f01c4f

@carmat
Copy link
Author

carmat commented May 6, 2014

Useful

Related to the recent update, this git command/alias can be very useful in grabbing the latest commit from your local repo version:

  • Mac - alias ghash='git rev-parse HEAD && git rev-parse HEAD | pbcopy'
  • Win - alias ghash='git rev-parse HEAD && git rev-parse HEAD | clip'

Outputs the last commit SHA on the current branch, and copies it to your clipboard.

@carmat
Copy link
Author

carmat commented Jul 18, 2014

Update

I've managed to configure the gh() script to at least ready your current branch for a Pull Request.

  • If a branch has been specified, your current brach will be compared to that one.
  • If no branch has been specified, your current branch will be compared to master.

@carmat
Copy link
Author

carmat commented Sep 11, 2014

Update

You can now open a file in your current branch with the command gh <filename.ext> (substituting filename.ext with the actual filename). Note that the file must be pushed to the remote repo or you'll likely get a 404 error.

Also note that the full file path relative to the root of the document must be defined (I'll try and fix this)

I plan to improve this to select any lines specified and highlight them.

@goldcaddy77
Copy link

Note the typo in if [ "$giturl" == "" ]... should be a single =

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment