我和一组开发人员使用fabric将代码部署到远程服务器。每当创建一个新文件并将其添加到git repo时,默认权限将为-rw--r--r
,这使得其他开发人员无法更新此文件(所有用户都属于同一主要组)。
我希望权限为-rw-rw-r
(组可写),我尝试在fabfile.py run("umask 002")
中设置“umask 002”,但它不起作用。除了去编辑/etc/bash.bashrc
[编辑-1] fab脚本的输出
[devsrv] Executing task 'deploy'
[localhost] local: bash -l -c "umask 002"
[localhost] local: bash -l -c "git push"
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 279 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To devsrv:/opt/git/xyzprojv1.git
8a7dcd5..141eb52 master -> master
[devsrv] run: umask 002
[devsrv] run: test -d /opt/webapps/xyzprojv1
[devsrv] run: git pull
[devsrv] out: remote: Counting objects: 3, done.
[devsrv] out: remote: Compressing objects: 100% (2/2), done.
[devsrv] out: remote: Total 2 (delta 1), reused 0 (delta 0)
[devsrv] out: Unpacking objects: 100% (2/2), done.
[devsrv] out: From /opt/webapps/../git/xyzprojv1
[devsrv] out: 8a7dcd5..141eb52 master -> origin/master
[devsrv] out: Updating 8a7dcd5..141eb52
[devsrv] out: Fast-forward
[devsrv] out: 0 files changed, 0 insertions(+), 0 deletions(-)
[devsrv] out: create mode 100644 umask_test
答案 0 :(得分:2)
看起来像fabric在一个单独的shell中运行每个命令(虽然我不确定),我已经通过重写以下列格式更改文件系统的命令暂时解决了这个问题。 如果有人对面料的做法有更好的解释,那将非常有用。
而不是使用
run("umask 002")
run("git pull")
我已将其更改为
run("umask 002 && git pull")
一切都按预期工作
<强> [编辑] 强>
Fabric有关于此http://www.fabfile.org/faq.html#my-cd-workon-export-etc-calls-don-t-seem-to-work
的明确文档因此每个调用都有自己独特的shell会话。这就是为什么在呼叫中设置的umask对其他后续呼叫没有影响的原因
答案 1 :(得分:2)
根据Ryu_hayabusa的回答,如edit link所述,您还可以使用with prefix('umask 002'):
run('git pull')
# Other code here, also umasked
上下文管理器:
with cd('/some/dir'), prefix('umask 002'):
run('git pull')
[编辑]
添加BigToach的注释 - 多个with语句可以组合在一行中,如下所示:
LnMgn = [calcMgn(index)*spa for index in range(4)]