diff --git a/pkgs/applications/version-management/git-and-tools/git-subrepo/default.nix b/pkgs/applications/version-management/git-and-tools/git-subrepo/default.nix
index 7fe9883c556d..23b8fd95cfd6 100644
--- a/pkgs/applications/version-management/git-and-tools/git-subrepo/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/git-subrepo/default.nix
@@ -1,19 +1,20 @@
-{ lib, stdenv, fetchFromGitHub, git, makeWrapper, which }:
+{ lib, stdenv, fetchFromGitHub, git, makeWrapper, which, installShellFiles }:
 
 stdenv.mkDerivation rec {
   pname = "git-subrepo";
-  version = "0.4.1";
+  version = "0.4.5";
 
   src = fetchFromGitHub {
     owner = "ingydotnet";
     repo = "git-subrepo";
     rev = version;
-    sha256 = "0n10qnc8kyms6cv65k1n5xa9nnwpwbjn9h2cq47llxplawzqgrvp";
+    sha256 = "sha256-ZU5yYaiear5AjlBqtzabmMJNUa2ypeJKW3sQPIcyskM=";
   };
 
   nativeBuildInputs = [
     makeWrapper
     which
+    installShellFiles
   ];
 
   buildInputs = [
@@ -26,21 +27,9 @@ stdenv.mkDerivation rec {
     "INSTALL_MAN=${placeholder "out"}/share/man/man1"
   ];
 
-  patches = [
-    # Allow zsh completion to work even though we aren't installing from a git
-    # clone.  Also submitted upstream as
-    # https://github.com/ingydotnet/git-subrepo/pull/420
-    ./zsh-completion.patch
-  ];
-
   postInstall = ''
-    ZSH_COMP_DIR="$out/share/zsh/vendor-completions"
-    mkdir -p "$ZSH_COMP_DIR"
-    cp share/zsh-completion/_git-subrepo "$ZSH_COMP_DIR/"
-
-    BASH_COMP_DIR="$out/share/bash-completion/completions"
-    mkdir -p "$BASH_COMP_DIR"
-    cp share/completion.bash "$BASH_COMP_DIR/git-subrepo"
+    installShellCompletion --bash --name git-subrepo.bash share/completion.bash
+    installShellCompletion --zsh share/zsh-completion/_git-subrepo
   '';
 
   postFixup = ''
@@ -52,7 +41,7 @@ stdenv.mkDerivation rec {
     homepage = "https://github.com/ingydotnet/git-subrepo";
     description = "Git submodule alternative";
     license = licenses.mit;
-    platforms = platforms.unix ++ platforms.darwin;
-    maintainers = [ maintainers.ryantrinkle ];
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ryantrinkle ];
   };
 }
diff --git a/pkgs/applications/version-management/git-and-tools/git-subrepo/zsh-completion.patch b/pkgs/applications/version-management/git-and-tools/git-subrepo/zsh-completion.patch
deleted file mode 100644
index dcba5ba6eea1..000000000000
--- a/pkgs/applications/version-management/git-and-tools/git-subrepo/zsh-completion.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-diff --git a/pkg/bin/generate-completion.pl b/pkg/bin/generate-completion.pl
-index 85ae3b8..d3e423c 100644
---- a/pkg/bin/generate-completion.pl
-+++ b/pkg/bin/generate-completion.pl
-@@ -82,11 +82,6 @@ sub generate_zsh {
- 
- # DO NOT EDIT. This file generated by pkg/bin/generate-completion.pl.
- 
--if [[ -z $GIT_SUBREPO_ROOT ]]; then
--	echo 'GIT_SUBREPO_ROOT is null; has `/path/to/git-subrepo/.rc` been sourced?'
--	return 3
--fi
--
- _git-subrepo() {
-     typeset -A opt_args
-     local curcontext="$curcontext" state line context
-diff --git a/share/zsh-completion/_git-subrepo b/share/zsh-completion/_git-subrepo
-index fc82be2..a8069d9 100644
---- a/share/zsh-completion/_git-subrepo
-+++ b/share/zsh-completion/_git-subrepo
-@@ -3,11 +3,6 @@
- 
- # DO NOT EDIT. This file generated by pkg/bin/generate-completion.pl.
- 
--if [[ -z $GIT_SUBREPO_ROOT ]]; then
--	echo 'GIT_SUBREPO_ROOT is null; has `/path/to/git-subrepo/.rc` been sourced?'
--	return 3
--fi
--
- _git-subrepo() {
-     typeset -A opt_args
-     local curcontext="$curcontext" state line context