diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py
index d091f62be5ae5ec541fd17a214ca79abbb4b4f29_aGdleHQvbGFyZ2VmaWxlcy9sZnV0aWwucHk=..d414c28db84d592f9f27c683414bc02d18a5e344_aGdleHQvbGFyZ2VmaWxlcy9sZnV0aWwucHk= 100644
--- a/hgext/largefiles/lfutil.py
+++ b/hgext/largefiles/lfutil.py
@@ -577,7 +577,7 @@
     Otherwise, this returns the function to always write out (or
     ignore if ``not forcibly``) status.
     '''
-    if forcibly is None:
+    if forcibly is None and util.safehasattr(repo, '_largefilesenabled'):
         return repo._lfstatuswriters[-1]
     else:
         if forcibly:
diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
index d091f62be5ae5ec541fd17a214ca79abbb4b4f29_aGdleHQvbGFyZ2VmaWxlcy9vdmVycmlkZXMucHk=..d414c28db84d592f9f27c683414bc02d18a5e344_aGdleHQvbGFyZ2VmaWxlcy9vdmVycmlkZXMucHk= 100644
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -832,6 +832,9 @@
     return result
 
 def overriderebase(orig, ui, repo, **opts):
+    if not util.safehasattr(repo, '_largefilesenabled'):
+        return orig(ui, repo, **opts)
+
     resuming = opts.get('continue')
     repo._lfcommithooks.append(lfutil.automatedcommithook(resuming))
     repo._lfstatuswriters.append(lambda *msg, **opts: None)
diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
index d091f62be5ae5ec541fd17a214ca79abbb4b4f29_aGdleHQvbGFyZ2VmaWxlcy9yZXBvc2V0dXAucHk=..d414c28db84d592f9f27c683414bc02d18a5e344_aGdleHQvbGFyZ2VmaWxlcy9yZXBvc2V0dXAucHk= 100644
--- a/hgext/largefiles/reposetup.py
+++ b/hgext/largefiles/reposetup.py
@@ -24,6 +24,9 @@
         return
 
     class lfilesrepo(repo.__class__):
+        # the mark to examine whether "repo" object enables largefiles or not
+        _largefilesenabled = True
+
         lfstatus = False
         def status_nolfiles(self, *args, **kwargs):
             return super(lfilesrepo, self).status(*args, **kwargs)
diff --git a/tests/test-largefiles-misc.t b/tests/test-largefiles-misc.t
index d091f62be5ae5ec541fd17a214ca79abbb4b4f29_dGVzdHMvdGVzdC1sYXJnZWZpbGVzLW1pc2MudA==..d414c28db84d592f9f27c683414bc02d18a5e344_dGVzdHMvdGVzdC1sYXJnZWZpbGVzLW1pc2MudA== 100644
--- a/tests/test-largefiles-misc.t
+++ b/tests/test-largefiles-misc.t
@@ -907,6 +907,77 @@
   $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 #endif
 
+Test overridden functions work correctly even for repos disabling
+largefiles (issue4547)
+
+  $ hg showconfig extensions | grep largefiles
+  extensions.largefiles=!
+
+(test updating implied by clone)
+
+  $ hg init enabled-but-no-largefiles
+  $ echo normal1 > enabled-but-no-largefiles/normal1
+  $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal1
+  $ hg -R enabled-but-no-largefiles commit -m '#0@enabled-but-no-largefiles'
+  Invoking status precommit hook
+  A normal1
+  $ cat >> enabled-but-no-largefiles/.hg/hgrc <<EOF
+  > [extensions]
+  > # enable locally
+  > largefiles=
+  > EOF
+  $ hg clone -q enabled-but-no-largefiles no-largefiles
+
+(test rebasing implied by pull: precommit while rebasing unexpectedly
+shows "normal3" as "?", because lfdirstate isn't yet written out at
+that time)
+
+  $ echo normal2 > enabled-but-no-largefiles/normal2
+  $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal2
+  $ hg -R enabled-but-no-largefiles commit -m '#1@enabled-but-no-largefiles'
+  Invoking status precommit hook
+  A normal2
+
+  $ echo normal3 > no-largefiles/normal3
+  $ hg -R no-largefiles add no-largefiles/normal3
+  $ hg -R no-largefiles commit -m '#1@no-largefiles'
+  Invoking status precommit hook
+  A normal3
+
+  $ hg -R no-largefiles -q pull --rebase
+  Invoking status precommit hook
+  ? normal3
+
+(test reverting)
+
+  $ hg init subrepo-root
+  $ cat >> subrepo-root/.hg/hgrc <<EOF
+  > [extensions]
+  > # enable locally
+  > largefiles=
+  > EOF
+  $ echo large > subrepo-root/large
+  $ hg -R subrepo-root add --large subrepo-root/large
+  $ hg clone -q no-largefiles subrepo-root/no-largefiles
+  $ cat > subrepo-root/.hgsub <<EOF
+  > no-largefiles = no-largefiles
+  > EOF
+  $ hg -R subrepo-root add subrepo-root/.hgsub
+  $ hg -R subrepo-root commit -m '#0'
+  Invoking status precommit hook
+  A .hgsub
+  A large
+  ? .hgsubstate
+  $ echo dirty >> subrepo-root/large
+  $ echo dirty >> subrepo-root/no-largefiles/normal1
+  $ hg -R subrepo-root status -S
+  M large
+  M no-largefiles/normal1
+  $ hg -R subrepo-root revert --all
+  reverting subrepo-root/.hglf/large (glob)
+  reverting subrepo no-largefiles
+  reverting subrepo-root/no-largefiles/normal1 (glob)
+
   $ cd ..