Index: vcpx/repository/git/target.py
===================================================================
--- vcpx/repository/git/target.py	(revision 1603)
+++ vcpx/repository/git/target.py	(revision 1652)
@@ -236,7 +236,12 @@
         newpath = join(self.repository.basedir, newname)
 
+        # These are used with disjunct directories.
+        newpathtmp = newpath + '-TAILOR-HACKED-TEMP-NAME'
+        newnametmp = newname + '-TAILOR-HACKED-TEMP-NAME'
+
         # Git does not track empty directories, so if there is only an
         # empty dir, we have nothing to do.
-        if isdir(newpath) and not len(listdir(newpath)):
+        if (isdir(newpath) and not len(listdir(newpath))) or \
+           (isdir(newpathtmp) and not len(listdir(newpathtmp))):
             return
 
@@ -254,7 +259,16 @@
             self.repository.runCommand(['mv', oldnametmp, oldname])
         else:
-            # we can just add the new path, commit will detect the
-            # deleted ones automatically
-            self.repository.runCommand(['add', newname])
+            if self.shared_basedirs:
+                # we can just add the new path, commit will detect the
+                # deleted ones automatically
+                self.repository.runCommand(['add', newname])
+            else:
+                # For disjunct directories, the real new entry has been moved
+                # out of the way, and the superclass expects us to rename the
+                # the file or directory via git.
+                if exists(newpath) or not exists(newpathtmp):
+                    raise ChangesetApplicationFailure("Unsure how to handle disjunct rename of %s"
+                                                          % newname)
+                self.repository.runCommand(['mv', oldname, newname])
 
     def _prepareTargetRepository(self):
