我为git提供了以下post-commit钩子:
#!/bin/sh
# Save this in: /home/qwertymk/website-live.git/hooks/post-receive
# let's save all of out js files before the checkout
FILES="$(find /home/qwertymk/public_html -type f -name '*.js')"
for f in $FILES
do
if [[ $f =~ /home/qwertymk/ignore-dir/dev-staging-area/ ]]; then continue; fi
echo "copying - $f"
cp $f $f.jscache
done
# done saving js files before checkout
export GIT_WORK_TREE=/home/qwertymk/public_html/
git checkout -f
# minify each js file that changed
cd /home/qwertymk/website-live.git
FILES=$(git whatchanged -n 1 --pretty=format: --name-only | grep '\.js$')
for f in $FILES
do
echo "processing - $f"
rm /home/qwertymk/public_html/$f.jscache
php /home/qwertymk/jsmin/curl.php /home/qwertymk/public_html/$f
done
# done minifing
# anything that has a .jscache should be moved to the .js
FILES="$(find /home/qwertymk/public_html -type f -name '*.js')"
for f in $FILES
do
if [[ $f =~ /home/qwertymk/public_html/dev-staging-area/ ]]; then continue; fi
if [ ! -f $f.jscache ]; then continue; fi
echo "restoring - $f"
rm $f
mv $f.jscache $f
done
这个脚本有什么问题吗?
使用它可以安全吗?
这个脚本是否会导致我的网站陷入困境?
答案 0 :(得分:3)
查看其他使用
的帖子find ... -print0 | xargs ??? | while read filename ; do ...
在S.O.上张贴它每天都会被提及。如果您的find
版本支持-print0
选项(表示空终止字符串输出),那么您已全部设置完毕。您需要为xargs找到相应的参数,以指示您正在发送空终止字符串。
当你在文件名中有空格或其他奇数字符时,使用FILES=$(find ...)
将会中断,无论是设计还是意外,这就是为什么你要使用-print0
的原因。
为了确保安全,请将所有破坏性代码(如rm $f
)转换为printf -- rm $f "\n"
等,以便在执行之前查看将执行的命令。
当您满意时输出是安全的,然后将整个脚本输出重定向到shell。即
myGitThing | bash
答案 1 :(得分:1)
我自己对looping over find
results(代码审核featured)的处理,这足以安全地处理任何字符,您可以将其置于路径中(其等效用于生产服务器移动和删除关键文件):
while IFS= read -r -d '' -u 9
do
file_path="$(readlink -fn -- "$REPLY"; echo x)"
file_path="${file_path%x}"
echo "START${file_path}END" # Literal
printf %q "$file_path" # Bash escaped
done 9< <( find /home/qwertymk/public_html -type f -name '*.js' -print0 )
请参阅链接以获取所有奇怪语法的解释。