我需要获得自上次部署以来更改的文件列表(gitdiff),对这些文件进行gzip处理,并将这些文件发送到S3。我需要得到所有的css文件和gzip文件,然后我需要获得所有的html文件,gzip文件以及所有的JS文件和gzip文件。仅当它们自上次提交后发生更改时。
我可以很容易地从上次部署中获得提交哈希。我还有来自当前部署的提交哈希。
这是我的代码,gzip所有的css文件。我想将此代码修改为仅gzip所有更改的css文件
find . -iname '*.css' -exec gzip -9 {} ; -exec mv {}.gz {} ;
以下是我必须aws同步所有html文件的示例代码(我对css、js和html文件有单独的aws同步命令,因为我需要不同的内容类型以及它们的内容编码和缓存参数)。我想修改此代码,使其仅aws同步更改的html文件
aws s3 sync . s3://test --content-type "text/html" --cache-control "max-age=31536000" --exclude "*" --include "*.html"
如何将此代码与gitdiff绑定?只对已更改的文件进行gzip?并且只让aws同步已更改的文件(gitdiff返回的文件列表中的文件)?
此外,我想将gitdiff返回的一些文件复制到一个单独的目录中。例如,需要将images/文件夹中的所有文件复制到StaticAssets/目录中。如何获取图像文件夹中已更改的文件列表,并将其复制到单独的文件夹?
我想用bash来做这件事。
所以我知道我可以使用git diff --name-only
命令。我的问题是,如何在bash中使用该命令来执行以下操作:
- Gzip所有更改的css文件,Gzip所有更改的js文件,Gzip所有单独更改的html文件(注意css文件可能在另一个目录中的目录中)。我需要检索父目录中的所有css文件。因此,如果父目录有文件夹test,而该文件夹有另一个名为test1的文件夹,其中有一个名称为test.css的css文件,我需要能够对该css文件进行gzip处理,即使它的2个目录已关闭
- AWS同步所有更改的js文件,AWS单独同步所有更改的css文件
- 将已更改并且位于图像/文件夹中的文件复制到另一个目录
Gzip所有更改的css文件,Gzip所有修改的js文件,Gzip所有单独更改的html文件
获取已更改文件列表的基本方法是git diff --name-only
。
您可以过滤该列表以仅获得具有grep '.css$' -
的CSS文件。-
表示从STDIN读取,而不是从文件读取。
您可以使用xargs
将该列表gzip
从STDIN转换为参数列表。请确保使用gzip -k
以避免删除原始文件。
git diff --name-only <revision> | grep '.css$' - | xargs gzip -k
对每个文件扩展名重复此操作。
同步所有更改后的js文件,单独同步所有更改过的css文件。
将适当的--include
过滤器传递到aws s3 sync
中。对于CSS,它是*.css.gz
。
您可能需要使用git clean -dxf
清理这些文件。
将图像/文件夹中已更改的文件复制到另一个目录
再次使用git diff --name-only
和xargs
,但这次只是在images/
目录上。使用cp -t <destination>
将列表从xargs复制到目标目录。
git diff --name-only <revision> images/ | xargs cp -t <destination dir>
jsfiles=()
cssfiles=()
htmlfiles=()
imagesfiles=()
# Loop over the output from `git diff --name-only -z` to operate by file.
while IFS= read -r -d '' file || [ -n "$file" ]; do
# gzip the '.js', '.css' and '.html' in place while looping
# also set up the arrays as valid arguments (hopefully) for the 'aws s3 sync' commands later.
case "$file" in
*.js)
gzip "$file" && mv "$file"{.gz,} && jsfiles+=(--include "$file")
;;
*.css)
gzip "$file" && mv "$file"{.gz,} && cssfiles+=(--include "$file")
;;
*.html)
gzip "$file" && mv "$file"{.gz,} && htmlfiles+=(--include "$file")
;;
images/*)
imagesfiles+=("$file")
;;
esac
done <(git diff --name-only -z "$revision")
aws s3 sync . s3://test --content-type "JS" --cache-control "max-age=31536000" --exclude "*" "${jsfiles[@]}"
aws s3 sync . s3://test --content-type "CSS" --cache-control "max-age=31536000" --exclude "*" "${cssfiles[@]}"
aws s3 sync . s3://test --content-type "text/html" --cache-control "max-age=31536000" --exclude "*" "${htmlfiles[@]}"
cp "${imagesfiles[@]}" "$some_other_dir/"