Class | Git::Base |
In: |
lib/git/base.rb
|
Parent: | Object |
opens a bare Git Repository - no working directory options
# File lib/git/base.rb, line 10 def self.bare(git_dir) self.new :repository => git_dir end
clones a git repository locally
repository - http://repo.or.cz/w/sinatra.git name - sinatra
options:
:repository :bare or :working_directory :index_file
# File lib/git/base.rb, line 58 def self.clone(repository, name, opts = {}) # run git-clone self.new(Git::Lib.new.clone(repository, name, opts)) end
initializes a git repository
options:
:repository :index_file
# File lib/git/base.rb, line 29 def self.init(working_dir, opts = {}) default = {:working_directory => working_dir, :repository => File.join(working_dir, '.git')} git_options = default.merge(opts) if git_options[:working_directory] # if !working_dir, make it FileUtils.mkdir_p(git_options[:working_directory]) if !File.directory?(git_options[:working_directory]) end # run git_init there Git::Lib.new(git_options).init self.new(git_options) end
# File lib/git/base.rb, line 63 def initialize(options = {}) if working_dir = options[:working_directory] options[:repository] = File.join(working_dir, '.git') if !options[:repository] options[:index] = File.join(working_dir, '.git', 'index') if !options[:index] end @working_directory = Git::WorkingDirectory.new(options[:working_directory]) if options[:working_directory] @repository = Git::Repository.new(options[:repository]) if options[:repository] @index = Git::Index.new(options[:index], false) if options[:index] end
adds files from the working directory to the git repository
# File lib/git/base.rb, line 212 def add(path = '.') self.lib.add(path) end
adds a new remote to this repository url can be a git url or a Git::Base object if it’s a local reference
@git.add_remote('scotts_git', 'git://repo.or.cz/rubygit.git') @git.fetch('scotts_git') @git.merge('scotts_git/master')
# File lib/git/base.rb, line 290 def add_remote(name, url, opts = {}) if url.is_a?(Git::Base) url = url.repo.path end self.lib.remote_add(name, url, opts) Git::Remote.new(self, name) end
creates a new git tag (Git::Tag)
# File lib/git/base.rb, line 309 def add_tag(tag_name) self.lib.tag(tag_name) tag(tag_name) end
returns a Git::Branch object for branch_name
# File lib/git/base.rb, line 167 def branch(branch_name = 'master') Git::Branch.new(self, branch_name) end
returns a Git::Branches object of all the Git::Branch objects for this repo
# File lib/git/base.rb, line 162 def branches Git::Branches.new(self) end
changes current working directory for a block to the git working directory
example
@git.chdir do # write files @git.add @git.commit('message') end
# File lib/git/base.rb, line 102 def chdir Dir.chdir(dir.path) do yield dir.path end end
checks out a branch as the new git working directory
# File lib/git/base.rb, line 246 def checkout(branch = 'master', opts = {}) self.lib.checkout(branch, opts) end
commits all pending changes in the index file to the git repository
# File lib/git/base.rb, line 233 def commit(message, opts = {}) self.lib.commit(message, opts) end
commits all pending changes in the index file to the git repository, but automatically adds all modified files without having to explicitly calling @git.add() on them.
# File lib/git/base.rb, line 240 def commit_all(message, opts = {}) opts = {:add_all => true}.merge(opts) self.lib.commit(message, opts) end
g.config(‘user.name’, ‘Scott Chacon’) # sets value g.config(‘user.email’, ‘email@email.com’) # sets value g.config(‘user.name’) # returns ‘Scott Chacon’ g.config # returns whole config hash
# File lib/git/base.rb, line 121 def config(name = nil, value = nil) if(name && value) # set value lib.config_set(name, value) elsif (name) # return value lib.config_get(name) else # return hash lib.config_list end end
returns the name of the branch the working directory is currently on
# File lib/git/base.rb, line 330 def current_branch self.lib.branch_current end
returns a reference to the working directory
@git.dir.path @git.dir.writeable?
# File lib/git/base.rb, line 78 def dir @working_directory end
fetches changes from a remote branch - this does not modify the working directory, it just gets the changes from the remote if there are any
# File lib/git/base.rb, line 252 def fetch(remote = 'origin') self.lib.fetch(remote) end
will run a grep for ‘string’ on the HEAD of the git repository
to be more surgical in your grep, you can call grep() off a specific git object. for example:
@git.object("v2.3").grep('TODO')
in any case, it returns a hash of arrays of the type:
hsh[tree-ish] = [[line_no, match], [line_no, match2]] hsh[tree-ish] = [[line_no, match], [line_no, match2]]
so you might use it like this:
@git.grep("TODO").each do |sha, arr| puts "in blob #{sha}:" arr.each do |match| puts "\t line #{match[0]}: '#{match[1]}'" end end
# File lib/git/base.rb, line 202 def grep(string) self.object('HEAD').grep(string) end
merges one or more branches into the current working branch
you can specify more than one branch to merge by passing an array of branches
# File lib/git/base.rb, line 268 def merge(branch, message = 'merge') self.lib.merge(branch, message) end
returns a Git::Object of the appropriate type you can also call @git.gtree(‘tree’), but that’s just for readability. If you call @git.gtree(‘HEAD’) it will still return a Git::Object::Commit object.
@git.object calls a factory method that will run a rev-parse on the objectish and determine the type of the object and return an appropriate object for that type
# File lib/git/base.rb, line 144 def object(objectish) Git::Object.new(self, objectish) end
fetches a branch from a remote and merges it into the current working branch
# File lib/git/base.rb, line 273 def pull(remote = 'origin', branch = 'master', message = 'origin pull') fetch(remote) merge(branch, message) end
pushes changes to a remote repository - easiest if this is a cloned repository, otherwise you may have to run something like this first to setup the push parameters:
@git.config('remote.remote-name.push', 'refs/heads/master:refs/heads/master')
# File lib/git/base.rb, line 261 def push(remote = 'origin', branch = 'master') self.lib.push(remote, branch) end
returns a Git::Remote object
# File lib/git/base.rb, line 172 def remote(remote_name = 'origin') Git::Remote.new(self, remote_name) end
removes file(s) from the git repository
# File lib/git/base.rb, line 217 def remove(path = '.', opts = {}) self.lib.remove(path, opts) end
returns reference to the git repository directory
@git.dir.path
# File lib/git/base.rb, line 84 def repo @repository end
returns the repository size in bytes
# File lib/git/base.rb, line 109 def repo_size size = 0 Dir.chdir(repo.path) do (size, dot) = `du -d0`.chomp.split end size.to_i end
resets the working directory to the provided commitish
# File lib/git/base.rb, line 222 def reset(commitish = nil, opts = {}) self.lib.reset(commitish, opts) end
resets the working directory to the commitish with ’—hard’
# File lib/git/base.rb, line 227 def reset_hard(commitish = nil, opts = {}) opts = {:hard => true}.merge(opts) self.lib.reset(commitish, opts) end
runs git rev-parse to convert the objectish to a full sha
@git.revparse("HEAD^^") @git.revparse('v2.4^{tree}') @git.revparse('v2.4:/doc/index.html')
# File lib/git/base.rb, line 325 def revparse(objectish) self.lib.revparse(objectish) end
returns a Git::Status object
# File lib/git/base.rb, line 157 def status Git::Status.new(self) end