gpt4 book ai didi

git pull 检查文件是否改变 bash

转载 作者:太空狗 更新时间:2023-10-29 13:38:22 31 4
gpt4 key购买 nike

我在 cronjob 中运行以下 bash 脚本来更新我的网站

#!/bin/bash

cd /home/username/public_html
git pull origin master

这个 cronjob 每 5 分钟运行一次,所以如果我提交更改为 git repo,它会被 pull 到实时网站。

我想做的是,每次运行此脚本时,检查特定文件是否已更改,如果文件已更改,则运行 curl/wget 命令。

我需要跟踪更改的文件是 style.css 和 script.js

我正在做的是,如果这些文件被更改,更新我的网站模板中脚本的修订号,以便清除缓存并加载最新更改的 css 和 js 文件。

<link href="/css/style.css?REVISION_NUMBER_HERE" rel="stylesheet" type="text/css">

我可以通过 curl 请求轻松增加 JS/CSS 修订号,因为它存储在 mysql 数据库中。

这是一个示例 git pull 结果,所以我们可以在结果中 grep 查找那个 style.css/script.js

 * branch            master     -> FETCH_HEAD
Updating cbd0d46..36aeed6
Fast-forward
admin/cf.php | 16 ++++++++++++++++
css/style.css | 47 +++++++++++++++++++++++++++--------------------
include/common.php | 1 +
templates/header.tpl | 4 ++--
templates/index.tpl | 13 ++++++-------
5 files changed, 52 insertions(+), 29 deletions(-)

编辑

感谢@torek 的回复。

我需要更多有关 BASH 脚本的帮助,现在这是我的测试 git 命令。

[root@server70 public_html]# git diff --name-only 8613bd3ed718b27ca680bdf33e0a4b32b0f58b8c HEAD | egrep '.css|.js|.tpl'
css/style.css
templates/header.tpl
templates/index.tpl
templates/user/delete.tpl
[root@server70 public_html]#

我将硬编码的 git 版本号用于测试。我的 bash 脚本

[root@server70 public_html]# sh 1.sh
File changed css/style.css
File changed templates/header.tpl
File changed templates/index.tpl
File changed templates/user/delete.tpl
[root@server70 public_html]# cat 1.sh
#!/bin/bash


CSS_JS_CHANGED=0

git diff --name-only 8613bd3ed718b27ca680bdf33e0a4b32b0f58b8c HEAD | egrep '.css|.js|.tpl' |
while read name; do
CSS_JS_CHANGED=1
echo "File changed $name"
done

if [ "$CSS_JS_CHANGED" = "1" ]; then
echo expression evaluated as true
fi

[root@server70 public_html]#

如果我在里面运行我的脚本,如果多个文件发生更改,它会执行多次。每次更改我只需要运行我的脚本一次。

所以我需要设置一个变量 CSS_JS_CHANGED,将其值设置为 0。然后,如果检测到文件更改,则将其值设置为 1。如果 CSS_JS_CHANGED 的值为 1,则运行我的脚本。

但出于某种原因,我无法在 while 循环中将 CSS_JS_CHANGED 的值设置为 1。与变量范围有关吗?

** 编辑 2 **

我发现为什么我不能从 while 循环内部设置变量 here

作为一个 bash 菜鸟,有人可以让我的脚本工作吗:)

编辑 3

使用 CSS_JS_CHANGED 变量让它工作。

[root@server70 public_html]# cat update
#!/bin/bash
# */5 * * * * /home/USERNAME/public_html/update >/dev/null 2>&1


cd /home/USERNAME/public_html
OLD_HEAD=$(git rev-parse HEAD)
git pull origin master
NEW_HEAD=$(git rev-parse HEAD)

[ $OLD_HEAD = $NEW_HEAD ] && exit 0

git diff --name-only $OLD_HEAD $NEW_HEAD | egrep '.css|.js' |
while read name; do
touch /tmp/css_js_update
done

if [ -f "/tmp/css_js_update" ]
then
/usr/bin/curl 'http://mywebsite.com/admin/cf.php?js_version_update=mywebsite'
rm -f /tmp/css_js_update
fi
[root@server70 public_html]#

现在等待 .css/.js 文件提交 :)

再次感谢@torek

最佳答案

任何时候你做这种事情时你都应该问:“改变了什么?”

如果您要将内容部署到 Web 服务器,大概您的意思是“从服务器读取的版本更改”。在这种情况下,首先保存有关服务器读取的版本的一些信息,例如“内容”,或者在 git 的情况下,这很容易——服务器读取的版本的唯一标识符。

看起来您正在直接在服务器上执行 git pull(这有一些缺点,但让我们继续运行吧)。与其尝试解释 git merge 输出,捕获一些 SHA-1 值似乎更简单。例如,您可以获取您感兴趣的两个文件 blob:

OLD_STYLE_ID=$(git rev-parse HEAD:css/style.css)
OLD_SCRIPT_ID=$(git rev-parse HEAD:script.js) # fix path here if/as needed

之后,您可以执行获取并 merge/pull 操作,然后获取新的 SHA-1:

git pull origin master
NEW_STYLE_ID=$(git rev-parse HEAD:css/style.css)
NEW_SCRIPT_ID=$(git rev-parse HEAD:script.js) # again, fix path if needed

现在,如果新 ID 与旧 ID 匹配,则这些文件不变;任何不匹配的 ID 都表示这些文件发生了变化。

或者,保存新旧 HEAD 值的 ID,如果这些值发生变化,则对有趣的路径执行一些操作,例如:

OLD_HEAD=$(git rev-parse HEAD)
git pull origin master
NEW_HEAD=$(git rev-parse HEAD)
[ $OLD_HEAD = $NEW_HEAD ] && exit 0 # no change to repo = no change to any files

此时有多种选择,例如:

git diff --name-only ${OLD_HEAD} ${NEW_HEAD} -- css/style.css script.js |
while read name; do
...
done

或者简单地检查 git diff --name-only,仅限于那些路径(如上所述),是否打印任何东西。

关于git pull 检查文件是否改变 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703653/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com