这会破坏我的整个网站吗?

时间:2012-02-21 03:02:18

标签: git bash

我为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

这个脚本有什么问题吗?

使用它可以安全吗?

这个脚本是否会导致我的网站陷入困境?

2 个答案:

答案 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 )

请参阅链接以获取所有奇怪语法的解释。