按時備份自己的文件或 code 是一個好習慣,以前尚未進入資訊科學這個領域時,最常使用的備份方式大概就是 Copy & Paste + Rename (Ex: Test .txt -> Test_20130723.txt)。這個方法很簡單也很快速,但是,有些小小的問題,如 1. 時間久了檔案佔用會很大的空間,2. 不知道每一個複製的版本究竟修改了什麼,3. 協同合作的時候檔案覆蓋即一去不復返。
上述的問題讓我開始找尋其他的方案來管理程式碼,並且可以與其他人協同合作。幾年前,在 synology 的 NAS 上安裝 SVN Server,開始使用 subversion 做版本管控。SVN 的 Client-Server 架構,在個人使用上倒也還蠻順利,沒出過什麼亂子,直到發生沒有網路就沒有辦法版本更新的事情,才開始注意到分散式版本管控的好處。另外,在 OpenSource 的場合中也常常聽到討論使用 GitHub 作爲 Git Server 的專案,決定來接觸接觸。Git 有下面幾項優點:
在這篇文章中,不討論如何在自己的 Server 上架設 Git Server,會着重在 Linux 中如何把現有的專案加入 GitHub 上。有機會再和大家分享自己架設 Git Server 的經驗 :)
上述的問題讓我開始找尋其他的方案來管理程式碼,並且可以與其他人協同合作。幾年前,在 synology 的 NAS 上安裝 SVN Server,開始使用 subversion 做版本管控。SVN 的 Client-Server 架構,在個人使用上倒也還蠻順利,沒出過什麼亂子,直到發生沒有網路就沒有辦法版本更新的事情,才開始注意到分散式版本管控的好處。另外,在 OpenSource 的場合中也常常聽到討論使用 GitHub 作爲 Git Server 的專案,決定來接觸接觸。Git 有下面幾項優點:
- 便宜的 Branch:Git 對 branch 是對整個資料夾做快照(snapshot)的方式,追蹤的是檔案的內容,即使在不同的 branch 內也只會有一個實體,所以既省空間又比較有效率。
- 聰明的 commit:Git 是與 snapshot 作比對不是單純的使用 diff 來比較 commit 的檔案。
- 分散式管理:Git 本地端有自己的 repository,即使沒有連線的狀態下仍然可以 commit,有網路時再 push 到 server 上就好。
- Repository 毀壞的風險低:分散式的架構在每一份 Client 都會有一份 repository,即使 Server 上的 repository 毀損還是可以由其他的 Client 端恢復。
在這篇文章中,不討論如何在自己的 Server 上架設 Git Server,會着重在 Linux 中如何把現有的專案加入 GitHub 上。有機會再和大家分享自己架設 Git Server 的經驗 :)
- 如果還沒安裝 git,在 uBuntu / Mint 中請輸入
$ sudo apt-get install git-core
在 fedora 中請輸入$ sudo yum install git
- 設定本機的 Git 環境。設定後會產生 ~/.gitconfig
$ git config --global user.name "ninthday"
$ git config --global user.email "your_email@example.com" - 登入 GitHub 帳號,在右上角點選新增一個 repository(Create a new repo)
- 填寫資料建立一個完成新增
- 由於採用 SSH 方式的安全性較高,這裏以 SSH 作爲例子。首先,產生一個 key 給 GitHub 使用
$ ssh-keygen -t rsa -f [filename] (ex: ninthday)
- 將 key 放到 GitHub 裏面,Account settings -> SSH keys -> Add SSH key
$ cat ~/.ssh/ninthday.pub
把 cat 得到的內容填到 key 中
- 設定專門給 GitHub 使用的 key 和 config
$ vim ~/.ssh/config
Host github
HostName github.com
User git
Port 22
identityfile ~/.ssh/ninthday - 測試連線
$ ssh github
The authenticity of host 'github.com (204.232.175.90)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,204.232.175.90' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi ninthday! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed. - 取得 GitHub API Token,「Account settings -> Applications -> Personal API Access Tokens -> Create new token 」,複製 token string
- 本機設定 GitHub token
$ git config --global github.user username
$ git config --global github.token [token string] - 切換到已存在的工作資料夾,輸入初始化指令
$ cd my_test
$ git init
Initialized empty Git repository in /[path]/my_test/.git/ - 將檔案加到 repository 的準備狀態
$ git add *
- 檢查一下目前的追蹤狀態
$ git status
- 送交檔案 commit 並加上說明
$ git commit -m "my first commit"
- 在 GitHub my_test repository page 右側複製 URL。在我的例子中是使用 SSH 連接方式。
- 將 GitHub repository 加入 remote origin
$ git remote add origin github:ninthday/my_test.git
因爲在步驟8中已經設定過連線,所以在這裏把 GitHub 提供的 SSH URL 中的 git@github.com 更換成 github(git@github.com:ninthday/my_test.git -> github:ninthday/my_test.git) - 由 GitHub 上拉下來本機
$ git pull origin master
- 最後將本地端推到 GitHub 上
$ git push origin master
大致會出現類似下面的訊息
Counting objects: 25, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (24/24), 2.21 MiB | 658 KiB/s, done.
Total 24 (delta 4), reused 0 (delta 0)
To github:ninthday/myComputing.git
7696115..b24a89b master -> master
留言