diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java index b0355b2b6..0a0a88c83 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java @@ -124,6 +124,28 @@ public void testCheckoutForced() throws Exception { .setForced(true).call().getObjectId()); } + @Test + public void testCheckoutForced_deleteFileAndRestore() throws Exception { + File testFile = new File(db.getWorkTree(), "Test.txt"); + assertTrue(testFile.exists()); + + assertEquals("test", git.getRepository().getBranch()); + FileUtils.delete(testFile); + assertFalse(testFile.exists()); + // Switch from "test" to "master". + assertEquals(initialCommit.getId(), git.checkout().setName("master") + .setForced(true).call().getObjectId()); + assertTrue(testFile.exists()); + + assertEquals("master", git.getRepository().getBranch()); + FileUtils.delete(testFile); + assertFalse(testFile.exists()); + // Stay in current branch. + assertEquals(initialCommit.getId(), git.checkout().setName("master") + .setForced(true).call().getObjectId()); + assertTrue(testFile.exists()); + } + @Test public void testCreateBranchOnCheckout() throws Exception { git.checkout().setCreateBranch(true).setName("test2").call(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java index e8e198430..8c51a7ac2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -1217,7 +1217,7 @@ private void keep(String path, DirCacheEntry e, WorkingTreeIterator f) if (e != null && !FileMode.TREE.equals(e.getFileMode())) builder.add(e); if (force) { - if (f.isModified(e, true, walk.getObjectReader())) { + if (f == null || f.isModified(e, true, walk.getObjectReader())) { kept.add(path); checkoutEntry(repo, e, walk.getObjectReader(), false, new CheckoutMetadata(walk.getEolStreamType(CHECKOUT_OP),