---
# System prepended metadata

title: 在Git remote repo中使用自建LFS system
tags: [cloud]

---

在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`
