diff --git a/.git.metadata b/.git.metadata
index e39855e..23e9687 100644
--- a/.git.metadata
+++ b/.git.metadata
@@ -1,2 +1,2 @@
-996c0be58e901deb4ef9d0145e7bf98cdf6a0fb3 SOURCES/git-2.27.0.tar.xz
-097b8da13939ac9f51f97a5659184c1d96fb0973 SOURCES/gpgkey-junio.asc
+a66f98f88bf7734f8463446ac0735cee190da1dc SOURCES/git-2.31.1.tar.xz
+87d3a395bad523277647f8614fbd9fefe0450fc6 SOURCES/gpgkey-junio.asc
diff --git a/.gitignore b/.gitignore
index e3e9c6d..69936fb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-SOURCES/git-2.27.0.tar.xz
+SOURCES/git-2.31.1.tar.xz
 SOURCES/gpgkey-junio.asc
diff --git a/SOURCES/git-2.27.0.tar.sign b/SOURCES/git-2.27.0.tar.sign
deleted file mode 100644
index 760ea5d..0000000
Binary files a/SOURCES/git-2.27.0.tar.sign and /dev/null differ
diff --git a/SOURCES/git-2.31.1.tar.sign b/SOURCES/git-2.31.1.tar.sign
new file mode 100644
index 0000000..a7b42c1
Binary files /dev/null and b/SOURCES/git-2.31.1.tar.sign differ
diff --git a/SPECS/git.spec b/SPECS/git.spec
index 1526603..3dbf9fd 100644
--- a/SPECS/git.spec
+++ b/SPECS/git.spec
@@ -89,8 +89,8 @@
 #global rcrev   .rc0
 
 Name:           git
-Version:        2.27.0
-Release:        1%{?rcrev}%{?dist}
+Version:        2.31.1
+Release:        2%{?rcrev}%{?dist}
 Summary:        Fast Version Control System
 License:        GPLv2
 URL:            https://git-scm.com/
@@ -106,7 +106,7 @@ Source1:        https://www.kernel.org/pub/software/scm/git/%{?rcrev:testing/}%{
 #
 # https://git.kernel.org/cgit/git/git.git/tag/?h=junio-gpg-pub
 # https://git.kernel.org/cgit/git/git.git/blob/?h=junio-gpg-pub&id=7214aea37915ee2c4f6369eb9dea520aec7d855b
-Source9:        gpgkey-junio.asc
+Source2:        gpgkey-junio.asc
 
 # Local sources begin at 10 to allow for additional future upstream sources
 Source11:       git.xinetd.in
@@ -135,6 +135,7 @@ BuildRequires:  rubygem-asciidoctor
 BuildRequires:  asciidoc >= 8.4.1
 %endif
 # endif with asciidoctor
+BuildRequires:  perl(File::Compare)
 BuildRequires:  xmlto
 %if %{with linkcheck}
 BuildRequires:  linkchecker
@@ -305,6 +306,7 @@ Requires:       git-credential-libsecret = %{version}-%{release}
 Requires:       git-cvs = %{version}-%{release}
 %endif
 # endif with cvs
+Requires:       git-daemon = %{version}-%{release}
 Requires:       git-email = %{version}-%{release}
 Requires:       git-gui = %{version}-%{release}
 %if %{with p4}
@@ -396,7 +398,22 @@ Summary:        Git tools for sending patches via email
 BuildArch:      noarch
 Requires:       git = %{version}-%{release}
 Requires:       perl(Authen::SASL)
+Requires:       perl(Cwd)
+Requires:       perl(File::Spec)
+Requires:       perl(File::Spec::Functions)
+Requires:       perl(File::Temp)
+Requires:       perl(IO::Socket::SSL)
+Requires:       perl(Mail::Address)
+Requires:       perl(MIME::Base64)
+Requires:       perl(MIME::QuotedPrint)
+Requires:       perl(Net::Domain)
+Requires:       perl(Net::SMTP)
 Requires:       perl(Net::SMTP::SSL)
+Requires:       perl(POSIX)
+Requires:       perl(Sys::Hostname)
+Requires:       perl(Term::ANSIColor)
+Requires:       perl(Term::ReadLine)
+Requires:       perl(Text::ParseWords)
 %description email
 %{summary}.
 
@@ -501,13 +518,11 @@ Requires:       subversion
 gpghome="$(mktemp -qd)" # Ensure we don't use any existing gpg keyrings
 # Convert the ascii-armored key to binary
 # (use --yes to ensure an existing dearmored key is overwritten)
-gpg2 --homedir "$gpghome" --dearmor --quiet --yes %{SOURCE9}
+gpg2 --homedir "$gpghome" --dearmor --quiet --yes %{SOURCE2}
 xz -dc %{SOURCE0} | # Upstream signs the uncompressed tarballs
-    gpgv2 --homedir "$gpghome" --quiet --keyring %{SOURCE9}.gpg %{SOURCE1} -
+    gpgv2 --homedir "$gpghome" --quiet --keyring %{SOURCE2}.gpg %{SOURCE1} -
 rm -rf "$gpghome" # Cleanup tmp gpg home dir
 
-# Ensure a blank line follows autosetup, el6 chokes otherwise
-# https://bugzilla.redhat.com/1310704
 %autosetup -p1 -n %{name}-%{version}%{?rcrev}
 
 # Install print-failed-test-output script
@@ -624,19 +639,19 @@ sed -i -e '1s@#! */usr/bin/env python$@#!%{__python2}@' \
     contrib/hg-to-git/hg-to-git.py \
     contrib/hooks/multimail/git_multimail.py \
     contrib/hooks/multimail/migrate-mailhook-config \
-    contrib/hooks/multimail/post-receive.example \
-    contrib/svn-fe/svnrdump_sim.py
+    contrib/hooks/multimail/post-receive.example
 %else
-# Remove contrib/fast-import/import-zips.py, contrib/hg-to-git, and
-# contrib/svn-fe which all require python2.
-rm -rf contrib/fast-import/import-zips.py contrib/hg-to-git contrib/svn-fe
+# Remove contrib/fast-import/import-zips.py which require python2.
+rm -rf contrib/fast-import/import-zips.py
 %endif
 # endif with python2
 
 # The multimail hook is installed with git.  Use python3 to avoid an
-# unnecessary python2 dependency, if possible.
+# unnecessary python2 dependency, if possible.  Also fix contrib/hg-to-git
+# while here.
 %if %{with python3}
 sed -i -e '1s@#!\( */usr/bin/env python\|%{__python2}\)$@#!%{__python3}@' \
+    contrib/hg-to-git/hg-to-git.py \
     contrib/hooks/multimail/git_multimail.py \
     contrib/hooks/multimail/migrate-mailhook-config \
     contrib/hooks/multimail/post-receive.example
@@ -782,7 +797,7 @@ chmod a-x Documentation/technical/api-index.sh
 find contrib -type f -print0 | xargs -r0 chmod -x
 
 # Split core files
-not_core_re="git-(add--interactive|contacts|credential-netrc|difftool|filter-branch|instaweb|request-pull|send-mail)|gitweb"
+not_core_re="git-(add--interactive|contacts|credential-netrc|filter-branch|instaweb|request-pull|send-mail)|gitweb"
 grep -vE "$not_core_re|%{_mandir}" bin-man-doc-files > bin-files-core
 touch man-doc-files-core
 %if %{with docs}
@@ -859,27 +874,19 @@ GIT_SKIP_TESTS="$GIT_SKIP_TESTS t9115"
 %endif
 # endif %%{power64}
 
-%ifarch s390x
-# Skip tests which fail on s390x
-#
-# t7812-grep-icase-non-ascii's "PCRE v2: grep non-ASCII from invalid UTF-8
-# data" test fails on big-endian arches.  This is known upstream and will
-# hopefully be resolved soon (2019/10/24, tmz)
-GIT_SKIP_TESTS="$GIT_SKIP_TESTS t7812.11"
-%endif
-# endif s390x
-
 export GIT_SKIP_TESTS
 
 # Set LANG so various UTF-8 tests are run
 export LANG=en_US.UTF-8
 
 # Explicitly enable tests which may be skipped opportunistically
-# (Check for variables set via test_tristate in the test suite)
-export GIT_SVN_TEST_HTTPD=true
+# Check for variables set via test_bool_env in the test suite:
+#   git grep 'test_bool_env GIT_' -- t/{lib-,t[0-9]}*.sh |
+#       sed -r 's/.* (GIT_[^ ]+) .*/\1/g' | sort -u 
 export GIT_TEST_GIT_DAEMON=true
 export GIT_TEST_HTTPD=true
 export GIT_TEST_SVNSERVE=true
+export GIT_TEST_SVN_HTTPD=true
 
 # Create tmpdir for test output and update GIT_TEST_OPTS
 # Also update GIT-BUILD-OPTIONS to keep make from any needless rebuilding
@@ -1061,6 +1068,14 @@ rmdir --ignore-fail-on-non-empty "$testdir"
 %{?with_docs:%{_pkgdocdir}/git-svn.html}
 
 %changelog
+* Thu Nov 25 2021 Ondrej Pohorelsky <opohorel@redhat.com> - 2.31.1-2
+- Remove perl(Email::Valid) require from git-email
+- Related: rhbz#2021547
+
+* Fri Nov 19 2021 Ondrej Pohorelsky <opohorel@redhat.com> - 2.31.1-1
+- Update to release 2.31.1
+- Resolves: rhbz#2021547
+
 * Thu Jun 11 2020 Ondrej Pohorelsky <opohorel@redhat.com> - 2.27.0-1
 - Update to release 2.27.0
 - Resolves: rhbz#1825114