使用 git-ftp 将 git 两次提交发生变化的文件上传到服务器

更新日期: 2016-12-02 阅读次数: 8047 分类: Git

首先公网使用 FTP 部署程序是非常不科学的一种方式

  • FTP 这种协议本身不安全
  • 服务器上的代码不方便回滚
  • 只适合 PHP 这种不需要重启的服务

但是没有办法,客户只给开放了 FTP 权限。我实在懒得说服对方。

使用 FileZilla 手动一个一个上传代码文件是一件让人崩溃的事情

  • 如果一次特性发布涉及的文件过多,超过10个。一是容易遗漏文件,二是文件分布于多个目录,点击查找目录异常耗时
  • 多个文件存在依赖关系时,如果手慢,发布了其中一个文件,但是其他文件在10秒钟之后才上传,那么用户就遭殃了,只能在这10秒钟内笑看错误页面

所以,自动化部署是必然的选择。原本打算自己写一个 shell 脚本来实现,后来发现需要考虑的情况还真不少,就在同事的推荐下尝试了 git-ftp

本地测试了一下非常靠谱。具体的使用流程

首先需要配置远端服务器 FTP 的参数, 打开项目根目录下的 .git/config, 添加

[git-ftp]
	url = ftp://x.x.x.x/public_html
	user = sunzhongwei
	password = ftp_password

注意,public_html 为对应的远端代码根目录,如果不指定的话,可能会在 catchup 时报错

fatal: Could not upload file: '.git-ftp.log'., exiting...
fatal: Could not upload., exiting...

假设上次发布到 ftp 上的代码版本对应的 git tag 为 v5.50, 那么在对应的修改提交之后,给当前版本打上新 tag。

git tag v5.51

然后,将代码 checkout 到上一个版本

git checkout v5.50
git ftp catchup    // 第一次使用 git-ftp 时需要使用,之后就不需要了

catchup 的作用是,标记上次更新到了哪次 commit。实现的原理是将本地 git HEAD 对应的 commit HASH 写入远端服务器 ftp 同步目录的 .git-ftp.log 文件。这样就可以在任意开发机上进行 git ftp push 操作了。

然后执行

git ftp push

实际上就是将

git diff v5.50 v5.51 --stat --name-only 

的输出文件列表上传到了 ftp 上,同时将远端的 .git-ftp.log 中的提交记录更新。非常方便。

排查问题的小技巧

如果 catchup 失败,从默认给出的错误信息根本定位不了问题,或者说是 debug 信息就是错误的。可以在所有命令后面加上 -vv 来查看具体的 debug 信息, 例如

git ftp catchup -vv

-vv 的说明

-vv Be as verbose as possible. Useful for debug information.

谈笑风生

cl

上ci

milo

请问如何在ftp端设置.git-ftp.log,我现在只能本地往服务器提交, 不知道怎么拉取ftp上的代码下来,比如我换个电脑的情况

大象腿

我多台电脑间是靠 Git 管理同步代码

爱评论不评论

近期节日

2019年07月23日 大暑
2019年07月30日 非洲妇女日
2019年08月01日 八一建军节
2019年08月06日 国际电影节
2019年08月07日 七夕
2019年08月08日 立秋
2019年08月15日 日本投降日
2019年08月15日 中元节
2019年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
查看更多节日