diff --git includes/VersioncontrolGitItem.php includes/VersioncontrolGitItem.php
index 2d4da21..50f781c 100644
--- includes/VersioncontrolGitItem.php
+++ includes/VersioncontrolGitItem.php
@@ -69,7 +69,7 @@ class VersioncontrolGitItem extends VersioncontrolItem {
     }
     if ($this->sourceItem instanceof VersioncontrolItem) {
       // do not insert a duplicate item revision
-      $db_item = $this->backend->loadEntity('item', array(), array('revision' => $this->sourceItem->revision, 'path' => $this->sourceItem->path));
+      $db_item = $this->backend->loadEntity('item', array(), array('revision' => $this->sourceItem->revision, 'path' => $this->sourceItem->path), array('may cache' => FALSE));
       if (is_subclass_of($db_item, 'VersioncontrolItem')) {
         $this->sourceItem = $db_item;
       }
diff --git versioncontrol_git.log.inc versioncontrol_git.log.inc
index 1c7ac5a..6b0a49b 100644
--- versioncontrol_git.log.inc
+++ versioncontrol_git.log.inc
@@ -138,6 +138,7 @@ function _versioncontrol_git_log_exec($command) {
     watchdog('versioncontrol_git', '!errors', array('!errors' => implode('<br />', $errors)), WATCHDOG_ERROR);
     return array();
   }
+  
   exec(escapeshellcmd("$git_bin $command"), $logs);
   array_unshift($logs, ''); // FIXME doing it this way is just wrong.
   reset($logs); // Reset the array pointer, so that we can use next().
@@ -240,6 +241,8 @@ function _versioncontrol_git_fill_source_item(&$item, $parents, $inc_data) {
  * @return array All items affected by a commit.
  */
 function _versioncontrol_git_parse_items(&$logs, &$line, $data, $parents) {
+  _git_deploy_load_glip();
+  $repo = new Git($data['repository']->root);
   $op_items = array();
 
   // Parse the diffstat for the changed files.
@@ -259,9 +262,8 @@ function _versioncontrol_git_parse_items(&$logs, &$line, $data, $parents) {
     }
 
     // extract blob
-    $command = 'ls-tree -r ' . escapeshellarg($data['revision']) . ' ' . escapeshellarg($matches[3]);
-    $lstree_lines = _versioncontrol_git_log_exec($command);
-    $blob_hash = _versioncontrol_git_parse_item_blob($lstree_lines);
+    $blob_hash = sha1_hex($repo->getObject(sha1_bin($data['revision']))->getTree()->find($matches[3]));
+
     $op_items[$path]->blob_hash = $blob_hash;
   } while (($line = next($logs)) !== FALSE);
 
@@ -274,9 +276,7 @@ function _versioncontrol_git_parse_items(&$logs, &$line, $data, $parents) {
     if ($matches[1] == 'create') {
       $op_items['/'. $matches[4]]->action = VERSIONCONTROL_ACTION_ADDED;
       // extract blob
-      $command = 'ls-tree -r ' . escapeshellarg($data['revision']) . ' ' . escapeshellarg($matches[4]);
-      $lstree_lines = _versioncontrol_git_log_exec($command);
-      $blob_hash = _versioncontrol_git_parse_item_blob($lstree_lines);
+      $blob_hash = sha1_hex($repo->getObject(sha1_bin($data['revision']))->getTree()->find($matches[4]));
       $op_items['/'. $matches[4]]->blob_hash = $blob_hash;
     }
     else if ($matches[1] == 'delete') {
