問題:
最近遇到了一個從沒見過的錯誤,為此特別紀錄一下,明明已經初始化 git 倉庫,卻沒辦法從遠端經由 HTTP 進行 pull、clone、push 等動作。
會出現下面的錯誤:
fatal: repository 'http://xxxxxxx/xxx.git/' not found
但是實際上目錄是有資料的,不論是初始化過的或是直接複製 .git 資料夾都沒辦法正常的 clone 或 push。
解決方法:
直接開門見山,講重點,只是因為伺服端建倉庫時少下一個指令:
git update-server-info
只要下完這個指令後,git 會進行一系列更新或建立索引的動作(建立objects/info/packs),類似於建立一個檔案目錄清單的動作。
之後,從遠端伺服器就可以透過 HTTP clone 下 repo 了。
原由:
其實會發生這個問題的主因在於伺服端不是 Smart HTTP server。
Smart HTTP vs. Dumb HTTP:
- Smart HTTP: 支援 Git 所有功能的 HTTP 協定實現,例如 git push、git pull 等操作。 需要專門的伺服器軟體,例如 Gitea、GitLab、GitHub 等。
- Dumb HTTP: 僅支援基本的 HTTP 檔案下載功能,無法進行 git push 等操作。 通常用於簡單的 Git 倉庫發布,例如靜態網站。
Dumb HTTP 只是提供簡單的網頁儲存託管倉庫而已。