在SSH中使用Git来提取特定目录

时间:2017-11-13 19:17:03

标签: wordpress git ssh

总体新手问题但是在使用SSH和Git时最好的做法是什么?我正在开发一个WordPress项目。在根目录中我有gulp和其他开发文件/文件夹,如SASS和Scripts,我不需要在服务器和同一项目中,我有我的WordPress文件夹,其中包含一个主题和一些自定义插件。正如您可以想象的那样,当主题或任何插件准备好部署时,我不想将服务器上的所有内容都拉出来。至于一个新手,我总是只拉动并推动整个存储库并使用FTP将我需要的内容上传到服务器,那么如何使用SSH和Git完成这项工作是否有更好的方法进行设置?

编辑:为了让我的问题更加明确,让我举一个例子,说明我认为我的问题是什么。在我的主项目文件夹中,我的WordPress文件夹旁边有一个SASS文件夹。我真正需要部署到服务器的是WordPress文件夹。我的开发机器上发生的构建过程将所有SASS文件组合成一个CSS,然后放入WordPress文件夹。我需要Git跟踪SASS文件夹,以便任何其他开发人员可以拉动它们并继续开发,所以我不能让git忽略它。但是,这些SASS文件都不需要在服务器上供WordPress工作。我只需要部署WordPress文件夹及其中的所有内容。

我理解在服务器上创建裸存储库并使用post-receive hook指向位于Web根目录之外的git文件夹以指向Web根目录的想法。但这基本上就是GIT和SSH如何运作,而这并没有回答我的担忧。

5 个答案:

答案 0 :(得分:5)

不是Git

Git不是专门用于提取特定文件或目录的。它是一个有向的非循环图,其中二进制blob作为对象,有时多个对象被压缩成一个更大的对象。

由于Git设计,您无法提出具体要求。

替代

收到后挂钩

如果您的网站只包含简单的静态文件,那么可以通过SSH推送到git存储库。实际上,只要您没有非文本文件,您的存储库就不可能很大。

以下面的设置为例。

  • /var/lib/www - apache web dir,是www.git的克隆副本
  • /var/lib/www.git - 一个简单的git存储库。
  • /var/lib/www.git/hooks/post-recieve - 服务器端git挂钩。它可以是一个shell脚本,可以在更新此存储库时提取www存储库。

示例post-recieve钩子脚本:

#!/bin/bash
cd /home/sam/sandbox/git-hooks/www
unset GIT_DIR
git fetch origin master
git reset --hard origin/master

在tar.gz中压缩构建

在构建结束时,您可以在tar.gz中压缩文件。这个文件应该托管在某个地方(如果你使用的是GitHub,可能会发布GitHub)。有些企业使用像Nexus或Artifactory这样的本地工件托管。

这个想法是:你有一个具有特定sha256sum的测试工件。您测试的工件是完全相同的工件,最终会投入生产。

深入了解诸如持续集成,持续交付和软件开发生命周期等更多细节可能超出了您的问题范围。

答案 1 :(得分:5)

没有最佳做法。

Git用于源代码管理,而不是用于部署。没有最佳实践以这种方式使用git,因为git不是部署工具。您也不需要在服务器上使用git历史记录。事实上,除非您坚持使用它进行部署,否则您根本不需要git。欢迎您以这种方式使用它,但由于您正在询问的问题,它并不理想。

最佳做法是什么?

您可以使用许多工具来处理部署。大多数工具通常允许您设置一系列步骤,以便将所需的代码部署到所需的环境中。您可以使用PHP世界中的Phing或Deployer等简单工具,或者如果您有更复杂的需求,可以使用像Puppet或Chef这样的更复杂的工具。如果您需要的东西非常简单,您可以编写自己的bash脚本。鉴于您提供的信息,我建议您使用Phing或Deployer。 https://deployer.org/ https://www.phing.info/

您只需将您想要的任何工具配置到目标框中,然后仅将您想要的文件复制到服务器上所需的目录中,无论您希望采用何种方式要做到这一点。通常,您将脚本副本文件复制到临时目录中,然后将它们压缩,将它们ssh过来并解压缩它们。之后,您通常会在服务器上做一些额外的工作来移动文件,更改符号链接,以及您可能需要做的任何事情。

如何编译SASS,ES6 js文件或现代静态内容?

您需要做的就是添加处理静态文件的步骤以及您希望它们到达的位置。当你推送东西时,在你的tarball中包含生成的静态文件,并在你解压缩后将它们放在服务器的正确目录中。

当您配置SASS编译器以及您可能具有的任何其他预编译静态代码时 - 您将其配置为创建目标文件。也就是说,它们生成的实际CSS和JS的文件。这就是你需要携带的所有内容 - 如果你的目标目录设置在你的wordpress主题中,你可能甚至不必特别注意它的处理。一旦它们在服务器上,您可能需要将它们移动到其他位置,但这一切都取决于服务器中的特定设置,我认为这超出了本问题的范围。

附加说明:

你没有提出这个问题,但我认为值得一提的是,每次更新时你都不应该发送整个wordpress存储库。就像您不需要未编译的SASS代码一样,您也不需要重新打包核心WordPress。你甚至不需要提交核心WordPress,它是一个依赖,你不需要改变它。

您应该提交的所有内容都是您的主题和插件代码以及未编译的静态文件。编译的静态文件和外部依赖项(如WordPress核心)不属于您的git历史记录。出于部署目的,应该已经安装了WordPress。你的tarball中的东西应该只是插件和主题,以及其他静态文件,如果由于某种原因它们已经不存在了。

TLDR;

不要使用git。使用像Phing或Deployer这样的工具。将静态文件构建到您的主题中,并创建phing / deployer脚本,只编写您想要的代码,将SSH连接到您的服务器,然后将其解压缩到您想要的目录中。如果服务器上有一些特殊的静态文件位置,请确保在脚本中添加步骤。

答案 2 :(得分:4)

因此,根据您的问题和评论,涉及三台计算机。有一个Web服务器(当您说“服务器”时,我将其视为此方案中的Web服务器,或运行Web服务器程序的服务器计算机)。还有另一台托管git仓库的服务器。而且,有你的开发工作站。这是对的吗?

好像,你的Web服务器上有一个克隆的git repo。您当前的练习/工作流程似乎是(1)(基于您的表达“SSH到我的服务器”)您从工作站通过SSH(就像Telnet)登录Web服务器(SSH只是一个协议,它可以用于不同的目的)。 (2)您从托管服务(例如,github)上撤回您的仓库,以及(3)将其部署到同一服务器上的“www”目录中。这是对的吗?

(我可以根据您对“FTP”等词的使用来考虑替代方案,但现在让我们关注上述情况。)

现在,您的问题是,无论何时“拉”(在您的Web服务器上),您都觉得自己正在从托管服务上的回购中提取所有内容。并且,有更好的方法吗?我能正确理解你的问题吗?

如果是这样,正如另一位评论者所建议的那样,git(以及任何版本控制系统)一般都非常擅长获取“增量”。如果你每次拉动时都担心“抓取所有东西”(上面的步骤(2)),那么你的担心是没有根据的。

现在,问题是,为什么你的Web服务器上有一个git repo,如果确实如此呢?这是一个非常合法的设置,我之前已经做过(例如,在EC2上)。但是,作为最佳实践,人们通常不会在“生产”服务器上这样做。这是因为你必须“构建”你的网络应用程序,而你真的不想在生产服务器上这样做。

接下来的问题是,你在步骤(3)中到底做了什么?构建过程(您使用的任何过程)通常会生成一个“输出”,可以直接部署到Web服务器。 (约定是输出通常是单个文件夹,“公共”,“www”,“dist”或其他,或单个文件(例如,tar.gz,zip,jar,war)等。)无论是无论是在dev工作站(或构建机器)上还是在Web服务器上构建可部署的输出,在这种情况下通常都不会执行“增量”。即使您只更改了单个文件(例如,CSS文件),通常也会再次构建整个输出(而不是仅仅替换已更改的CSS文件)。当您使用FTP上传文件等时,您可以有选择地上传某些文件和/或目录等,但作为一般做法,我们不这样做。我们总是从头开始构建完整的输出并将其部署到Web服务器。 (这主要是为了减少潜在的部署错误并提高可靠性。)

因此,要回答您的问题,(A)如果您在Web服务器上提取git repo,您​​应该真正改变这种做法,并将构建过程移动到您的开发计算机或专用构建计算机。 (BTW,github,gitlab,TFS等服务为您提供构建服务。)(B)如果您目前有选择地将您的Web应用程序文件FTP到您的Web服务器,那么您应该考虑采用某种方式正式构建和部署,过程向前发展。

答案 3 :(得分:1)

完成SASS构建过程后,使用scprsync将文件移动到prod服务器:

scp -r /[local wordpress dir]/wp-content/themes/your-theme/ username@your.prod.server.com:/path/to/dir/wordpress/wp-content/themes/

scp -r /[local wordpress dir]/wp-content/plugins/* username@your.prod.server.com:/path/to/dir/wordpress/wp-content/plugins/

答案 4 :(得分:0)

I am working in a project and using git ssh with bitbucket following is the process i am using it may work for you also if not please correct me :

Step 1 ->I have setup git and create repo in bit-bucket.
Step 2 ->And setup project with my local and linked with my repo.
Step 3 ->connect my server using ssh.
Step 4 ->Work in my local and commit and push all changes in my git repo.
Step 5 ->Run git pull on ssh so all changes deployed in my server.

I am using above process and i love this process.i have used .gitignore  file that is not required for push on my repo.

Thanks