如何在git预提交钩子中将文件添加到索引中

如何在git预提交钩子中将文件添加到索引中,git,githooks,Git,Githooks,我四处寻找了一些复制品,虽然其中一些有类似的标题,但我没有发现任何人有与我相同的问题,所以我来看看 我编写了一个脚本,它在pre-commit上运行,并使用git-status的输出编译项目中任何更改过的文件。这部分很好用。但是我希望在当前提交中包含.css文件。因此,除了运行编译器之外,我的脚本还运行gitadd。这就是事情变得棘手的地方 该文件已添加到索引中,但它不是当前提交的索引。因此,如果我修改style.less,并运行git commit-a(或手动git add style.les

我四处寻找了一些复制品,虽然其中一些有类似的标题,但我没有发现任何人有与我相同的问题,所以我来看看

我编写了一个脚本,它在
pre-commit
上运行,并使用
git-status的输出编译项目中任何更改过的文件。这部分很好用。但是我希望在当前提交中包含.css文件。因此,除了运行编译器之外,我的脚本还运行
gitadd
。这就是事情变得棘手的地方

该文件已添加到索引中,但它不是当前提交的索引。因此,如果我修改
style.less
,并运行
git commit-a
(或手动
git add style.less
),编译器应该生成
style.css
style.min.css
,并将它们添加到当前提交中。但是我注意到的行为只是
样式。提交的
更少,尽管下一次提交的索引中添加了两个
.css
文件


所以我的问题是:有没有一种方法可以将文件添加到预提交钩子中的提交中,以便它们对该提交生效?请注意,在运行pre-commit钩子之前,这两个
.css
文件不会被修改,因此我不能在此之前添加它们。我也知道我可以以非零状态退出钩子,因此提交被取消,但文件被添加,但我希望避免这种情况。有更好的主意吗?

我突然想到,您可以将git属性“clean”作为更新生成的文件的脚本。通常,这个钩子可以运行一个脚本来整理源代码,但我认为它可以用来“清理”生成的输出。
执行“git add”时会触发此属性,您可以让脚本对生成的文件执行另一个“git add”。

您可以利用修改上次提交的优势。只是一个想法。

我无法重现你的问题。我最初的猜测是,
GIT_INDEX_文件
环境变量正被
pre-commit
hook取消设置。然而,当我试图从
预提交
中取消设置
GIT\u INDEX\u文件
时,我遇到了另一个问题(GIT抱怨
.GIT/INDEX
被锁定)

下面是一个示例脚本,它显示Git的功能与您预期的一样,而且肯定是出了问题。此脚本初始化一个新的测试存储库,创建一个模拟钩子功能的
预提交
钩子,并进行一些测试提交:

#/垃圾箱/垃圾箱
#初始化测试存储库
rm-rf测试报告
git init testrepo
cd测试报告
#创建预提交钩子
cat>“${fb}”.css
echo baz>>“${fb}”.min.css
git添加“${fb}.css”${fb}.min.css
;;
以撒
完成
EOF
chmod+x.git/hooks/pre-commit
#创建foo.less,提交它
回声foo>foo.less
git添加foo.less
git commit-m“add foo.less”
#修改foo.less,提交它
echo foo2>>foo.less
git commit-a-m“modify foo.less”
如果您在测试存储库中运行
git log-p
,并查看结果提交,您将看到每当修改
foo.less
时,
foo.css
foo.min.css
都被修改

这就是为什么我认为您的问题是由更改/取消设置
GIT\u INDEX\u文件
环境变量引起的:

当运行
git commit-a
时,git生成一个临时索引文件,并使用该文件而不是默认的
.git/index
来创建提交。为了让像
git add
这样的操作在
pre-commit
钩子中工作,git将
git\u INDEX_文件
环境变量设置为在运行
pre-commit
之前创建的临时索引的名称。如果钩子取消设置了GIT_INDEX_文件
,或者将其设置为
.GIT/INDEX
,那么钩子中的所有GIT操作都将尝试修改原始索引,而不是用于生成提交的临时索引


但是,临时索引文件还充当原始索引文件上的锁。如果钩子试图修改原始索引,而临时索引存在,那么Git将因错误而中止。

首先为什么要这样做?您正试图将生成的文件包含到版本控制中,这通常不是一个好主意。如果在签出时需要style.min.css,为什么不能在生成步骤中签出后生成它?

您能详细说明一下吗?我做了一些Google搜索,发现了一些关于Git属性的信息,但是没有关于如何将脚本附加到它们上,或者如何安排<代码>添加< /代码>属性。我确实考虑了这个选项,但是我希望避免它。它涉及到运行一个提交,运行钩子,然后让最初的提交完成,然后运行第二个提交(除非我遗漏了什么),手动执行这一操作似乎很复杂,而使用钩子自动执行这一操作则有点可笑,我运行了你的脚本,它按预期工作,与我真正的存储库的实际运行方式相反。我稍后会进一步调查此事,如果我有什么发现,会给你回复。谢谢因为努力而给了你赏金,尽管我还是不知道发生了什么。再次感谢!因为CSS文件不是二进制文件,它们只是静态文本文件。生成的文件不会放在版本控制中,因为它们通常会导致合并冲突,在这种情况下,您没有很好的方法来解决它们(二进制文件),但对于CSS文件,您很少会遇到这种问题。我不想在合并/更新后在我们的Web服务器上安装更少的编译器。然而,所有这些都表明,这确实是一种更容易实现我想要做的事情的方法,尽管它并不理想。为什么这是公认的答案?这根本解决不了问题。我想他接受了我的“哟”