让我们设定场景。假设您是一位网页自由职业者,并且几乎完成了客户的新网站。多年来,您已经从痛苦的经历中学到,不要直接通过 FTP 编辑文件。很容易在没有记录变更和变更者的情况下进行破坏性变更。现在,您正在使用 Git 来管理文件的版本。
为什么要使用版本控制?
使用版本控制系统对您的项目有很多好处。即使您是一个非常有条理的人,您仍然可能会对像 `index-2017-01-12.html` 或 `header_image_final_final_v2.svg` 这样的命名系统感到困惑。它真的是最终版本吗?您如何知道这些版本与上一个版本之间到底有什么不同?
版本控制系统 (VCS,如 Git) 强制在任何给定时间只存在一个版本的您的文件。所有过去的版本的文件都整齐地打包在 VCS 中。当您需要它时,您可以随时请求任何版本,您将拥有该项目的完整快照。
每次您保存项目的新的版本时,您的 VCS 要求您提供对变更的简短描述。此外(如果它是代码/文本文件),您可以准确地查看文件中更改的内容。VCS 帮助您了解您的项目在不同版本之间如何演变。
部署 / 上传
VCS 虽然很有用,但它并不能直接帮助您将文件上传到实时网站。(我们将此称为 *部署*。)
部署文件非常容易。使用 FTP 客户端(例如 Transmit)通过 FTP 或 SFTP 将文件直接上传到您的服务器。网站的初始发布特别容易:只需上传所有文件即可。
当您对网站进行更改时,您还需要上传文件。但是...哪些文件?您还记得您更改了哪些文件吗?如果您的恐慌的客户打电话告诉您网站崩溃了,您知道您上次上传文件时发生了什么变化吗?
如果您正在使用 Git,很容易看到。但仍然,Git 不进行部署,并且手动检查哪些文件已更改以及移动哪些文件容易出错且乏味。您仍然需要一种智能的方法来仅上传和部署已更改的文件。
那么您还有哪些其他选项来部署文件呢?一种选择是在服务器上安装 Git。然后就像您在本地从您的 Git 存储库中推送和拉取一样,您可以从服务器上的该存储库中拉取,并且服务器将拉取最新的更改。不过,这并非适合所有人。它需要对服务器的 shell 访问权限,而许多共享主机解决方案根本没有提供这种访问权限。
另一种可能性是依赖第三方云服务,例如 DeployBot、Springloops 或 Beanstalk。这些选择都不错,但有潜在的缺点。
- 这些服务需要每月或每年付费,无论您是否正在积极使用它们。
- 设置外部 Git 存储库可能需要一些时间,并且可能很复杂。
- 依赖第三方服务也会增加风险。当您想要部署时,部署服务可能无法使用。
- 部署速度取决于该服务。您的部署之前可能还有很长的其他部署队列。
看看 GitFTP-Deploy
让我们看看我的另一种选择:GitFTP-Deploy。GitFTP-Deploy 是一款原生 macOS 应用程序,它只上传自上次部署以来的更改文件(通过 SFTP、FTP 或 FTPS)。您无需记住您更改、添加或删除了哪些文件。
由于 GitFTP-Deploy 从您的本地 Git 存储库中读取发生了哪些更改,因此您也会养成对项目使用 Git 的习惯:一旦文件被提交,它也就可以部署了。
GitFTP-Deploy 的另一个功能可以简化您的部署,即它能够运行部署前和部署后脚本。您是否使用 JavaScript 编译器(如 Babel)或 CSS 预处理器(如 Stylus)?您是否正在连接和压缩资产?可以通过该应用程序自动运行这些任务。
其他时候,只需提交最新的更改,它就会自动推送到服务器上,只需要一个 Git 提交命令就可以完成。
入门
您可以在不到两分钟的时间内开始部署您的文件。
1) 创建一个新网站

2) 指向您的本地存储库并选择要开始部署的提交

3) 设置您的服务器连接

4) 点击部署

也许您的工作流程更复杂?您需要更多功能?
您可以指定要在本地和服务器上运行的脚本,以及在上传前和上传后运行的脚本。例如,在上传之前,您可能需要运行您最喜欢的 JavaScript 编译器或连接和优化生产环境 JavaScript 文件的 Gulp 脚本。
或者,也许您正在使用另一个任务运行器(如 Grunt)的工作流程?Grunt 也可以配置为帮助您优化图像、压缩脚本、编译预处理器以及无数其他操作。

gulp --production
运行任务的能力非常强大。例如,即使 WordPress 也有 WP-CLI,这意味着您可以用脚本编排诸如数据库同步和设置更新之类的事情,并将其与您的部署一起执行。
其他使用说明
如果您不希望将构建文件置于版本控制之下,可以将此文件夹添加到“始终上传”中。

使用 GitFTP–Deploy 并不意味着您不能使用 GitHub 或其他第三方托管 Git 存储库服务。只需确保在部署之前从那里拉取更改即可。

团队使用
虽然 GitFTP–Deploy 不是专门为团队构建的,但你仍然可以使用它。最简单的方法是让一个人来处理部署。另一个更高级的选项是在服务器上运行 GitFTP-Deploy。
这种方式可能不适合大型团队,因为提交来自许多不同的个人。但是,GitFTP-Deploy 将尝试检查哪个分支和提交是上次部署的。
这看起来很酷,比云解决方案更好(我当然同意你所有的缺点)。
它会是 Mac 独占的吗,还是你计划推出 PC 版本?
谢谢
嗨,Nour!感谢你的评论!抱歉,目前没有计划推出 Windows 版本。
我差点就买这个了,但后来我发现它不支持子模块,这对我们的项目至关重要。我们目前使用 DeployHQ,它很不错,因为它很集中,但我喜欢 GitFTP-Deploy 的上传编译后的资产目录的能力,这样你就可以将它从源代码控制中排除。
嗨,Dalton!很抱歉听到这个消息,我研究过实现子模块,但几乎没有收到用户的请求。如果我收到更多请求,我一定会着手研究。
这看起来是一个非常有用的应用程序,价格也很合理。很多应用程序都提供每月订阅,价格更高。
对于那些不使用 Mac 的人来说,有没有 Windows 版本?是否有计划创建一个类似的东西?或者你能推荐一些提供类似服务的替代方案吗?
嗨,Adrian!抱歉,目前没有计划推出 Windows 版本。/ Jan
也许我错过了,但你能不能将源文件目录从上传中排除?我看到你可以指定构建文件,但我没有看到如何在上传仓库时忽略源文件。
嗨,Gurnzbot!除非你添加,否则你 .gitignore 中指定的文件不会被上传。你是说你想禁用上传提交到仓库的某些文件吗?
是的,是后者。
如果我有一个包含所有源文件(未压缩的 js、sass 等)的“src”路径和一个包含所有压缩和构建文件的“dist”路径,有没有办法通知 GitFTP-Deploy 不要上传“src”目录?
我想要把它放在我的仓库里,因为它包含所有我的实际源代码。
另一方面,我可能会在我的 .gitignore 文件中包含“build”目录。但是,我希望它上传到服务器,因为它包含我的应用程序将使用的文件。
也许我对事情的工作原理有所误解!:)
查看更新。我刚刚发布了 2.1.0,你可以在其中忽略文件。:-)
很棒的文章,还值得注意的是,你可以通过 BitBucket 使用他们相对较新的“管道”功能来设置类似的东西,而且全部都在免费计划内!
我已经在一个个人项目上设置了它,但我还没有完全研究过任何基于成本的限制,不过到目前为止还没有发现任何问题!
嗨,Laurence!感谢你的评论!你说得对,你可以使用其他服务来做到这一点。
我认为 BitBucket Pipeline 的目标群体与 GitFTP-Deploy 不同。我认为 BitBucket Pipeline 更像是一个持续集成平台,而 Pipelines 并没有进行简单的 FTP,例如。此外,设置 Pipelines 更加复杂,你还必须喜欢 YAML。你还要将你的仓库存储在 BitBucket 上(出于显而易见的原因)。
你将依靠外部服务器进行推送。而且有推送的速率限制(但对于较小的项目来说,你不太可能遇到这些限制)。
(BitBucket 也暗示 Pipelines 将在未来成为付费功能,即使现在是免费的)。
此致
/ Jan
在将来,是否可以将“在 _推送_ 时自动部署”作为一种选择?
我不认为我想在每次提交时都部署。
实际上,这倒是个不错的主意……
+1 支持这个功能
现在有一个包含此功能的 beta 版本。如果你想试用它,请告诉我(https://eastwest.se/support)。希望它将在下一个星期发布。