我在 bitbucket 中有一个运行多个 ssh 命令的命令,有没有办法在前一个命令完成后运行每个命令?
ssh <user>@<host> 'cd /<dir>/example.com; git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop; mv examplegit/* mv examplegit/.* .; rmdir examplegit;'
Cloning into 'examplegit'...
mv: cannot stat 'mv': No such file or directory
mv: cannot move 'examplegit/.' to './.': Device or resource busy
mv: cannot move 'examplegit/..' to './..': Device or resource busy
mv: cannot move 'examplegit/.git' to './.git': Directory not empty
rmdir: failed to remove 'examplegit': Directory not empty
我可以多次运行相同的命令,但会出现不同数量和顺序的错误。这很合理,因为它们都会立即执行,但并不总是可以执行。
能够一个接一个地运行将解决所有问题
答案1
有没有办法在前一个命令完成后运行每个命令?
事实上,它现在就是这样运作的。
如果你一直使用&
分隔符,那允许命令同时运行,但;
分隔符总是等待退出前一个命令。
我可以多次运行相同的命令并得到不同数量和顺序的错误。
问题是你遗漏了一半的命令。具体来说,这部分:
mv examplegit/* mv examplegit/.* .;
可能是:
mv examplegit/*.;mv examplegit/.* .;
因为 'mv' 中途失败并留下一个非空目录,所以接下来的 'rmdir' 失败并且后续的 'git clone' 也拒绝克隆到该非空目录是有道理的。
总的来说,您还应该考虑;
用&&
(替换所有二&'s),它会额外检查前一个命令的退出代码,如果前一个命令失败,它就会停止。
ssh <user>@<host> 'cd /<dir>/example.com &&
git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop &&
mv examplegit/* . &&
mv examplegit/.* . &&
rmdir examplegit'
并考虑完全切换到不同的 git 部署方法这并不涉及制作一个新的克隆。
(您当前的方法还会使所有访问者都可以访问整个 Git 存储库 - 他们可能只需git clone https://example.com/.git
下载您的所有私人源代码即可。)
例如:
克隆你的仓库到
~/git/example.com
一次要部署,请运行:
ssh user@host 'cd ~/git/example.com && git pull --ff-only && GIT_WORK_TREE=/<dir>/example.com git checkout -f'
链接文章中的方法也将处理重命名/删除的文件,而您将永远保留旧文件。