How to use git-ftp: 使用 git-ftp 管理你的 FTP

awonwon
awonwon
Jan 18, 2017 · 8 min read

有鑑於 ftp server 在沒有 CI 的輔助下,常常在開發專案的時候不小心覆蓋到對方也正在處裡的檔案,如果本身有另外用 git 做版控還可以挽救,但若還加上正式與測試的 ftp server,一覆蓋到重要檔案,沒有 CI 的情況下或遇到豬隊友真的是欲哭無淚吶QQ

推薦適用狀況:

  • server 沒有 shell 可用,只有 ftp deploy 這條路

本文將介紹 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-ftp
note:
"/bin/" 通常是放讀取指令的位置,而在 msysgit 中的 "/bin/" 相等於 "C:\Program Files\Git\usr\bin\"

安裝後檢查一下有沒有裝成功。

$ git-ftp -h

初始化

假設這次 ftp 專案資訊如下:

  • url: ftp://127.0.0.1/project/dowob

首先初始化讓 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 實在棒極了!


浦島太郎的水族缸

定時存點養分到水族缸裡

awonwon

Written by

awonwon

work at 25sprout, a backend-end developer of SurveyCake. http://fb.me/pudotaro.aquarium

浦島太郎的水族缸

定時存點養分到水族缸裡