PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » Version Control » VersionControl_Git » Manual

VersionControl_Git is a library that provides OO interface to handle Git repository. You can use Git command via the wrapper class. Some features are provided by high-featured interface.

Tutorial

Initialize a new repository

The VersionControl_Git class represents your Git repository.

You should specified a path to repository to VersionControl_Git.

<?php
require_once 'VersionControl/Git.php';

// Specify a directory
$git = new VersionControl_Git('/path/to/repository');

Do you want to create new repository? It is easy.

First, create an instance of VersionControl_Git and pass a directory what you want to create new Git repository.

Next, call the VersionControl_Git::initRepository() method.

<?php
require_once 'VersionControl/Git.php';

// Specify a directory
$git = new VersionControl_Git('/path/to/repository');

// create new repository
$git->initRepository();

// If you want to create bare repository, pass true as the first argument
$git->initRepository(true);

Do you want to create clone repository? In this case, you can use the VersionControl_Git::createClone()

<?php
require_once 'VersionControl/Git.php';

// Specify a directory
$git = new VersionControl_Git('/path/to/repository');

// create new repository
$git->createClone('http://example.com/repository.git');

// If you want to create bare repository, pass true as the second argument
$git->createClone('http://example.com/repository.git', true);

Now, you've readied to use full futures of VersionControl_Git.

Getting commits

The commit object in Git is provided as VersionControl_Git_Object_Commit.

There are some ways to get a list of VersionControl_Git_Object_Commit objects.

Use VersionControl_Git::getCommits()

You can get commits by calling VersionControl_Git::getCommits().

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
var_dump($git->getCommits());
/*
results:

array(100) {
  [0]=>
  object(VersionControl_Git_Object_Commit)#3 (9) {
    :
  }
  [1]=>
  object(VersionControl_Git_Object_Commit)#6 (9) {
    :
  }

  :
*/

Calling without arguments, VersionControl_Git::getCommits() returns a list of a hundred VersionControl_Git_Object_Commit instances from master branch. You can specify branch name, commit object name, tag name, tree object name and an instance of VersionControl_Git_Object.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');

// from master branch
$git->getCommits();

// specify stable branch
$git->getCommits('stable');

// specify object name
$git->getCommits('6c8284e4902c3adaf356adeed40d8bda715b73a0');

// specify tag name
$git->getCommits('v1.0');

// specify an instance of VersionControl_Git_Object
$commits = $git->getCommits();
$git->getCommits($commits[0]);

You can specify the maximum number of commits by the second argument.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');

// get 1000 commits from master branch
$git->getCommits('master', 1000);

You can specify the starting point of fetching by the third argument.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');

// get 100 commits from master branch (starting at 100 th commit)
$git->getCommits('master', 100, 100);

Use VersionControl_Git_Util_RevListFetcher

The VersionControl_Git_Util_RevListFetcher is utility class for wrapping "git-rev-list" command. So you can use any feature of "git-rev-list" by this. VersionControl_Git::getCommits() provides by using VersionControl_Git_Util_RevListFetcher.

You can use VersionControl_Git_Util_RevListFetcher to specify your VersionControl_Git instance to the constructor

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$fetcher = new VersionControl_Git_Util_RevListFetcher($git);

The VersionControl_Git provides the getRevListFetcher() convenience method. Use this normally.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$fetcher = $git->getRevListFetcher();

After specifying target (branch name, commit name, tree name, etc) and options, you can get an array of VersionControl_Git_Object_Commit by calling the fetch() method.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$result = $git->getRevListFetcher()
    ->target('master')
    ->setOption('max-count', 10)
    ->setOption('grep', 'initial')
    ->setOption('date', '3 hours ago')
    ->fetch();

The commit object (VersionControl_Git_Object_Commit)

An instance of the VersionControl_Git_Object_Commit provides information about a commit.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$commits = $git->getCommits();

var_dump($commits[0]->getAuthor());
/*
string(35) "Kousuke Ebihara <kousuke@co3k.org>"
*/

var_dump($commits[0]->getCreatedAt());
/*
int(1503517047)
*/

var_dump($commits[0]->getCommitter());
/*
string(35) "Kousuke Ebihara <kousuke@co3k.org>"
*/

var_dump($commits[0]->getCommittedAt());
/*
int(1503517047)
*/

var_dump($commits[0]->getMessage());
/*
string(62) "changed url to JSON version of dashboard contents (fixes #509)"
*/

var_dump($commits[0]->getParents());
/*
array(1) {
  [0]=>
    object(VersionControl_Git_Object_Commit)#303 (9) {
    }
}
*/

var_dump($commits[0]->getTree());
/*
string(40) "ba2dd3d861f68c6ea31c4cd4444a5d86869a3401"
*/

The tree object (VersionControl_Git_Object_Tree)

An instance of the VersionControl_Git_Object_Tree represents tree object in Git. It has pointers to contents of the direcotry.

An instance of VersionControl_Git_Object_Tree can get via VersionControl_Git::getTree().

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$commits = $git->getCommits();

$tree = $git->getTree($commits[0]->getTree());

The instance doesn't have any contents at the first. If you want to get contents, you must call "fetch()" method.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$commits = $git->getCommits();

$tree = $git->getTree($commits[0]->getTree());
$tree->fetch();

The VersionControl_Git_Object_Commit implements the SeekableIterator interface. You can iterate and seek contents of tree.

<?php
require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/path/to/repository');
$commits = $git->getCommits();

$tree = $git->getTree($commits[0]->getTree());
$tree->fetch();

foreach ($tree as $content) {
   var_dump($content);
}

/*
results:

object(VersionControl_Git_Object_Blob)#304 (3) {
}
object(VersionControl_Git_Object_Blob)#305 (3) {
}
object(VersionControl_Git_Object_Blob)#306 (3) {
}
object(VersionControl_Git_Object_Blob)#307 (3) {
}
object(VersionControl_Git_Object_Tree)#308 (4) {
}
object(VersionControl_Git_Object_Tree)#309 (4) {
}
object(VersionControl_Git_Object_Tree)#311 (4) {
}
object(VersionControl_Git_Object_Tree)#312 (4) {
}
object(VersionControl_Git_Object_Tree)#313 (4) {
}
object(VersionControl_Git_Object_Tree)#314 (4) {
}
object(VersionControl_Git_Object_Tree)#315 (4) {
}
object(VersionControl_Git_Object_Tree)#316 (4) {
}
object(VersionControl_Git_Object_Blob)#317 (3) {
}
object(VersionControl_Git_Object_Tree)#318 (4) {
}
*/

The blob object (VersionControl_Git_Object_Blob)

An instance of the VersionControl_Git_Object_Blob represents tree object in Git. It has contents of the file.

It can get via VersionControl_Git_Object_Tree

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$commits = $git->getCommits();

$tree = $git->getTree($commits[0]->getTree());
$tree->fetch();

$blob = $tree->current();
var_dump($blob);
/*
results:

object(VersionControl_Git_Object_Blob)#304 (3) {
}
*/

The instance doesn't have any contents at the first. If you want to get contents, call the getContents() after calling the fetch() method.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$commits = $git->getCommits();

$tree = $git->getTree($commits[0]->getTree());
$tree->fetch();

$blob = $tree->current()->fetch();
var_dump($blob->getContent());

Handle command

The VersionControl_Git prepares OO interface of some Git feature, but it is not completely.

If you want to use full feature of Git by using VersionControl_Git, you should run Git command via VersionControl_Git_Util_Command.

To tell the truth, most of the feature of VersionControl_Git uses VersionControl_Git_Util_Command.

Now, I explain you how to use VersionControl_Git_Util_Command.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$command = $git->getCommand('show');

You can get an instance of VersionControl_Git_Util_Command by calling VersionControl_Git::getCommand() with sub-command name.

If you want to use options, add calling the setOption() method or the setOptions() method.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$command = $git->getCommand('show')
    ->setOptions(array(
        'pretty' => 'raw',
    ))
    ->setOptions('pretty', 'raw');

The boolean option value is special. "true" is specified as option value, it doesn't have value. "false" is specified as option value, the option will not be used.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$command = $git->getCommand('show')
    ->setOptions('oneline', true);

If you want to use arguments, add calling the addArgument() method or the setArguemnts() method.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$command = $git->getCommand('show')
    ->setArguments(array('master', 'branch1'))
    ->addArgument('branch2');

Ready to execute the command? Now you can call "execute()" method and get result.

<?php

require_once 'VersionControl/Git.php';

$git = new VersionControl_Git('/home/co3k/sf/op3-ebihara');
$result = $git->getCommand('show')
    ->setOption('oneline', true)
    ->addArgument('master')
    ->execute();
var_dump($result);

/*
result:

string(829) "9a259a5 changed url to JSON version of dashboard contents (fixes #509)
diff --git a/apps/pc_backend/modules/default/templates/topSuccess.php b/apps/pc_backend/modules/default/templates/topSuccess.php
index 3c7764e..cbfcf26 100644
  :
*/