diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for stack2cabal
 
+## 1.0.14 -- 2022-09-13
+
+* Add a --no-sort-repos option. #42
+
 ## 1.0.13 -- 2022-03-06
 
 - Support github field in extra-deps wrt [#39](https://github.com/hasufell/stack2cabal/pull/39), by Fumiaki Kinoshita
diff --git a/exe/Main.hs b/exe/Main.hs
--- a/exe/Main.hs
+++ b/exe/Main.hs
@@ -41,6 +41,7 @@
   , output :: Maybe FilePath
   , inspectRemotes :: Bool
   , pinGHC :: Bool
+  , sortRepos :: Bool
   , runHpack :: Bool
   , hackageIndexDate :: Maybe String -- ^ fuzzy date string
   }
@@ -76,6 +77,9 @@
         <*> (not <$> switch
                 (long "no-pin-ghc" <> help "Don't pin the GHC version")
             )
+        <*> (not <$> switch
+                (long "no-sort-repos" <> help "Don't sort the source repositories")
+            )
         <*> (not <$> switch (long "no-run-hpack" <> help "Don't run hpack"))
         <*> optional
                 (strOption
@@ -116,7 +120,7 @@
         (project, freeze) <- stackToCabal inspectRemotes runHpack inDir stack
         hack <- extractHack . decodeUtf8 <$> BS.readFile
             (inDir </> "stack.yaml")
-        printText <- printProject pinGHC dt project hack
+        printText <- printProject pinGHC sortRepos dt project hack
 
         -- write files
         outFile <- case output of
diff --git a/lib/StackageToHackage/Hackage.hs b/lib/StackageToHackage/Hackage.hs
--- a/lib/StackageToHackage/Hackage.hs
+++ b/lib/StackageToHackage/Hackage.hs
@@ -34,8 +34,8 @@
 import Control.Monad (forM, when, void)
 import Control.Monad.Catch (handleIOError)
 import Data.Hourglass (timePrint, ISO8601_DateAndTime(..), Elapsed)
-import Data.List (nub, sort, sortOn)
-import Data.List.Extra (nubOrd, nubOrdOn)
+import Data.List (nub, sort, sortOn, isSuffixOf, isPrefixOf)
+import Data.List.Extra (nubOrd, nubOrdOn, lower, dropPrefix, dropSuffix)
 import Data.List.NonEmpty (NonEmpty((:|)))
 import Data.Maybe (fromMaybe, mapMaybe, catMaybes)
 import Data.Text (Text)
@@ -61,7 +61,6 @@
 import qualified Data.Text as T
 import System.Directory (doesFileExist)
 
-
 -- | Converts a stack.yaml (and list of local packages) to cabal.project and
 -- cabal.project.freeze.
 stackToCabal :: Bool     -- ^ whether to inspect remotes
@@ -86,13 +85,32 @@
     let freeze = genFreeze resolver ignore
     pure (project, freeze)
 
+-- | Extracts username/repo from an all lowercase repository string.
+--
+-- >>> trimUserRepo "git@github.com:hasufell/stack2cabal.git"
+-- "hasufell/stack2cabal"
+--
+-- >>> trimUserRepo "https://github.com/hasufell/stack2cabal.git"
+-- "hasufell/stack2cabal"
+trimUserRepo :: String -> String
+trimUserRepo s
+    | "git@" `isPrefixOf` s = trimUserRepo $ dropPrefix "git@" s
+    | "https://" `isPrefixOf` s = trimUserRepo $ dropPrefix "https://" s
+    | "github.com" `isPrefixOf` s = trimUserRepo $ dropPrefix "github.com" s
+    | "gitlab.com" `isPrefixOf` s = trimUserRepo $ dropPrefix "gitlab.com" s
+    | "/" `isPrefixOf` s = trimUserRepo $ dropPrefix "/" s
+    | ":" `isPrefixOf` s = trimUserRepo $ dropPrefix ":" s
+    | ".git" `isSuffixOf` s = trimUserRepo $ dropSuffix ".git" s
+    | otherwise = s
 
 printProject :: Bool           -- ^ whether to pin GHC
+             -> Bool           -- ^ whether to sort source-repository-package items
              -> Maybe Elapsed  -- ^ hackage index date to pin
              -> Project
              -> Maybe Text
              -> IO Text
-printProject pinGHC indexDate (Project (Ghc ghc) pkgs srcs ghcOpts) hack = do
+printProject pinGHC sortRepos indexDate (Project (Ghc ghc) pkgs srcs ghcOpts) hack = do
+
     ghcOpts' <- printGhcOpts ghcOpts
     pure $ T.concat
         $ ["-- Generated by stack2cabal\n\n"]
@@ -104,6 +122,11 @@
         <> ghcOpts'
         <> verbatim hack
   where
+    userRepo :: Git -> String
+    userRepo Git{repo} = trimUserRepo . lower $ T.unpack repo
+
+    repos = if sortRepos then sortOn userRepo srcs else srcs
+
     withHackageIndex :: [Text]
     withHackageIndex
         | (Just utc) <- indexDate = ["index-state: ", printUTC utc, "\n\n"]
@@ -133,7 +156,7 @@
         hasTrailingPathSeparator' x = last x == '/'
 
     sources :: Text
-    sources = T.intercalate "\n" (source =<< srcs)
+    sources = T.intercalate "\n" (source =<< repos)
 
     source :: Git -> [Text]
     source Git { repo, commit, subdirs } =
diff --git a/stack2cabal.cabal b/stack2cabal.cabal
--- a/stack2cabal.cabal
+++ b/stack2cabal.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               stack2cabal
-version:            1.0.13
+version:            1.0.14
 synopsis:
   Convert stack projects to cabal.project + cabal.project.freeze
 
