4

我正在使用此示例发布带有 git post receive hooks 的网站

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

#!/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 different to shell,其中提问者的问题与处于裸仓库而不是工作树有关。

4

2 回答 2

1

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

解决方案:

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

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

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

我认为摆脱 $GIT_REPO 是安全的。由于您处于接收后挂钩中,因此您知道无论如何您都在要克隆的存储库中。

于 2012-06-12T17:55:18.723 回答
1

利用

which rm

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

然后将其替换为 /bin/rm 以再次尝试。有时,它是由您的 shell 脚本的启动脚本发生的。

于 2011-11-03T02:29:39.687 回答