diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
index dbbb28f..851723f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
@@ -79,8 +79,7 @@
   }
 
   private ObjectId getTree(GitilesView view, Repository repo, Revision rev) throws IOException {
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       RevTree tree = rw.parseTree(rev.getId());
       if (Strings.isNullOrEmpty(view.getPathPart())) {
         return tree;
@@ -92,8 +91,6 @@
       return tw.getObjectId(0);
     } catch (IncorrectObjectTypeException e) {
       return ObjectId.zeroId();
-    } finally {
-      rw.release();
     }
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
index 107f1e1..f0352ac 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
@@ -119,11 +119,8 @@
         result.sha = c.copy();
       }
       if (fs.contains(Field.ABBREV_SHA)) {
-        ObjectReader reader = repo.getObjectDatabase().newReader();
-        try {
+        try (ObjectReader reader = repo.getObjectDatabase().newReader()) {
           result.abbrev = reader.abbreviate(c);
-        } finally {
-          reader.release();
         }
       }
       if (fs.contains(Field.URL)) {
@@ -245,14 +242,11 @@
       }
       AbstractTreeIterator newTree = getTreeIterator(commit);
 
-      DiffFormatter diff = new DiffFormatter(NullOutputStream.INSTANCE);
-      try {
+      try (DiffFormatter diff = new DiffFormatter(NullOutputStream.INSTANCE)) {
         diff.setRepository(repo);
         diff.setDetectRenames(true);
         result.entries = diff.scan(oldTree, newTree);
         return result;
-      } finally {
-        diff.release();
       }
     }
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index 3e81703..788eb07 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -62,14 +62,12 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk walk = new RevWalk(repo);
-    TreeWalk tw = null;
-    try {
+    try (RevWalk walk = new RevWalk(repo);
+        TreeWalk tw = newTreeWalk(walk, view)) {
       boolean showCommit, isFile;
       AbstractTreeIterator oldTree;
       AbstractTreeIterator newTree;
       try {
-        tw = newTreeWalk(walk, view);
         if (tw == null && !view.getPathPart().isEmpty()) {
           res.setStatus(SC_NOT_FOUND);
           return;
@@ -108,15 +106,10 @@
       }
 
       setCacheHeaders(res);
-      try (OutputStream out = startRenderStreamingHtml(req, res, "gitiles.diffDetail", data)) {
-        DiffFormatter diff = new HtmlDiffFormatter(renderer, view, out);
+      try (OutputStream out = startRenderStreamingHtml(req, res, "gitiles.diffDetail", data);
+        DiffFormatter diff = new HtmlDiffFormatter(renderer, view, out)) {
         formatDiff(repo, oldTree, newTree, view.getPathPart(), diff);
       }
-    } finally {
-      if (tw != null) {
-        tw.release();
-      }
-      walk.release();
     }
   }
 
@@ -126,8 +119,7 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk walk = new RevWalk(repo);
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
       AbstractTreeIterator oldTree;
       AbstractTreeIterator newTree;
       try {
@@ -139,11 +131,10 @@
       }
 
       try (Writer writer = startRenderText(req, res);
-          OutputStream out = BaseEncoding.base64().encodingStream(writer)) {
-        formatDiff(repo, oldTree, newTree, view.getPathPart(), new DiffFormatter(out));
+          OutputStream out = BaseEncoding.base64().encodingStream(writer);
+          DiffFormatter diff = new DiffFormatter(out)) {
+        formatDiff(repo, oldTree, newTree, view.getPathPart(), diff);
       }
-    } finally {
-      walk.release();
     }
   }
 
@@ -173,16 +164,12 @@
 
   private static void formatDiff(Repository repo, AbstractTreeIterator oldTree,
       AbstractTreeIterator newTree, String path, DiffFormatter diff) throws IOException {
-    try {
-      if (!path.isEmpty()) {
-        diff.setPathFilter(PathFilter.create(path));
-      }
-      diff.setRepository(repo);
-      diff.setDetectRenames(true);
-      diff.format(oldTree, newTree);
-    } finally {
-      diff.release();
+    if (!path.isEmpty()) {
+      diff.setPathFilter(PathFilter.create(path));
     }
+    diff.setRepository(repo);
+    diff.setDetectRenames(true);
+    diff.format(oldTree, newTree);
   }
 
   private static AbstractTreeIterator getTreeIterator(RevWalk walk, ObjectId id)
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index 48215c6..e1594fc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -130,7 +130,7 @@
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
       return;
     } finally {
-      paginator.getWalk().release();
+      paginator.getWalk().close();
     }
   }
 
@@ -161,7 +161,7 @@
       }
       renderJson(req, res, result, new TypeToken<Map<String, Object>>() {}.getType());
     } finally {
-      paginator.getWalk().release();
+      paginator.getWalk().close();
     }
   }
 
@@ -174,14 +174,11 @@
     if (headRef == null) {
       return null;
     }
-    RevWalk walk = new RevWalk(repo);
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
       return GitilesView.log()
         .copyFrom(view)
         .setRevision(Revision.peel(Constants.HEAD, walk.parseAny(headRef.getObjectId()), walk))
         .build();
-    } finally {
-      walk.release();
     }
   }
 
@@ -260,7 +257,7 @@
     try {
       start = getStart(view.getParameters(), walk.getObjectReader());
     } catch (IOException e) {
-      walk.release();
+      walk.close();
       throw e;
     }
     if (start == null) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
index 7e9df71..d08062f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -125,10 +125,8 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk rw = new RevWalk(repo);
-    WalkResult wr = null;
-    try {
-      wr = WalkResult.forPath(rw, view);
+    try (RevWalk rw = new RevWalk(repo);
+        WalkResult wr = WalkResult.forPath(rw, view)) {
       if (wr == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
@@ -154,11 +152,6 @@
       }
     } catch (LargeObjectException e) {
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
-    } finally {
-      if (wr != null) {
-        wr.release();
-      }
-      rw.release();
     }
   }
 
@@ -167,10 +160,8 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk rw = new RevWalk(repo);
-    WalkResult wr = null;
-    try {
-      wr = WalkResult.forPath(rw, view);
+    try (RevWalk rw = new RevWalk(repo);
+        WalkResult wr = WalkResult.forPath(rw, view)) {
       if (wr == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
@@ -195,11 +186,6 @@
       }
     } catch (LargeObjectException e) {
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
-    } finally {
-      if (wr != null) {
-        wr.release();
-      }
-      rw.release();
     }
   }
 
@@ -248,10 +234,8 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk rw = new RevWalk(repo);
-    WalkResult wr = null;
-    try {
-      wr = WalkResult.forPath(rw, view);
+    try (RevWalk rw = new RevWalk(repo);
+        WalkResult wr = WalkResult.forPath(rw, view)) {
       if (wr == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
@@ -266,11 +250,6 @@
       }
     } catch (LargeObjectException e) {
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
-    } finally {
-      if (wr != null) {
-        wr.release();
-      }
-      rw.release();
     }
   }
 
@@ -356,7 +335,7 @@
    * Unlike {@link TreeWalk} itself, supports positioning at the root tree.
    * Includes information to help the auto-dive routine as well.
    */
-  private static class WalkResult {
+  private static class WalkResult implements AutoCloseable {
     private static WalkResult forPath(RevWalk rw, GitilesView view) throws IOException {
       RevTree root = getRoot(view, rw);
       String path = view.getPathPart();
@@ -385,7 +364,7 @@
       } catch (IOException | RuntimeException e) {
         // Fallthrough.
       }
-      tw.release();
+      tw.close();
       return null;
     }
 
@@ -410,8 +389,9 @@
       return tw.getObjectReader();
     }
 
-    private void release() {
-      tw.release();
+    @Override
+    public void close() {
+      tw.close();
     }
   }
 
@@ -534,12 +514,13 @@
   private void showGitlink(HttpServletRequest req, HttpServletResponse res, WalkResult wr)
       throws IOException {
     GitilesView view = ViewFilter.getView(req);
-    SubmoduleWalk sw = SubmoduleWalk.forPath(ServletUtils.getRepository(req), wr.root,
-        view.getPathPart());
-
     String modulesUrl;
     String remoteUrl = null;
-    try {
+
+    try (SubmoduleWalk sw = SubmoduleWalk.forPath(
+          ServletUtils.getRepository(req),
+          wr.root,
+          view.getPathPart())) {
       modulesUrl = sw.getModulesUrl();
       if (modulesUrl != null && (modulesUrl.startsWith("./") || modulesUrl.startsWith("../"))) {
         String moduleRepo = PathUtil.simplifyPathUpToRoot(modulesUrl, view.getRepositoryName());
@@ -551,8 +532,6 @@
       }
     } catch (ConfigInvalidException e) {
       throw new IOException(e);
-    } finally {
-      sw.release();
     }
 
     Map<String, Object> data = Maps.newHashMap();
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
index c9c3b57..b5a0636 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -65,12 +65,9 @@
       res.setStatus(SC_NOT_FOUND);
       return;
     }
-    RevWalk walk = new RevWalk(ServletUtils.getRepository(req));
     List<Map<String, Object>> tags;
-    try {
+    try (RevWalk walk = new RevWalk(ServletUtils.getRepository(req))) {
       tags = getTagsSoyData(req, timeCache, walk, 0);
-    } finally {
-      walk.release();
     }
     renderHtml(req, res, "gitiles.refsDetail",
         ImmutableMap.of("branches", getBranchesSoyData(req, 0), "tags", tags));
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index 46ab655..2965923 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -66,9 +66,8 @@
     GitilesAccess access = getAccess(req);
     RepositoryDescription desc = access.getRepositoryDescription();
 
-    RevWalk walk = new RevWalk(repo);
-    Paginator paginator = null;
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
+      Paginator paginator = null;
       Map<String, Object> data = Maps.newHashMapWithExpectedSize(7);
       List<Map<String, Object>> tags = RefServlet.getTagsSoyData(req, timeCache, walk, REF_LIMIT);
       ObjectId headId = repo.resolve(Constants.HEAD);
@@ -117,8 +116,6 @@
       } else {
         renderHtml(req, res, "gitiles.repositoryIndex", data);
       }
-    } finally {
-      walk.release();
     }
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
index 3e3448e..ab89b1f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
@@ -109,8 +109,7 @@
     if (path.startsWith("/")) {
       path = path.substring(1);
     }
-    RevWalk walk = new RevWalk(repo);
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
       Revision oldRevision = null;
 
       StringBuilder b = new StringBuilder();
@@ -194,8 +193,6 @@
         first = false;
       }
       return null;
-    } finally {
-      walk.release();
     }
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index c8336c7..9887195 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -80,8 +80,7 @@
     GitilesAccess access = getAccess(req);
     Config cfg = getAccess(req).getConfig();
 
-    RevWalk walk = new RevWalk(repo);
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
       DateFormatter df = new DateFormatter(access, Format.DEFAULT);
       List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
@@ -142,8 +141,6 @@
           "objects", soyObjects,
           "hasBlob", hasBlob,
           "hasReadme", hasReadme));
-    } finally {
-      walk.release();
     }
   }
 
@@ -151,8 +148,7 @@
   protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
-    ObjectReader reader = repo.newObjectReader();
-    try {
+    try (ObjectReader reader = repo.newObjectReader()) {
         ObjectLoader loader = reader.open(view.getRevision().getId());
         if (loader.getType() != OBJ_COMMIT) {
           res.setStatus(SC_NOT_FOUND);
@@ -163,8 +159,6 @@
             loader.copyTo(out);
           }
         }
-    } finally {
-      reader.release();
     }
   }
 
@@ -173,8 +167,7 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk walk = new RevWalk(repo);
-    try {
+    try (RevWalk walk = new RevWalk(repo)) {
       DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
       RevObject obj = walk.parseAny(view.getRevision().getId());
       switch (obj.getType()) {
@@ -189,8 +182,6 @@
           res.setStatus(SC_NOT_FOUND);
           break;
       }
-    } finally {
-      walk.release();
     }
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
index b41e000..e921672 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
@@ -133,8 +133,7 @@
   public ObjectId findLastCommit(Repository repo, ObjectId commitId, String path)
       throws IOException {
     // Default implementation does no caching.
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       rw.markStart(rw.parseCommit(commitId));
       rw.setRewriteParents(false);
       // Don't use rename detection, even though BlameGenerator does. It is not
@@ -144,20 +143,13 @@
           PathFilterGroup.createFromStrings(path),
           TreeFilter.ANY_DIFF));
       return rw.next();
-    } finally {
-      rw.release();
     }
   }
 
   public static List<Region> loadBlame(Key key) throws IOException {
-    try {
-      BlameGenerator gen = new BlameGenerator(key.repo, key.path);
-      try {
-        gen.push(null, key.commitId);
-        return loadRegions(gen);
-      } finally {
-        gen.release();
-      }
+    try (BlameGenerator gen = new BlameGenerator(key.repo, key.path)) {
+      gen.push(null, key.commitId);
+      return loadRegions(gen);
     } finally {
       key.repo = null;
     }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
index 10867e7..c8ba7be 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
@@ -74,8 +74,7 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       GitilesAccess access = getAccess(req);
       RegionResult result = getRegions(view, access, repo, rw, res);
       if (result == null) {
@@ -98,8 +97,6 @@
             "breadcrumbs", view.getBreadcrumbs(),
             "data", blobData));
       }
-    } finally {
-      rw.release();
     }
   }
 
@@ -108,8 +105,7 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       RegionResult result = getRegions(view, getAccess(req), repo, rw, res);
       if (result == null) {
         return;
@@ -124,8 +120,6 @@
       }
       renderJson(req, res, ImmutableMap.of("regions", result.regions),
           new TypeToken<Map<String, List<Region>>>() {}.getType());
-    } finally {
-      rw.release();
     }
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
index d4ae488..1f96847 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
@@ -84,8 +84,7 @@
 
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       String path = view.getPathPart();
       RevTree root;
       try {
@@ -139,8 +138,6 @@
 
       res.setHeader(HttpHeaders.ETAG, curEtag);
       showDoc(req, res, view, cfg, img, nav, doc);
-    } finally {
-      rw.release();
     }
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
index 2491107..e8af92e 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
@@ -50,7 +50,7 @@
 
   @After
   public void tearDown() throws Exception {
-    walk.release();
+    walk.close();
   }
 
   @Test
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index 4e4d603..467a65e 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -364,12 +364,9 @@
   }
 
   private List<?> buildTagsSoyData() throws Exception {
-    RevWalk rw = new RevWalk(repo.getRepository());
-    try {
+    try (RevWalk rw = new RevWalk(repo.getRepository())) {
       return RefServlet.getTagsSoyData(buildSoyRequest(),
           new TimeCache(TimeCache.defaultBuilder()), rw, Integer.MAX_VALUE);
-    } finally {
-      rw.release();
     }
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
index 6481101..8317363 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
@@ -116,13 +116,10 @@
     builder.setObjectId(commit);
     builder.setTag("tag");
     builder.setMessage("");
-    ObjectInserter ins = repo.getRepository().newObjectInserter();
     ObjectId id;
-    try {
+    try (ObjectInserter ins = repo.getRepository().newObjectInserter()) {
       id = ins.insert(builder);
       ins.flush();
-    } finally {
-      ins.release();
     }
     assertEquals(start + 1, getTime(commit));
     assertEquals(start + 1, getTime(id));
@@ -139,13 +136,10 @@
     builder.setObjectId(tag);
     builder.setTag("tagtag");
     builder.setMessage("");
-    ObjectInserter ins = repo.getRepository().newObjectInserter();
     ObjectId tagTagId;
-    try {
+    try (ObjectInserter ins = repo.getRepository().newObjectInserter()) {
       tagTagId = ins.insert(builder);
       ins.flush();
-    } finally {
-      ins.release();
     }
     assertEquals(start + 1, getTime(commit));
     assertEquals(start + 2, getTime(tag));
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK
index ae8ae06..3df8752 100644
--- a/lib/jgit/BUCK
+++ b/lib/jgit/BUCK
@@ -1,10 +1,10 @@
-REPO = MAVEN_CENTRAL
-VERS = '3.6.0.201412230720-r'
+REPO = GERRIT
+VERS = '4.0.0.201505191015-rc1.19-g1773002'
 
 maven_jar(
   name = 'jgit',
   id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
-  sha1 = 'b005b69d9f5b4dba636a95403d5cb62bad5c486d',
+  sha1 = '4db24b39dab8dc0e889807383728032945f461be',
   repository = REPO,
   unsign = True,
   deps = [':ewah'],
@@ -18,7 +18,7 @@
 maven_jar(
   name = 'jgit-servlet',
   id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
-  sha1 = '92cdf015b62c8a4f8fc1f6fd8b1835931bd4b4d6',
+  sha1 = '7bfdbddea56a87f3f2687ae6abf2c5bdae649f0c',
   repository = REPO,
   deps = [':jgit'],
   unsign = True,
@@ -41,7 +41,7 @@
 maven_jar(
   name = 'jgit-archive_library',
   id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
-  sha1 = '359c1f666e4bdc2db795b6c60a7635f6be929a66',
+  sha1 = '08fce6b89f6d1e78f99869d542d70899f3be9c9f',
   repository = REPO,
   deps = [':jgit'],
   unsign = True,
@@ -54,7 +54,7 @@
 maven_jar(
   name = 'junit',
   id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
-  sha1 = 'cb029dba3fafb329078904028db171d9c460ada8',
+  sha1 = 'a54c16076e6cbdb9113565a82cffa5f268ae8e3b',
   repository = REPO,
   unsign = True,
   deps = [':jgit'],
