Haskell使用gitlib操作Git时报HasLgRepo实例缺失错误如何解决
问题修复说明
两个编译错误的修复逻辑如下:
- 第一个报错是因为
blobContents是普通字段访问,不属于Monadic操作,不需要用<-绑定,直接用let声明即可 - 第二个报错是因为
lookupBlob依赖仓库上下文,属于ReaderT LgRepo IO类型的操作,不能放到lift包裹的纯IO环境中执行,仅需要对最终的IO输出操作使用lift即可。
修正后可编译完整代码
{-# LANGUAGE OverloadedStrings #-} module GitOperations where import Git import Git.Libgit2 (lgFactory, LgRepo(..) ) import qualified Data.Text as T import Control.Monad.Trans.Reader import Control.Monad.Trans import Data.ByteString.Char8 as BS repositoryOptions :: RepositoryOptions repositoryOptions = RepositoryOptions { repoPath = ".git" , repoWorkingDir = Just "." , repoIsBare = False , repoAutoCreate = True} main :: IO () main = do repo <- openRepository lgFactory repositoryOptions runReaderT listHEADFiles repo listHEADFiles:: ReaderT LgRepo IO () listHEADFiles = do ref <- resolveReference $ T.pack "HEAD" case ref of Nothing -> fail $ "Could not resolve reference named 'HEAD'" Just reference -> do obj <- lookupObject reference case obj of CommitObj commit -> do objects <- listAllObjects (Just $ commitOid commit) (commitOid commit) mapM_ (\o -> case o of BlobObjOid boOid -> do blob <- lookupBlob boOid let bc = blobContents blob case bc of BlobString bs -> lift $ BS.putStrLn bs _ -> return () ) objects _ -> fail $ "'HEAD' is not a commit object"
如果需要获取文件路径而非文件内容,可改用treeEntries遍历提交对应的树对象,即可拿到文件路径与Blob的对应关系。
内容的提问来源于stack exchange,提问作者altern
相关产品推荐
相关产品推荐

