問題を再現できません。私の最初の推測では、GIT_INDEX_FILE
環境変数があなたのpre-commit
フックによって設定解除されていたということでした。しかし、GIT_INDEX_FILE
をpre-commit
から解除しようとすると、別の問題が発生しました(Gitは.git/index
がロックされていると不平を言いました)。
Gitが期待通りに機能し、他の何かが間違っていなければならないことを示すスクリプト例です。このスクリプトは、新しいテスト・リポジトリを初期化し、あなたのフックが何をエミュレートpre-commit
フックを作成し、いくつかのテストがコミットます:
#!/bin/sh
# initialize the test repository
rm -rf testrepo
git init testrepo
cd testrepo
# create the pre-commit hook
cat <<\EOF >.git/hooks/pre-commit
#!/bin/sh
git status --porcelain | while IFS= read -r line; do
# todo: handle renames and deletions of a *.less file
f=${line#???}
case ${f} in
*.less)
fb=${f%.less}
echo bar >>"${fb}".css
echo baz >>"${fb}".min.css
git add "${fb}".css "${fb}".min.css
;;
esac
done
EOF
chmod +x .git/hooks/pre-commit
# create foo.less, commit it
echo foo >foo.less
git add foo.less
git commit -m "add foo.less"
# modify foo.less, commit it
echo foo2 >>foo.less
git commit -a -m "modify foo.less"
テスト・リポジトリにgit log -p
を実行し、その結果のコミットを見れば、あなた」 foo.less
が変更されるたびにfoo.css
とfoo.min.css
が変更されていることがわかります。
git commit -a
が実行される
は、Gitは一時的なインデックスファイルを作成し、代わりにデフォルト.git/index
のコミットを作成することを使用しています。私はあなたの問題がGIT_INDEX_FILE
環境変数を設定解除/変更することによって引き起こされたと思った理由を
がここにあります。 git add
のような操作がpre-commit
フックから機能するように、GitはGIT_INDEX_FILE
環境変数を、pre-commit
を実行する前に作成した一時インデックスの名前に設定します。あなたのフックがGIT_INDEX_FILE
を解除するか、それを.git/index
に設定すると、あなたのフック内のすべてのGit操作は、コミットを生成するために使用される一時インデックスではなく、元のインデックスを変更しようとします。
ただし、一時インデックスファイルは、元のインデックスファイルのロックとしても機能します。フックが元のインデックスを修正しようとしたときに一時インデックスが存在すると、Gitはエラーを返して中断します。
CSSファイルはバイナリファイルではないので、静的なテキストファイルです。生成されたファイルはバージョン管理には入れられません。通常は、バイナリファイルを解決するための良い方法がない場所ではマージの競合が発生しますが、そのような問題はほとんどないCSSファイルです。私はそれをポストマージ/アップデートするために私たちのウェブサーバ上にLESSコンパイラをインストールする必要はありませんでした。しかし、それは理想的ではありませんでしたが、私がやろうとしていたことを達成するためのより簡単な方法であることが判明しました。 –
これはなぜ受け入れられる答えですか?これは問題を解決しません。 – frhd
私は彼が自分の「あなたのことを間違っている」という無回答を受け入れたと思います。この場合、彼の問題は解決されていると思います。彼が最初にLESSファイルをチェックインしないと、「どうやってそれらをコミットするのか」という問題がなくなります。 – plaugg