我正在使用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,其中提问者的问题与裸仓而不是工作树有关。
答案 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是安全的。由于您处于收件后挂钩状态,因此您知道自己正处于要克隆的仓库中。