github 只收小於 100MB 的檔案

正常情況不應該放大的binary檔案在git裡。只是,某些大資料相關專案看起來討厭,還是被逼著做,所以亂搞。

報告(抱怨)結束,問題就是,一開始放在 bitbucket 沒有問題,之後要換到 github 問題就出現了,檔案超過100MB不收,檔案超過50MB會警告。於是,我想了一個爛方法,就是把大檔案切為數個檔案,push 回 bitbucket 之後,再進行 clone and push mirror。

意外學到兩個經驗,一個就是 git duplicate 的作法,另外就是刪除檔案。

先講刪除檔案的方式

https://help.github.com/articles/remove-sensitive-data/ 基本上這邊都寫了,也滿清楚的,重複簡單的說一下

# clone 你的 proj
git clone ssh://git@bitbucket.org/xxx/myproj.git
cd myproj
# 用 split 切檔案
split -b 49M AAA.tar.gz AAA.tar.gz
(之後會產生 AAA.tar.gz.aa AAA.tar.gzab, 要用的時候cat起來即可)
git add AAA.tar.gz.aa AAA.tar.gzab; git commit -m 'split large file; git push'
# 刪除掉 AAA.tar.gz
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch AAA.tar.gz' \
--prune-empty --tag-name-filter cat -- --all
# 更新到 git repository
git push origin --force --all
git push origin --force --tags
# 把local的部份整理乾淨
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

一些進階的git 指令再請教man吧!

之後第二個重點就是把整理好的git repository 複製,我這邊要從 bitbucket 換到 github。

https://help.github.com/articles/duplicating-a-repository/ 一樣超清楚的,照做就是了。

git clone --mirror ssh://git@bitbucket.org/xxx/myproj.git
cd myproj.git
git remote set-url --push origin https://github.com/exampleuser/mirrored
git fetch -p origin
git push --mirror

git push --mirror OK!

以上參考:

  • https://help.github.com/articles/duplicating-a-repository/
  • http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository
  • https://help.github.com/articles/remove-sensitive-data/
  • http://pjack1981.blogspot.tw/2012/10/git-filter-branch.html

Comments