为什么`rm -rf`在git post-receive hook中使用而不是shell时表现不同?

时间:2011-05-31 18:26:26

标签: git hook sh rm git-post-receive

我正在使用this example on publishing a website w/ git post receive hooks

钩子几乎将裸仓库克隆到临时目录中,并在生成站点后删除该临时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

...

你明白了

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

为什么?

注意:我查看了Post-hook receive act's differently to shell,其中提问者的问题与裸仓而不是工作树有关。

2 个答案:

答案 0 :(得分:1)

使用

which rm

获得rm的路径,例如。 / bin中/ RM

然后用/ bin / rm替换它以进行另一次尝试。有时,它是由shell脚本的启动脚本发生的。

答案 1 :(得分:1)

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

解决方案:

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

更好的方法是首先避免不必要的git文件。答案 this question可能会提供一些见解 我用'

替换了'git clone'行
mkdir -p $TMP_GIT_CLONE
git archive master --format=tar | tar -x -f - -C $TMP_GIT_CLONE

我认为git摆脱$ GIT_REPO是安全的。由于您处于收件后挂钩状态,因此您知道自己正处于要克隆的仓库中。