我一直在寻找副本,虽然其中一些有类似的标题,但我没有发现任何人和我有同样的问题,所以这里就是。
我编写了一个在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
文件未被修改,因此我不能在此之前添加它们。我也知道我可以以非零状态退出钩子,因此提交被取消但文件被添加,但我希望避免这种情况。有更好的想法吗?
答案 0 :(得分: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"
如果您在测试存储库中运行git log -p
并查看生成的提交,那么每当foo.css
被修改时,您都会看到foo.min.css
和foo.less
被修改。< / p>
这就是为什么我认为您的问题是由更改/取消设置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将因错误而中止。
答案 1 :(得分:0)
我觉得你可以将git属性'clean'作为更新生成文件的脚本。通常,钩子可以运行脚本来整理你的源代码,但我认为它可以用来“清理”你生成的输出。 执行'git add'时会触发此属性,您可以让脚本在生成的文件上执行另一个'git add'。
答案 2 :(得分:0)
您可以利用修改上次提交的权限。只是一个想法。
答案 3 :(得分:-3)
为什么你想首先这样做?您正试图将生成的文件包含到版本控制中,这通常是一个不太好的想法。如果你需要在结账时使用style.min.css,为什么不能在结账步骤结账后生成它?