4

git post receive hooks を使用して Web サイトを公開する際に、この例を使用しています。

フックはベア リポジトリを一時ディレクトリにほぼ複製し、サイトを生成した後、その一時的な 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 different from shell を見てきました.askerの問題は、ワークツリーではなく裸のレポにあることに関係していました。

4

2 に答える 2

1

これを回避する方法を見つけたかどうかはわかりませんが、まったく同じ問題がありました。/git/objects/pack ディレクトリが空でないことがわかりました。ファイルを追跡するために使用されるプロセスは、ssh または post-receive のいずれかにいる場合、実行速度が遅くなるか、別の方法で実行されるのではないかと思います。

解決策:

1 つの方法は、これらのディレクトリを手動で削除することです。この種のことはうまくいきましたが、その構造が同じであることに依存したくありませんでした。最初に .git ディレクトリだけを削除してみました。これにより、空でないディレクトリについて不平を言うが、最終的にそれらを空にするという奇妙な動作が発生しました。

より良いアプローチは、最初から不要な git ファイルを避けることです。この質問への答え は、いくつかの洞察を提供するかもしれません。
「git clone」行を次のように置き換えました。

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

$GIT_REPO を git で削除しても安全だと思います。post-receive フックにいるので、とにかく複製したいリポジトリにいることがわかります。

于 2012-06-12T17:55:18.723 に答える
1

使用する

which rm

rm のパスを取得します。/ビン/rm

それを /bin/rm に置き換えて、もう一度試してください。場合によっては、シェル スクリプトの起動スクリプトによって発生することがあります。

于 2011-11-03T02:29:39.687 に答える