diff --git a/product/ERP5Type/DiffUtils.py b/product/ERP5Type/DiffUtils.py
index 18033bbd86ded6cb168eacdb2686fe5b1a319c06..2af619206b61b5f325517f0bc801f902cf0726ac 100644
--- a/product/ERP5Type/DiffUtils.py
+++ b/product/ERP5Type/DiffUtils.py
@@ -57,11 +57,10 @@ class DiffFile(object):
   """
 
   def __init__(self, raw_diff):
-    if '@@' not in raw_diff:
-      self.binary = True
+    self.children = []
+    self.binary = raw_diff and '@@' not in raw_diff
+    if self.binary or not raw_diff:
       return
-    else:
-      self.binary = False
     self.header = raw_diff.split('@@')[0][:-1]
     # Getting file path in header
     self.path = self.header.split('====')[0][:-1].strip()
@@ -84,7 +83,6 @@ class DiffFile(object):
     if not self.body.startswith('@@'):
        self.body = os.linesep.join(raw_diff.strip().splitlines()[4:])
     # Now splitting modifications
-    self.children = []
     first = True
     tmp = []
     for line in self.body.splitlines():
@@ -97,6 +95,9 @@ class DiffFile(object):
           tmp.append(line)
     self.children.append(CodeBlock(os.linesep.join(tmp)))
 
+  def __nonzero__(self):
+    return self.binary or bool(self.children)
+
   def __len__(self):
     return len(self.children)
 
diff --git a/product/ERP5VCS/Git.py b/product/ERP5VCS/Git.py
index 88d4e38ac7ae09e78c88fe505f0cb6dcc6579266..2f3cd3fb4144295991b22b09bcbd8e6fd0567241 100644
--- a/product/ERP5VCS/Git.py
+++ b/product/ERP5VCS/Git.py
@@ -217,8 +217,10 @@ class Git(WorkingCopy):
       template = 'Index: %%s\n%s%%s\n' % ('=' * 67)
       for diff in out:
         path = diff[:diff.index(' ')]
-        # XXX: the following line fails if only the file mode changes
-        diff_dict[path] = template % (path, diff[diff.index('\n---'):])
+        try:
+          diff_dict[path] = template % (path, diff[diff.index('\n---'):])
+        except ValueError:
+          pass # empty file is deleted or only file mode is changed
     return stat_dict, diff_dict
 
   def getModifiedTree(self, show_unmodified=False):