diff --git a/contrib/dirstatenonnormalcheck.py b/contrib/dirstatenonnormalcheck.py
index 3d2c17c5d7f2e923718fad6ab8d173d4d1a6064d_Y29udHJpYi9kaXJzdGF0ZW5vbm5vcm1hbGNoZWNrLnB5..91afee6f959e34e510325f810563a6e5338a1243_Y29udHJpYi9kaXJzdGF0ZW5vbm5vcm1hbGNoZWNrLnB5 100644
--- a/contrib/dirstatenonnormalcheck.py
+++ b/contrib/dirstatenonnormalcheck.py
@@ -60,7 +60,6 @@
             # We don't do all these checks when paranoid is disable as it would
             # make the extension run very slowly on large repos
             extensions.wrapfunction(dirstatecl, 'write', _checkdirstate)
-            extensions.wrapfunction(dirstatecl, 'add', _checkdirstate)
             extensions.wrapfunction(dirstatecl, 'remove', _checkdirstate)
             extensions.wrapfunction(dirstatecl, 'merge', _checkdirstate)
             extensions.wrapfunction(dirstatecl, 'drop', _checkdirstate)
diff --git a/hgext/sparse.py b/hgext/sparse.py
index 3d2c17c5d7f2e923718fad6ab8d173d4d1a6064d_aGdleHQvc3BhcnNlLnB5..91afee6f959e34e510325f810563a6e5338a1243_aGdleHQvc3BhcnNlLnB5 100644
--- a/hgext/sparse.py
+++ b/hgext/sparse.py
@@ -257,7 +257,6 @@
     editfuncs = [
         b'set_tracked',
         b'set_untracked',
-        b'add',
         b'copy',
         b'remove',
         b'merge',
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
index 3d2c17c5d7f2e923718fad6ab8d173d4d1a6064d_bWVyY3VyaWFsL2RpcnN0YXRlLnB5..91afee6f959e34e510325f810563a6e5338a1243_bWVyY3VyaWFsL2RpcnN0YXRlLnB5 100644
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -757,24 +757,6 @@
             self._addpath(f, from_p2=True)
         self._map.copymap.pop(f, None)
 
-    def add(self, f):
-        '''Mark a file added.'''
-        if self.pendingparentchange():
-            util.nouideprecwarn(
-                b"do not use `add` inside of update/merge context."
-                b" Use `update_file`",
-                b'6.0',
-                stacklevel=2,
-            )
-        else:
-            util.nouideprecwarn(
-                b"do not use `add` outside of update/merge context."
-                b" Use `set_tracked`",
-                b'6.0',
-                stacklevel=2,
-            )
-        self._add(f)
-
     def _add(self, filename):
         """internal function to mark a file as added"""
         self._addpath(filename, added=True)
diff --git a/mercurial/interfaces/dirstate.py b/mercurial/interfaces/dirstate.py
index 3d2c17c5d7f2e923718fad6ab8d173d4d1a6064d_bWVyY3VyaWFsL2ludGVyZmFjZXMvZGlyc3RhdGUucHk=..91afee6f959e34e510325f810563a6e5338a1243_bWVyY3VyaWFsL2ludGVyZmFjZXMvZGlyc3RhdGUucHk= 100644
--- a/mercurial/interfaces/dirstate.py
+++ b/mercurial/interfaces/dirstate.py
@@ -132,9 +132,6 @@
     def copies():
         pass
 
-    def add(f):
-        '''Mark a file added.'''
-
     def remove(f):
         '''Mark a file removed.'''