diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Changelog
 
+## 0.2.3 (2019-09-30)
+- push git tag
+- hlint is now a warning not an error
+- prefix version tags with v
+- surround git diff output with quote lines
+- catch exception for sdist
+
 ## 0.2.2 (2019-07-06)
 - run hlint before git tag
 - relax force sdist when no existing tarball
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -7,7 +7,7 @@
 import Control.Applicative (pure, (<$>))
 #endif
 
-import Control.Exception (bracket_)
+import Control.Exception (bracket_, onException)
 import Control.Monad
 import Data.Maybe
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,11,0))
@@ -43,32 +43,38 @@
 tagDistCmd :: Bool -> IO ()
 tagDistCmd force = do
   mhlint <- findExecutable "hlint"
-  when (isJust mhlint) $ cmd_ "hlint" ["."]
-  git_ "diff" []
+  when (isJust mhlint) $ void $ cmdBool "hlint" ["."]
+  diff <- git "diff" []
+  unless (null diff) $ do
+    putStrLn "=== start of uncommitted changes ==="
+    putStrLn diff
+    putStrLn "=== end of uncommitted changes ==="
   pkgid <- getPackageId
   checkNotPublished pkgid
-  let tag = packageVersion pkgid
+  let tag = pkgidTag pkgid
   tagHash <- cmdMaybe "git" ["rev-parse", tag]
   when (isJust tagHash && not force) $
     error' "tag exists: use --force to override"
   git_ "tag" $ ["--force" | force] ++ [tag]
   unless force $ putStrLn tag
-  distOk <- sdist force pkgid
-  unless distOk $ do
+  sdist force pkgid `onException` do
     putStrLn "Resetting tag"
     if force
       then git_ "tag" ["--force", tag, fromJust tagHash]
       else git_ "tag" ["--delete", tag]
 
+pkgidTag :: PackageIdentifier -> String
+pkgidTag pkgid = "v" ++ packageVersion pkgid
+
 checkNotPublished :: PackageIdentifier -> IO ()
 checkNotPublished pkgid = do
   let published = "dist" </> showPkgId pkgid <.> ".tar.gz" <.> "published"
   exists <- doesFileExist published
   when exists $ error' $ showPkgId pkgid <> " was already published!!"
 
-sdist :: Bool -> PackageIdentifier -> IO Bool
+sdist :: Bool -> PackageIdentifier -> IO ()
 sdist force pkgid = do
-  let ver = packageVersion pkgid
+  let tag = pkgidTag pkgid
   let target = "dist" </> showPkgId pkgid <.> ".tar.gz"
   haveTarget <- doesFileExist target
   when haveTarget $
@@ -78,13 +84,12 @@
   cwd <- getCurrentDirectory
   withTempDirectory "tmp-sdist" $ do
     git_ "clone" ["-q", "--no-checkout", "..", "."]
-    git_ "checkout" ["-q", ver]
+    git_ "checkout" ["-q", tag]
     cabal_ "check" []
     cabal_ "configure" []
     -- cabal_ "build" []
-    distOk <- cmdBool "cabal" ["sdist"]
-    when distOk $ renameFile target (cwd </> target)
-    return distOk
+    cabal_ "sdist" []
+    renameFile target (cwd </> target)
 
 showVersionCmd :: IO ()
 showVersionCmd = do
@@ -101,7 +106,9 @@
   cabal_ "upload" $ ["--publish" | publish] ++ [file]
   when publish $ do
     createFileLink (takeFileName file) (file <.> "published")
-    let tag = packageVersion pkgid
+    let tag = pkgidTag pkgid
+    -- first push ref of tag and then tag, surely you are joking
+    git_ "push" ["origin", tag]
     git_ "push" ["origin", tag]
 
 upHaddockCmd :: Bool -> IO ()
diff --git a/hkgr.cabal b/hkgr.cabal
--- a/hkgr.cabal
+++ b/hkgr.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.0
 name:                hkgr
-version:             0.2.2
+version:             0.2.3
 synopsis:            Simple Hackage release workflow for package maintainers
 description:
             Hkgr (pronouced "Hackager") is a tool to help make new releases of
@@ -17,7 +17,8 @@
 build-type:          Simple
 extra-doc-files:     README.md
                    , CHANGELOG.md
-tested-with:         GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2, GHC == 8.0.2
+tested-with:         GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2,
+                     GHC == 8.0.2
 
 source-repository head
   type:                git
