about 3 years ago

前言(廢話很多)

我一直認為,就算到了現在,網路分享的媒介已經如此發達的 2014 年
網路資源還是較少著墨於「為什麼要這樣做」

通常都是告訴你,如果要做 x 你就下指令 A、要做 y 就下指令 B
這並不是說寫那些文章的人不好,他們提供了很好的筆記讓大家能夠快速查詢
但是由於多半出於自己的筆記性質,並沒有說明清楚只有在某些情況才會 work
這時候如果有一知半解的人查到了然後跟著做,可能就會弄巧成拙

舉個例來說
我今天寫了一篇筆記文章(網路上的確有這麼一篇)

教大家如何把已經 commit 上 git repo 的檔案移除
於是我就寫了
git rm fileA
嗯?但是他沒說 rm 不只會移除 index,也會一併連硬碟檔案刪除
如果這時候有一個人只是想要移除 index,同時保留硬碟檔案,那他應該要
git rm --cached fileA

因為原作者自己想要移除的檔案是不重要的暫存檔,但讀者卻不一定是這個 case
文章上下文也沒有寫來龍去脈,誤會就這樣產生了


國外的技術性文章相對來說會有比較多廢話
這裡的「廢話」是誇飾法,非貶義
就像你的大學原文教科書課本一樣
為了要闡述一個很簡單的概念,可以用好幾頁的文字篇幅去解釋
有時候台灣的學生會覺得「這不過就是一個公式而已,講這麼多廢話幹嘛」
是的,99乘法的原理對你來說可能是廢話
但很多東西一旦是在一知半解的情況下,這些「廢話」就不可忽視了

當你要 commit binary 檔案到 Git 上面前請先三思!

講了半天才要回到正題

今天搜尋到有一篇文章關於 git 的觀念
Don't ever commit binary files to Git! Or what to do if you do.
其實對常用的老手來說,也算是很基本
指令用法是很簡單,而且 git xxx --help 就有很詳細的說明
但是在不懂 git 運作原理之前總覺得不會跑就要學飛
如果你是新手,建議可以看 這份投影片 學習一些基本的 git 概念

回到我要分享的文章
雖然原文標題是說「永遠」不要 commit binary 檔案
但下面討論有人持反對意見:有時候 binary 檔案仍然有它的用處
不過基本上因為 binary 檔案有蠻多缺點的,因此我還是把前半段翻譯出來


Git is a great distributed version control system. It's fantastically for easily storing changed to text files wherever you are, and then easily copying them up to a server or servers or sharing them with your friends locally.

Git 是很棒的分散式版本控制系統。他很輕易地儲存了你位於文字檔案的變更的「位置」(i.e.時間點),然後簡單地複製到一或多個伺服器,甚至在本地端分享給朋友。

Avoid binary files
"Text files" is the key here. It easily lets you see textual changes. But this function is useless for binary data. Data about changes in binary files just makes the commits impossible to read.

避免 binary files
這裡的關鍵是純文字檔案,他輕易地讓你看到文字上的改變,但這個功能對 binary 資料沒有用,binary files 的更動使我們送出的 commits 無法閱讀。

There is another very good reason for keeping binary files out of your repository: They are usually much bigger. Images, videos and compiled binaries are all much bigger than text files. If you commit them to your repository, the size of your repository will become much larger.

有另一個非常好的原因讓你把 binary files 放在 repo 之外:他們通常大很多。
圖片、影片和編譯好的二進位檔都遠比純文字檔大太多
如果你 commit 它們到你的 repo,你的 repo 大小會變得很大。

This matters not because storage is expensive - it's not. It matter because the point of using a distributed VCS is that it makes it cheap and easy to clone and navigate. You want to be able to spin up a new machine and copy the repository as quickly as possible. You want to be able to switch branches as quickly as possible. If you commit any significant number of binary files you will see all of these tasks slow down considerably.

重點不在於儲存空間很貴,不是這樣。
因為使用 DVCS(分散式版本控制系統) 的重點在於便宜而且簡單的「複製」與「瀏覽」(按:這兩個動作是指在不同 branches 快速切換的意思,便宜應該也是指時間成本上的低廉),你想要架一台新的機器燃後複製 repo、你想要能夠在分支之間切換,這些都是盡可能越快越好。如果你 commit 任何大量的 binary files,你將會發現這些所有的任務都顯著地變慢了。

It's important to never commit binary files because once you've commit them they are in the repository history and are very annoying to remove. You can delete the files from the current version of the project - but they'll remain in the repository history, meaning that the overall repository size will still be large.

永遠不要(按:看情況,但絕對不要隨便這樣做,除非有確切的理由) commit bianry files,因為一旦你 commit 他們了,他們就會留在記錄上,而且要移除他們很麻煩。
你可以刪除目前版本裡面的檔案,但他們仍然會存在於之前的版本之中,也就是說整體的 repo 大小還是會很大。
(按:要往回刪除那些 binary files,除了麻煩之外也有危險性)


下面是他找到的方法,一個 script 可以簡單地移除所有時間點上的 binary files
這邊我就不翻了,因為有危險性一般不建議這樣做
而且本篇的主旨只是: 注意那些你即將要 commit 上去的 binary files

← 加速 matlab 內建函式 從神魔之塔談網路產業的抄襲趨勢:idea容易剽竊,執行力才是關鍵 →
 
comments powered by Disqus