快轉到主要內容

Go Get 出現 "Invalid Version: Unknown Revision" 錯誤 - 排查過程與解決方式

·1 分鐘
賴炳維
作者
賴炳維
畢業後,進入 devops 領域。目前擔任 SRE 工程師,專注於系統可靠性和自動化。喜歡探索新技術,並致力於提升系統性能和穩定性。
目錄

執行 go get 取得私有庫時,出現以下錯誤訊息:

go: downloading previate.gitlab.com/api/common v0.0.7 go: usersystem/api imports config: previate.gitlab.com/api/[email protected]: reading previate.gitlab.com/api/common/go.mod at revision v0.0.7: git ls-remote -q origin in

這個錯誤顯示 go get 取得了一個無效的版本,因為找不到指定的版本 v0.0.7 導致的錯誤。

以下紀錄了排查的過程以及最後解決的方式‼️如果有遇到相同的問題,可以參考以下的排查方式:

檢查 go env🔍
#

檢查 go env,確認 GOPRIVATE 是否有設定私有庫的 domain。設置 GOPRIVATE 可以讓 go get 在存取私有庫時,使用 git 的方式存取,而不會使用 proxy.golang.org。

go env -w GOPRIVATE=previate.gitlab.com

檢查 git config🔍
#

go get 私有庫套件時,預設會使用 HTTPS 的方式存取,會需要輸入使用者名稱與個人存取權杖 (Personal Access Token) 來進行驗證,如果沒有跳出輸入帳號密碼的提示。可以使用 ssh 的方式存取,如果已經有在私有庫配置好 SSH Key,則不需要輸入帳號密碼。

git config --global url."[email protected]:".insteadOf "https://previate.gitlab.com/"

檢查 git 的歷程🔍
#

這行指令可以檢查 go get 在取得私有庫套件時,git 的歷程,並且可以看到 git 在存取私有庫時,是否有出現錯誤訊息。

GIT_TERMINAL_PROMPT=1 GIT_TRACE=1 go get -x previate.gitlab.com/api/[email protected]

可以看到更詳細的錯誤訊息✉️

get "previate.gitlab.com/api/common": found meta tag vcs.metaImport{Prefix:"previate.gitlab.com/api/common", VCS:"git", RepoRoot:"https://previate.gitlab.com/api/common.git"} at //previate.gitlab.com/api/common?go-get=1

go: previate.gitlab.com/api/[email protected]: reading previate.gitlab.com/api/common/go.mod at revision v1.0.35: unknown revision refs/tags/v1.0.35

這裡發現 Go 其實已經成功透過 ?go-get=1 解析出私有庫結構,但是在取得指定的版本 v1.0.35 時,出現了 unknown revision。

檢查 git ls-remote🔍
#

檢查共用私有庫的 git ls-remote 是否可以正常存取,並且確認是否有 v0.0.7 這個 tag。

git ls-remote https://previate.gitlab.com/api/common.git

如果可以正常存取,會看到類似以下的輸出:

e1f6c3b8d9f4c3e5e5e refs/tags/v0.0.7
v1f6asdfas2343sfasg refs/tags/v0.0.6
afa1e1f8uw3b89f4c3e refs/tags/v0.0.5

解決方式✅
#

上述的問題都檢查過了,最後還是出現 “Invalid Version: Unknown Revision” 的錯誤訊息,最後懷疑可能是 git 的套件出現問題,嘗試更新 git 版本,更新後就可以正常使用 go get 取得私有庫套件。

brew upgrade git

感想💭
#

老實說最後也不知道為什麼會想要去更新 git 版本,因爲已經黔驢技窮了

本來只是抱持著姑且一試的心情去嘗試的沒想到就真的好了。不過上面的檢查流程還是很重要,如果可以提前知道問題並解決那就更好了!

相關文章