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 13 def self.bare(git_dir, opts = {}) default = {:repository => git_dir} git_options = default.merge(opts) self.new(git_options) 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 64 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 35 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 69 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 if options[:log] @logger = options[:log] @logger.info("Starting Git") 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 242 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 332 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
# File lib/git/base.rb, line 376 def apply_mail(file) if File.exists?(file) self.lib.apply_mail(file) end end
returns a Git::Branch object for branch_name
# File lib/git/base.rb, line 197 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 192 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 123 def chdir Dir.chdir(dir.path) do yield dir.path end end
checks out an old version of a file
# File lib/git/base.rb, line 281 def checkout_file(version, file) self.lib.checkout_file(version,file) 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 270 def commit_all(message, opts = {}) opts = {:add_all => true}.merge(opts) self.lib.commit(message, opts) end
# File lib/git/base.rb, line 411 def commit_tree(tree = nil, opts = {}) Git::Object::Commit.new(self, self.lib.commit_tree(tree, 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 142 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 a reference to the working directory
@git.dir.path @git.dir.writeable?
# File lib/git/base.rb, line 88 def dir @working_directory end
iterates over the files which are unmerged
yields file, your_version, their_version
# File lib/git/base.rb, line 310 def each_conflict(&block) self.lib.conflicts(&block) end
# File lib/git/base.rb, line 173 def gcommit(objectish) Git::Object.new(self, objectish, 'commit') 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 232 def grep(string) self.object('HEAD').grep(string) end
this is a convenience method for accessing the class that wraps all the actual ‘git’ forked system calls. At some point I hope to replace the Git::Lib class with one that uses native methods or libgit C bindings
# File lib/git/base.rb, line 209 def lib @lib ||= Git::Lib.new(self, @logger) 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 165 def object(objectish) Git::Object.new(self, objectish) 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 296 def push(remote = 'origin', branch = 'master') self.lib.push(remote, branch) end
# File lib/git/base.rb, line 403 def read_tree(treeish, opts = {}) self.lib.read_tree(treeish, opts) end
returns a Git::Remote object
# File lib/git/base.rb, line 202 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 247 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 94 def repo @repository end
returns the repository size in bytes
# File lib/git/base.rb, line 130 def repo_size size = 0 Dir.chdir(repo.path) do (size, dot) = `du -s`.chomp.split end size.to_i end
resets the working directory to the provided commitish
# File lib/git/base.rb, line 252 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 257 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 455 def revparse(objectish) self.lib.revparse(objectish) end
# File lib/git/base.rb, line 109 def set_index(index_file, check = true) @lib = nil @index = Git::Index.new(index_file.to_s, check) end
# File lib/git/base.rb, line 104 def set_working(work_dir, check = true) @lib = nil @working_directory = Git::WorkingDirectory.new(work_dir.to_s, check) end
returns a Git::Status object
# File lib/git/base.rb, line 187 def status Git::Status.new(self) end
returns an array of all Git::Tag objects for this repository
# File lib/git/base.rb, line 341 def tags self.lib.tags.map { |r| tag(r) } end
# File lib/git/base.rb, line 420 def update_ref(branch, commit) branch(branch).update_ref(commit) end
LOWER LEVEL INDEX OPERATIONS ##
# File lib/git/base.rb, line 384 def with_index(new_index) old_index = @index set_index(new_index, false) return_value = yield @index set_index(old_index) return_value end
# File lib/git/base.rb, line 392 def with_temp_index &blk tempfile = Tempfile.new('temp-index') temp_path = tempfile.path tempfile.unlink with_index(temp_path, &blk) end
# File lib/git/base.rb, line 440 def with_temp_working &blk tempfile = Tempfile.new("temp-workdir") temp_dir = tempfile.path tempfile.unlink Dir.mkdir(temp_dir, 0700) with_working(temp_dir, &blk) end
# File lib/git/base.rb, line 429 def with_working(work_dir) return_value = false old_working = @working_directory set_working(work_dir) Dir.chdir work_dir do return_value = yield @working_directory end set_working(old_working) return_value end