首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在最近的提交中,检测文件或目录是否已更改的可靠方法是什么?

在最近的提交中,检测文件或目录是否已更改的可靠方法是什么?
EN

Stack Overflow用户
提问于 2017-07-04 19:12:44
回答 2查看 833关注 0票数 1

我有一个web项目,我简单地通过推动新提交将其部署到一个ec2实例中。我使用post-recieve git钩子远程执行一个shell脚本,该脚本通过将项目签出到生产目录中来“部署”项目。步骤是,在快速应用程序上运行npm install,在前端运行npm install ( create-react-app应用程序),然后运行npm run build (基本上使用web-pack从我的节点源代码构建一个优化的分发文件夹)。

这些步骤很昂贵,在许多情况下不需要。例如,如果我所做的只是更新srcs/components/中的Node组件,那么npm run build应该运行,但是服务器和前端上的npm install不应该运行。如果我所做的只是在我的快递应用程序中添加了一个注释,那么就不应该运行脚本。

我当前的服务器端部署脚本如下所示:

代码语言:javascript
复制
#!/usr/bin/env bash

GIT_WORK_TREE=/home/ec2-user/absiteProd git checkout -f

### TODO: conditional NPM work

pm2 restart index

我的问题是如何使用git (或grep、sed、awk等)要可靠地告诉我‘home/ec2-user/absiteProd/前端/sources`’中的/home/ec2-user/absiteProd/frontend/package.json/home/ec2-user/absiteProd/server/package.json或任何东西何时发生了变化?

目前我在以下方面取得了一些成功:

代码语言:javascript
复制
if `git log --stat -n 1` | grep --quite frontend/src/* ; then
   cd home/ec2-user/frontend
   npm run build
fi

但是,由于这似乎是应用程序部署中的一个常见需求,我觉得必须有一个更简单的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-04 19:22:54

您可以在这条线中找到类似的需求

如何找到存储库中给定目录的最后提交? 如果自上一次构建以来项目中没有任何更改,我希望避免重新构建项目的特定部分,因此我需要找到上次更改目录时的sha。

可以使用git rev-list比较修改元素的最后一次提交

代码语言:javascript
复制
git rev-list -1 HEAD -- frontend/package.json
git rev-list -1 HEAD -- absiteProd/server/package.json
git rev-list -1 HEAD -- frontend/src

对于当前头SHA1 (git rev-parse--verify是可选的):

代码语言:javascript
复制
git rev-parse --verify HEAD

这就是:

代码语言:javascript
复制
h=$(git rev-parse --verify HEAD)
b=false
if [[ "$(git rev-list -1 HEAD -- frontend/package.json)" == "${h}" ]]; then b=true; fi
if [[ "$(git rev-list -1 HEAD -- frontend/package.json)" == "${h}" ]]; then b=true; fi
if [[ "$(git rev-list -1 HEAD -- frontend/package.json)" == "${h}" ]]; then b=true; fi
if !b; then exit 0; fi
cd home/ec2-user/frontend
npm run build
票数 1
EN

Stack Overflow用户

发布于 2017-07-04 19:28:58

Git不以任何有用的方式存储目录,因此您必须自己定义“任何东西”(这有其优点,因为您可以定义您的意思,而不是停留在其他人对您的无用定义,但意味着您必须做更多的工作)。

也就是说,Git将每个文件作为路径名存储在每个提交中。您的部署脚本需要一些工作树--在本例中,/home/ec2-user/absiteProd-from从一个状态到另一个状态。由于它使用git checkout这样做,而且git checkout在时间戳方面没有什么特别之处,所以现在您可以使用许多不同的低级别细节和后续后果的选项。以下是两个显而易见且相当简单的起点:

  • /home/ec2-user/absiteProd与以前的提交完全相同吗?如果是的话,是哪一种?(提交具有唯一的散列in,这些通常是脚本中要使用的内容。)然后,您可以让Git将以前的提交与新的提交进行比较,例如使用git diff --name-status。这和你现在所做的很相似,但更好。 如果您的部署脚本是一个后接收脚本,那么您已经有了引用的旧的和新的散列ID,这是从标准输入中读取的。因此,在这两次提交之间更改的文件集及其状态是: git diff-tree -r --名称- $oldhash $newhash
  • 如果git checkout在任何文件上写入,这些文件将以"now“作为修改时间戳,因为git checkout只允许系统的时间应用于更新的文件。你能用这个吗?只要在一秒钟内部署不超过两次,就可以将其与基于时间戳构建文件的make构建系统结合起来。

如果make适合这里,它可能是最好的选择,除了它最大的每秒一次部署(或者你的底层操作系统对文件的时间戳解析有什么)。您只需声明,无论输出文件是/are,它们都依赖于相应的输入文件,并给出了从输入构建输出并运行make的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44912779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档