diff --git a/reviewboard/scmtools/svn/__init__.py b/reviewboard/scmtools/svn/__init__.py
index 04c2c30fbcc77ce7e47ac9372faf199762257186..60c55df28ffda51f8806206398d26af03c51fbde 100644
--- a/reviewboard/scmtools/svn/__init__.py
+++ b/reviewboard/scmtools/svn/__init__.py
@@ -12,7 +12,8 @@ from django.utils.translation import ugettext as _
 
 from reviewboard.diffviewer.parser import DiffParser
 from reviewboard.scmtools.certs import Certificate
-from reviewboard.scmtools.core import SCMTool, HEAD, PRE_CREATION, UNKNOWN
+from reviewboard.scmtools.core import (Commit, SCMTool, HEAD, PRE_CREATION,
+                                       UNKNOWN)
 from reviewboard.scmtools.errors import (AuthenticationError,
                                          RepositoryNotFoundError,
                                          SCMError,
@@ -52,6 +53,8 @@ class SVNTool(SCMTool):
                         # recompute_svn_backend()
     }
 
+    COMMITS_PAGE_LIMIT = 31
+
     def __init__(self, repository):
         self.repopath = repository.path
         if self.repopath[-1] == '/':
@@ -124,7 +127,38 @@ class SVNTool(SCMTool):
 
     def get_commits(self, start):
         """Return a list of commits."""
-        return self.client.get_commits(start)
+        commits = self.client.get_log('/',
+                                      start=start,
+                                      limit=self.COMMITS_PAGE_LIMIT,
+                                      limit_to_path=False)
+
+        results = []
+
+        # We fetch one more commit than we care about, because the entries in
+        # the svn log doesn't include the parent revision.
+        for i in range(len(commits) - 1):
+            commit = commits[i]
+            parent = commits[i + 1]
+
+            results.append(Commit(
+                commit.get('author', ''),
+                commit['revision'],
+                commit['date'].isoformat(),
+                commit['message'],
+                parent['revision']))
+
+        # If there were fewer than the requested number of commits fetched,
+        # also include the last one in the list so we don't leave off the
+        # initial revision.
+        if len(commits) < self.COMMITS_PAGE_LIMIT:
+            commit = commits[-1]
+            results.append(Commit(
+                commit['author'],
+                commit['revision'],
+                commit['date'].isoformat(),
+                commit['message']))
+
+        return results
 
     def get_change(self, revision):
         """Get an individual change.
diff --git a/reviewboard/scmtools/svn/base.py b/reviewboard/scmtools/svn/base.py
index ec0b6d6ab8abe4c3f695b15bb8bc585f14fa3e59..00ee20a07979c8248e0fc9afdea3bfb59796f316 100644
--- a/reviewboard/scmtools/svn/base.py
+++ b/reviewboard/scmtools/svn/base.py
@@ -50,10 +50,6 @@ class Client(object):
         This assumes the standard layout in the repository."""
         raise NotImplementedError
 
-    def get_commits(self, start):
-        """Returns a list of commits."""
-        raise NotImplementedError
-
     def get_change(self, revision, cache_key):
         """Get an individual change.
 
diff --git a/reviewboard/scmtools/svn/pysvn.py b/reviewboard/scmtools/svn/pysvn.py
index 7e67e1dae8fc03611ee46616ed0b0bd0f85ec71e..ccaedf3a0de03572dfdffb59e9cbe54be42faa47 100644
--- a/reviewboard/scmtools/svn/pysvn.py
+++ b/reviewboard/scmtools/svn/pysvn.py
@@ -141,43 +141,6 @@ class Client(base.Client):
 
         return results
 
-    def get_commits(self, start):
-        """Returns a list of commits."""
-        commits = self.client.log(
-            self.repopath,
-            revision_start=Revision(opt_revision_kind.number,
-                                    int(start)),
-            limit=31)
-
-        results = []
-
-        # We fetch one more commit than we care about, because the entries in
-        # the svn log doesn't include the parent revision.
-        for i in range(len(commits) - 1):
-            commit = commits[i]
-            parent = commits[i + 1]
-
-            date = datetime.utcfromtimestamp(commit['date'])
-            results.append(Commit(
-                commit.get('author', ''),
-                six.text_type(commit['revision'].number),
-                date.isoformat(),
-                commit['message'],
-                six.text_type(parent['revision'].number)))
-
-        # If there were fewer than 31 commits fetched, also include the last
-        # one in the list so we don't leave off the initial revision.
-        if len(commits) < 31:
-            commit = commits[-1]
-            date = datetime.utcfromtimestamp(commit['date'])
-            results.append(Commit(
-                commit['author'],
-                six.text_type(commit['revision'].number),
-                date.isoformat(),
-                commit['message']))
-
-        return results
-
     def get_change(self, revision, cache_key):
         """Get an individual change.
 
diff --git a/reviewboard/scmtools/svn/subvertpy.py b/reviewboard/scmtools/svn/subvertpy.py
index afd60e80ef92143d01656f92d8c28c9c198823f9..8fc0a9f619108e98c6a019f634b0be335c70dade 100644
--- a/reviewboard/scmtools/svn/subvertpy.py
+++ b/reviewboard/scmtools/svn/subvertpy.py
@@ -127,24 +127,6 @@ class Client(base.Client):
 
         return results
 
-    def get_commits(self, start):
-        """Returns a list of commits."""
-        results = []
-
-        if start.isdigit():
-            start = int(start)
-        commits = list(self.ra.iter_log(None, start, end=0, limit=31))
-        # We fetch one more commit than we care about, because the entries in
-        # the svn log doesn't include the parent revision.
-        for i, (_, rev, props, _) in enumerate(commits[:-1]):
-            parent = commits[i + 1]
-            commit = Commit(props[SVN_AUTHOR], six.text_type(rev),
-                            # [:-1] to remove the Z
-                            props[SVN_DATE][:-1], props[SVN_LOG],
-                            six.text_type(parent[1]))
-            results.append(commit)
-        return results
-
     def get_change(self, revision, cache_key):
         """Get an individual change.
 
