2015-11-01 206 views
1

我需要获取自上次部署(git diff)以来发生更改的文件列表,gzip这些文件并将这些文件发送到S3。我需要获取所有的css文件并将它们gzip,然后我需要获取所有html文件,gzip它们以及所有的JS文件并将它们gzip。只有在最后一次提交后发生了变化。gzip和git diff以及s3

我可以轻松地从上次部署中获取提交哈希。我也有来自当前部署的提交散列。

下面是我有gzips所有的css文件的代码。我想修改这个代码仅gzip的所有CSS文件,改变了

find . -iname '*.css' -exec gzip -9 {} \; -exec mv {}.gz {} \; 

下面是我不得不AWS示例代码同步所有的HTML文件(我有独立的AWS同步命令为CSS,JS, HTML文件,因为我需要不同的内容类型和内容编码和缓存参数)。我想修改这个代码仅AWS同步,改变

aws s3 sync . s3://test --content-type "text/html" --cache-control "max-age=31536000" --exclude "*" --include "*.html" 

如何配合这个代码git的差异的HTML文件?只能gzip已更改的文件?并且只会同步更改过的文件(git diff返回的文件列表中的文件)?

另外,我想复制一些文件,git diff返回到一个单独的目录。例如,需要将images /文件夹中的所有文件复制到StaticAssets /目录。如何获取已更改并位于图像文件夹中的文件列表并将它们复制到单独的文件夹?

我想用bash来做到这一点。

所以我知道我可以使用git diff --name-only命令。我的问题是,我该如何使用该命令在bash做到以下几点:

  • Gzip已全部改变 css文件,Gzip已全部更改的js文件,Gzip已全部单独改变的HTML文件(注意,该css文件可能位于另一个目录内的目录中)。我需要检索父目录中的所有css文件。因此,如果父目录有文件夹测试,并且该文件夹有另一个名为test1的文件夹,并带有一个名为test.css的css文件,我需要能够将该css文件gzip即使其2个目录下载到
  • AWS Sync全部已更改 js文件,AWS同步所有改变CSS的单独文件
  • 改变以及在图像复制的文件/文件夹复制到另一个目录
+0

你有一个标签或其他一些标记最后部署?你有部署文件的副本吗? –

+0

我有上次部署的git commit hash。 – Jasmine

+0

你是否要求在这里需要'git diff'命令?你在问如何将输出钩到'gzip'和's3 sync'(或其他)?你是否有任何代码作为这方面的尝试? –

回答

0

Gzip all of changed css files, Gzip all of changed js files, Gzip all of the changed html files separately

的基本方式来获得的改变列表文件是git diff --name-only

您可以过滤该列表以获取仅带有grep '.css$' -的CSS文件。 -表示要从STDIN而不是文件中读取。

您可以使用xargs将该列表gzip从STDIN转换为参数列表。请务必使用gzip -k以避免删除原始文件。

git diff --name-only <revision> | grep '.css$' - | xargs gzip -k 

对每个文件扩展名重复。

Sync all changed js files, sync all of changed css files separately.

传递适当的--include过滤器进入aws s3 sync。对于CSS,它是*.css.gz

您可能需要使用git clean -dxf清理这些文件。

Copy files that have changed and that are in the images/ folder to a another directory

再次使用git diff --name-onlyxargs但这次只是对images/目录。使用cp -t <destination>将列表从xargs复制到目标目录。

git diff --name-only <revision> images/ | xargs cp -t <destination dir> 
+0

这些命令不适用于我。例如对于最后一个命令,我得到错误:cp:缺少文件操作数 – Jasmine

+0

cp(GNU coreutils)8.22 版权所有(C)2013自由软件基金会,Inc. 许可证GPLv3 +:GNU GPL版本3或更高版本。 这是免费软件:你可以自由更改和重新分配它。 在法律允许的范围内,不存在任何担保。 作者:TorbjörnGranlund,David MacKenzie和Jim Meyering。 – Jasmine

+0

@Jasmine这可能意味着没有更改的文件。 – Schwern

0
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/"