我一直在寻找复制品,虽然其中一些有类似的标题,但我没有发现任何人和我有同样的问题,所以这里有.
我编写了一个运行的脚本,pre-commit并使用输出git status --porcelain来编译已更改的项目中的任何LESS文件.这部分工作正常.但我希望.css文件包含在当前提交中.所以除了运行编译器之外,我的脚本还会运行git add <filename>.而这里的事情变得棘手.
该文件将添加到索引中,但它不是当前提交的索引.所以,如果我修改style.less,并运行git commit -a(或手动git add style.less)编译器应生成style.css和style.min.css并将其添加到当前提交.但是我注意到的行为只是style.less提交了,尽管有两个.css文件被添加到下一次提交的索引中.
所以我的问题是:有没有办法在预提交钩子中向提交添加文件,以便它们对该提交生效?请注意,在运行预提交挂钩之前,.css不会修改这两个文件,因此我不能在此之前添加它们.我也知道我可以以非零状态退出钩子,因此提交被取消但文件被添加,但我希望避免这种情况.有更好的想法吗?
Ric*_*sen 12
我无法重现您的问题.我最初的猜测是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"
Run Code Online (Sandbox Code Playgroud)
如果您git log -p在测试存储库中运行并查看生成的提交,您将看到foo.css并foo.min.css在修改时foo.less进行修改.
这就是为什么我认为你的问题是由更改/取消设置GIT_INDEX_FILE环境变量引起的:
当git commit -a运行,使得Git的一个临时索引文件,并使用该而不是默认.git/index创建的承诺.为了使操作git add能够在pre-commit钩子内工作,Git将GIT_INDEX_FILE环境变量设置为它在运行之前创建的临时索引的名称pre-commit.如果您的钩子未GIT_INDEX_FILE设置或设置为.git/index,则钩子内的所有Git操作将尝试修改原始索引,而不是用于生成提交的临时索引.
但是,临时索引文件还充当原始索引文件的锁.如果一个钩子试图修改原始索引,并且临时索引存在,那么Git将中止并出现错误.
pla*_*ugg -5
你首先为什么要这样做?您正在尝试将生成的文件包含到版本控制中,无论如何,这通常不是一个好主意。如果您需要在结帐时提供 style.min.css,为什么不能在结帐后在构建步骤中生成它?