Ruby chmod 有效,但不适用于一个名为 "js/" 的目录

Ruby chmod works, but not for one directory called "js/"

我一直在整理一个 ruby 脚本,该脚本在我的网络服务器(运行 gitolite)上使用 post -接收挂钩。

检出文件后,我尝试先 chmod 目录,然后是这样的文件:

FileUtils.chmod_R(0755, Dir.glob("#{deploy_to_dir}/**/*/"))
FileUtils.chmod_R(0644, Dir.glob("#{deploy_to_dir}/**/*"))

第一个命令适用于除一个目录之外的所有目录:js/。它只是不将 +x 设置到这个目录——同时设置 +r.

情况如下:

  1. 之前:dr-------- js/
  2. Skript 在 js/
  3. chmod 755
  4. 之后:drw-r--r-- js/
  5. 预计:drwxr-xr-x js/

我用 lsattr 检查了 arrtibutes。它只给出 -----------------e- ./js/ 没有什么特别之处。还有什么可能是错的吗?

直接在bash中更改它就可以了。 Ruby 对这个目录做了什么?

尝试颠倒顺序:

FileUtils.chmod_R(0644, Dir.glob("#{deploy_to_dir}/**/*"))
FileUtils.chmod_R(0755, Dir.glob("#{deploy_to_dir}/**/*/"))

否则所有文件和目录都将匹配 0644 chmod 并撤消您的执行位。

最后的问题是,js/en/ 是 glob 中的第一个目录。 => 现在它是一个 bash 脚本 并且可以运行。

#!/bin/bash
# post-receive

# 1. Read STDIN (Format: "from_commit to_commit branch_name")
read from to branch 

if [[ $branch =~ master$ ]] ; then
    deploy_to_dir='/var/www/virtual/whnr/vectoflow'
    GIT_WORK_TREE="$deploy_to_dir" git checkout -f master
elif [[ $branch =~ development$ ]] ; then
    deploy_to_dir='/var/www/virtual/whnr/vectotest'
    GIT_WORK_TREE="$deploy_to_dir" git checkout -f development
else
    echo "Received branch $branch, not deploying."
    exit 0
fi

# 3. chmod +r whole deploy_to_dir
find $deploy_to_dir -type d -print0 | xargs -0 chmod 755
echo  "DEPLOY: Changed Permissions on all directories 755"
find $deploy_to_dir -type f -print0 | xargs -0 chmod 644
echo "DEPLOY: Changed Permissions on all files 644"