gzip and git diff and s3



我需要获得自上次部署以来更改的文件列表(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-onlyxargs,但这次只是在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/"

最新更新