为什么在git post接收钩子中使用“rm-rf”与在shell中使用“rm-rf”的行为不同?

为什么在git post接收钩子中使用“rm-rf”与在shell中使用“rm-rf”的行为不同?,git,hook,sh,rm,git-post-receive,Git,Hook,Sh,Rm,Git Post Receive,我正在使用 钩子几乎将裸repo克隆到一个临时目录中,并在生成站点后删除该临时git克隆 #!/bin/sh # clone a repo, generate site etc # done generating site, remove the TMP_GIT_CLONE rm -rf $TMP_GIT_CLONE 当我推送时,所有其他任务都可以,但不会删除所有文件 我得到以下错误: remote: rm: <TMP_GIT_CLONE>/.git/objects/pack: D

我正在使用

钩子几乎将裸repo克隆到一个临时目录中,并在生成站点后删除该临时git克隆

#!/bin/sh
# clone a repo, generate site etc
# done generating site, remove the TMP_GIT_CLONE
rm -rf $TMP_GIT_CLONE
当我推送时,所有其他任务都可以,但不会删除所有文件

我得到以下错误:

remote: rm: <TMP_GIT_CLONE>/.git/objects/pack: Directory not empty
remote: rm: <TMP_GIT_CLONE>/.git/objects: Directory not emppty
remote:rm:/.git/objects/pack:目录不为空
远程:rm:/.git/objects:目录不是empty

你明白了吗

但是,当我直接从命令行调用
post receive
脚本时,
rm
的行为与预期一致

为什么?

注意:我已经研究过,询问者的问题与处于裸回购而不是工作树中有关。

使用

which rm
获取rm的路径,例如/bin/rm


然后将其替换为/bin/rm以获得另一次尝试。有时,它是通过shell脚本的开始脚本发生的。

我不知道您是否找到了解决此问题的方法,但我遇到了完全相同的问题。我发现/git/objects/pack目录没有清空。我怀疑当您使用ssh或post-receive时,用于跟踪文件的任何进程都会运行得较慢或以不同的方式运行

解决办法:

一种方法是手动删除这些目录。这种方法对我很有效,但我不想依赖于这种结构是一样的。我试着先删除.git目录。这产生了一种奇怪的行为,即抱怨非空目录,但最终清空了它们

更好的方法是首先避免不必要的git文件。答案 可能会提供一些见解。
我将“git克隆”行替换为:

mkdir -p $TMP_GIT_CLONE
git archive master --format=tar | tar -x -f - -C $TMP_GIT_CLONE

我认为将$git_REPO从git中剔除是安全的。由于您处于post receive hook中,因此您知道您处于要克隆的repo中。

一些想法:您正在使用另一个版本的
rm
,或者另一个具有内置
rm
命令的shell?我倾向于说环境是相同的<代码>哪个-rm只返回一个(已登录)。它在FreeBSD7.2(nearlyfreespeech)上。登录shell是bash。我的
.bash\u profile
在登录时执行,同时使用git post receive钩子在rm之后添加一些“ls-a”命令,以查看哪些文件被粘住。这可能会给你一些线索。任何作为目录的文件都会保留不,请原谅,我并没有在非交互式shell中完成所有这些事情。我检查完这些东西后会回来的谢谢你的回答。你能更详细地解释这背后的原因吗?我的路径工作正常,因为可执行文件的实际启动工作正常(例如,
jekyll
rm
,等等)。问题是,
rm
似乎只是删除了一些文件,而不是全部。就好像-rf选项没有粘住一样,或者权限不同。这取决于您的shell。例如,如果您使用bash,并且系统有一些默认的“别名”。您可以检查
别名rm
。我的解决方案有效吗?