有鑑於 ftp server 在沒有 CI 的輔助下,常常在開發專案的時候不小心覆蓋到對方也正在處裡的檔案,如果本身有另外用 git 做版控還可以挽救,但若還加上正式與測試的 ftp server,一覆蓋到重要檔案,沒有 CI 的情況下或遇到豬隊友真的是欲哭無淚吶QQ
推薦適用狀況:
- server 沒有 shell 可用,只有 ftp deploy 這條路
- 上線中的 server 沒有 shell 也沒有 CI 可以確保手動 deploy 的檔案後會正常運作
- 常常跟隊友互蓋檔案蓋到天荒地老,而大家剛好會些 git
- 常常不小心蓋歪正式與測試 server 的檔案
本文將介紹 git-ftp 這套件來管理你 ftp 上的專案, 而當然專案必須先有 git 版控的狀況下才能使用 git-ftp 囉。
git-ftp 的 github 網址
https://github.com/git-ftp/git-ftp
安裝
osx/unix/windows 的安裝文件
https://github.com/git-ftp/git-ftp/blob/master/INSTALL.md
筆者作業系統是 windows,以下只介紹 windows 版本的安裝啦。
它能用 cygwin 或 msysgit 的 curl 來安裝本套件,而 msysgit 是基於 mintty 的一款 console,所以我想 mintty 應該也是可以安裝的,或 babun console 也行。
在你的 console 當中輸入以下指令:
$ curl https://raw.githubusercontent.com/git-ftp/git-ftp/develop/git-ftp > /bin/git-ftp
$ chmod +x /bin/git-ftpnote:
"/bin/" 通常是放讀取指令的位置,而在 msysgit 中的 "/bin/" 相等於 "C:\Program Files\Git\usr\bin\"
安裝後檢查一下有沒有裝成功。
$ git-ftp -h
初始化
假設這次 ftp 專案資訊如下:
- url: ftp://127.0.0.1/project/dowob
- account: dev
- password:1234
首先初始化讓 git-ftp 檢查 ftp commit 是否存在,同步的檔案有哪些:
$ git ftp init -u dev -p 1234 ftp://127.0.0.1/dowobnote:
-u: user
-p: password
注意這邊指令不是 git-ftp 唷!
如果沒有找到 ftp 上的 .git-ftp.log 就會顯示以下訊息,並開始上傳檔案:
fatal: Commit found, use ‘git ftp push’ to sync. Exiting…
如果原本就有 .git-ftp.log 不想同步檔案的話,可以加上 -D ( — dry-run) 選項,不做任何 upload 或 delete,只檢查 .git-ftp.log :
$ git ftp init -D -u dev -p 1234 ftp://127.0.0.1/dowob
但最後 ftp 上 commit 還是對不起來的話,往後再 push 時還是會要求你全部同步檔案唷!
設定 ftp config
為了不要每次 push 到 ftp 都要輸入帳密與網址,所以初始化完就要來把剛剛的資訊加入至 .gitconfig 中:
$ git config git-ftp.url ftp://127.0.0.1/project/dowob
在 .gitconfig 就會多出如下 git-ftp 的設定資訊,可以用 git config -e 來查看。
[git-ftp]
url = ftp://127.0.0.1/project/dowob
接著再加上其他資訊設定:
- account & password
$ git config git-ftp.user dev
$ git config git-ftp.password 1234
- 指定本地端要上傳的資料夾
$ git config git-ftp.syncroot ./dowob/assets
最後 .gitconfig 就會變成如下:
[git-ftp]
url = ftp://127.0.0.1/project/dowob
user = dev
password = 1234
syncroot = ./dowob/assets
下一步就可以 push 到 ftp 了。
$ git ftp pushnote:
- git push 跟 git ftp push 是不一樣的唷!
前者僅是 push 到 git server,後者是 push 到 ftp server
- 如果跑完 buffer 後發現 upload 超級久的話,有可能是上傳 url不對
這樣最基本的 git-ftp 功能與設定就完成啦,接下來會針對不同 ftp push 檔案介紹使用與分享使用的小技巧。
設定 scope ftp config
由於會遇到要 push 到多個 ftp 上的情況,譬如:master branch 要 push 到 A ftp,而 develop branch 要 push 到 B ftp,就會非常需要 scope 這功能。
在原本剛剛設定 config 的步驟加上 scope 名稱,
$ git config git-ftp[.scope].url ftp://127.0.0.1/
例如:
$ git config git-ftp.develop.url ftp://127.0.0.1/project/dowob
照先前的步驟實作後 config 會長這樣:
[git-ftp “develop”]
user = dev
password = 1234
syncroot = ./dowob/assets
url = ftp://127.0.0.1/project/dowob
最後執行 push 時加上- s 選項,就會指定用剛剛建立的 develop scope ,依據設定上傳到 ftp,
$ git ftp push -s develop
不過這樣每次建立一個 ftp 資訊就要一直輸入指令太麻煩了,接著分享使用之後筆者認為推薦的做法 :)
推薦做法
直接在 .gitconfig 中寫好設定,直接使用設定檔去做初始化。
- 打開 .gitconfig (或直接到 .git 資料夾下修改此檔案)
$ git config -e
- 在 .gitconfig 尾端新增以下 snippet:
[git-ftp “develop”]
user = dev
password = 1234
url = ftp://127.0.0.1/project/
[git-ftp “master”]
user = official
password = 5678
url = ftp://127.0.0.2/htdocs/
接者初始化 scope 與 push。
$ git ftp init -s [scope]
$ git ftp push -s [scope]
如此一來就可在不同 branch 選擇要 push 到哪個 server 囉!
嫌 git ftp push -s [scope] 這串太長的話,可以再設定 git alias 讓指令短一點啦,畢竟上傳 code 一次要輸入 git push 跟 git ftp push 有點多啊~
最後筆者認為 git-ftp 雖然多一道指令多一道工,不過好處是它可以利用 git 版控的功能,根據 commit 做環原,從 git 還原 commit 後再 push 就可以了,不需仰賴工人智慧,一有大功能要更新就是很多檔案,還要去追蹤 commit 看哪個檔案有更新再丟到 ftp,也不用擔心 ftp remote 同步會亂傳檔案上去,也同時確保在 ftp 上的檔案版本都是雙方可以從 git pull 抓到,並事先做 git rebase,檢查有無 conflit,非常適合搭配被分為這兩種的開發模式:本地端是自己的開發與 debug 的環境,ftp server 是可運行版本的開發環境,解決蓋歪別人檔案的狀況。
另外一點算是 git-ftp 彈性的地方,有好有壞,它是透過 .git-ftp.log 中的 commit sha1 來判定目前 ftp 跟本地端 head commit sha1 的差異來做更新,所以如果不在版控範圍或你自己偷偷覆蓋某些檔案,其實 git-ftp 也不會發現,它只會依據 commit 的紀錄做檔案更新,不會整個 ftp folder 被做版控,再加上 .git-ftp-ignore 能忽略 push 的檔案類型,彈性蠻大的,但壞處是當你今天只有 push 到 ftp 而沒有到 git server,那夥伴 push 到 ftp 時就會讓 git-ftp 找不到你 commit sha1 的狀況而不給 push 或被要求全部同步一次。
現在就變成偶爾會遇到找不到 sha1 commit 的狀況,忘記 push 到 git server 上,不過比起來把線上的重要程式碼蓋掉這件事,git-ftp 實在棒極了!