在Git remote repo中使用自建LFS system === 碰到問題: 1. 遠端git repo (如Github)在管理大型檔案時會使用LFS(large file system)。但如果透過Github的LFS,一個月只能有5G的流量,同時整個帳號底下(就是所有repo)的LFS不能超過2G。如果一個檔案稍大,多push幾次就超過了。 2. 是否能夠透過自架LFS然後把程式碼部份透過Git推到Github上,但使用LFS則是推到另外一個儲存空間。 就個人現有的需求就是有部分的code希望可以放到Github上,但是有些模型或是Training data實在太大包了,不太可能透過Github進行share。硬切成透過載點下載,管理上又有些不方便。這邊就紀錄一下切割程式碼和LFS過程。 # 目前現有方法 [相關討論串](https://stackoverflow.com/questions/66307854/how-to-setup-a-git-lfs-server-at-home)可以看Stackoverflow。擷取大綱就是: 1. 只要有電腦的地方,可以架設簡單的Git server應該就能架設LFS系統。(e.g.架設在localhost。但建議不要,因為做CD的時候有可能會進行pull,路徑不正確可能會炸鍋。) 2. LFS的設定參數可以透過設定檔修改,決定要放在哪個server上。 從一些討論區中有提及Gitea是透過go做出來的極輕便方案。所以後面就先用Gitea測試看看。 # 架設步驟 1. 透過docker來建構gitea服務 2. 製作Github repo,並透過LFS管理超級大檔案 3. 設定LFS在該repo應該要導入的server位置 ## 建構Gitea服務 目前先隨便使用一台位在內網的Server,並按照[官方網站](https://docs.gitea.io/zh-tw/install-with-docker/)的說明進行安裝: ```shell= mkdir giteadata #預計要存放gitea資料的位置 sudo docker run -d --name=gitea -p 10022:22 -p 3000:3000 -v `pwd`/giteadata:/data gitea/gitea:latest ``` 就先用*port 3000*開開看。範例上是使用10080,但使用docker的port fowarding沒有辦法使用10080開啟網頁。 網頁打開後,預設設定包含資料庫都會在container的 */data*底下,也就是說原本放設定的Volumn就會存放所有資料,理論上應該是定期備份該處資料即可。 進入網頁後,依照網頁上面的說明把自己帳號建立起來即可。需要常駐服務就把docker的 --restart=true 加入。 ## 修改Gitea設定檔以支援LFS LFS在Git server上仰賴JWT驗證,經過查證跟不嚴謹的腦補,JWT的設定可能還比該repo是否有完整git功能重要。從[Gitea官網的說明文件](https://docs.gitea.io/en-us/git-lfs-setup/)中,是需要修改 *app.ini* 這檔案。按照官網的說明,應該還是落在 *data* 的[folder](https://docs.gitea.io/en-us/install-with-docker/)裡面。 先修改一下 *\<path\>/data/gitea/conf/app.ini*: (在docker中,/data是落在根目錄下) ```ini= [server] ; Enables git-lfs support. true or false, default is false. LFS_START_SERVER = true ; 雖然官網有建議要設定這項目,但原本就有預設。實測之後不用設定也確實還能動。 ;[lfs] ; Where your lfs files reside, default is data/lfs. ;PATH = /home/gitea/data/lfs ``` 結束以後重啟docker。 ## 建構超大檔案並透過LFS管理 在Gitlab repo上建構就不記錄了。 建後完畢後clone下來,並開啟LFS功能: ```shell= git lfs install ``` 放置一個zip檔(我自己是放了一個6G的檔案測試),當作要被LFS管理的範例檔: ```shell= git lfs track "*.zip" ``` git的LFS管理狀態有點特別。本來以為在支援LFS的git server上也要開一個一模一樣檔名的git repo,但看設定好像不是。因此**只要在支援LFS的git server上放上一個repo,後面把所有的LFS都丟到那邊也沒有關係**。這邊假設就在原本的Gitea上開一個lfsmgr的repo,後就不用管這個位置了。 接下來在gitlab的folder下做以下設定: ```shell= git config -f .lfsconfig lfs.url http://<UserName>@<SERVER>:3000/<User>/lsmgr/lfs # http://192.168.71.211:3000/markliou/lfsmgr/info/lfs/ ``` UserName就是在自架LFS git server上的帳號,SERVER就是該server的IP。User在LFS上開專案的使用者(有可能是別人開好repo並且把maintainer的權限分給我們,這邊就能~~認親~~用。~~提供找一個儲存空間跟頻寬空間的富翁認他當爸爸。~~)。 接下來按照一般方式進行commit和push就可以了: ```shell= git add . git commit -m "lfs commit" git push ``` ## 注意事項 有些git server具有lfs保護機制,所以如果發現lfs沒有出現在自己的lfs空間上就會報錯。例如在lfs推到別處後,Gitlab上就會出現: ``` remote: GitLab: LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all". ``` 這時候就要去把repo把該專案的LFS關掉。([Gitlab的官方說明](https://docs.gitlab.com/ee/topics/git/lfs/)) # references * https://stackoverflow.com/questions/66307854/how-to-setup-a-git-lfs-server-at-home * https://blog.yowko.com/git-lfs/ * https://medium.com/kkdaytech/%E5%88%A9%E7%94%A8-gitea-%E6%9E%B6%E4%B8%80%E5%8F%B0-gitlfs-server-898036a06ad5 * https://www.796t.com/post/OTF5dmE=.html * https://stackoverflow.com/questions/42019529/how-to-clone-pull-a-git-repository-ignoring-lfs 如果LFS掛點了怎麼辦 ###### tags: `cloud`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up