def describe(committish=nil, opts={})
      arr_opts = []

      arr_opts << '--all' if opts[:all]
      arr_opts << '--tags' if opts[:tags]
      arr_opts << '--contains' if opts[:contains]
      arr_opts << '--debug' if opts[:debug]
      arr_opts << '--long' if opts[:long]
      arr_opts << '--always' if opts[:always]
      arr_opts << '--exact-match' if opts[:exact_match] || opts[:"exact-match"]

      arr_opts << '--dirty' if opts['dirty'] == true
      arr_opts << "--dirty=#{opts['dirty']}" if opts['dirty'].is_a?(String)

      arr_opts << "--abbrev=#{opts['abbrev']}" if opts[:abbrev]
      arr_opts << "--candidates=#{opts['candidates']}" if opts[:candidates]
      arr_opts << "--match=#{opts['match']}" if opts[:match]

      arr_opts << committish if committish

      return command('describe', arr_opts)
    end
def describe(committish=nil, opts={})
      arr_opts = []

      arr_opts << '--all' if opts[:all]
      arr_opts << '--tags' if opts[:tags]
      arr_opts << '--contains' if opts[:contains]
      arr_opts << '--debug' if opts[:debug]
      arr_opts << '--long' if opts[:long]
      arr_opts << '--always' if opts[:always]
      arr_opts << '--exact-match' if opts[:exact_match] || opts[:"exact-match"]

      arr_opts << '--dirty' if opts['dirty'] == true
      arr_opts << "--dirty=#{opts['dirty']}" if opts['dirty'].is_a?(String)

      arr_opts << "--abbrev=#{opts['abbrev']}" if opts[:abbrev]
      arr_opts << "--candidates=#{opts['candidates']}" if opts[:candidates]
      arr_opts << "--match=#{opts['match']}" if opts[:match]

      arr_opts << committish if committish

      return command('describe', arr_opts)
    end
tries to clone the given repo

 returns {:repository} (if bare)
         {:working_directory} otherwise

 accepts options:
  :bare::      no working directory
  :branch::    name of branch to track (rather than 'master')
  :depth::     the number of commits back to pull
  :origin::    name of remote (same as remote)
  :path::      directory where the repo will be cloned
  :remote::    name of remote (rather than 'origin')
  :recursive:: after the clone is created, initialize all submodules within, using their default settings.

 TODO - make this work with SSH password or auth_key

 READ COMMANDS 

 Returns most recent tag that is reachable from a commit

 accepts options:
  :all
  :tags
  :contains
  :debug
  :exact_match
  :dirty
  :abbrev
  :candidates
  :long
  :always
  :math

  @param [String|NilClass] committish target commit sha or object name
  @param [{Symbol=>Object}] opts the given options
  @return [String] the tag name