gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:29:22 26 4
gpt4 key购买 nike

我四处寻找重复项,虽然其中一些具有相似的标题,但我没有发现任何人遇到与我相同的问题,所以这里开始。

我编写了一个在 pre-commit 上运行的脚本并使用 git status --porcelain 的输出编译我的项目中已更改的任何 LESS 文件。这部分工作正常。但我希望 .css 文件包含在当前提交中。所以除了运行编译器,我的脚本还运行git add <filename> .这就是事情变得棘手的地方。

文件添加到索引中,但它不是当前提交的索引。所以如果我修改 style.less , 然后运行 ​​git commit -a (或手动 git add style.less )编译器应生成 style.cssstyle.min.css并将它们添加到当前提交中。但我注意到的行为只是 style.less promise ,尽管有两个.css文件被添加到下一次提交的索引中。

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

最佳答案

我无法重现您的问题。我最初的猜测是 GIT_INDEX_FILE 环境变量被您的 pre-commit Hook 取消设置。但是,当我尝试从 pre-commit 中取消设置 GIT_INDEX_FILE 时,我遇到了一个不同的问题(Git 提示 .git/index 被锁定)。

这是一个示例脚本,显示 Git 按您的预期运行,并且一定是其他地方出了问题。此脚本初始化一个新的测试存储库,创建一个 pre-commit Hook 来模拟您的 Hook 所做的事情,并进行一些测试提交:

#!/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.cssfoo.min .cssfoo.less 被修改时被修改。

这就是为什么我认为您的问题是由更改/取消设置 GIT_INDEX_FILE 环境变量引起的:

git commit -a 运行时,Git 会创建一个临时索引文件并使用它代替默认的 .git/index 来创建提交。为了使 git add 等操作在 pre-commit Hook 中工作,Git 将 GIT_INDEX_FILE 环境变量设置为临时文件的名称它在运行 pre-commit 之前创建的索引。如果您的钩子(Hook)取消设置 GIT_INDEX_FILE,或将其设置为 .git/index,那么您钩子(Hook)内的所有 Git 操作都会尝试修改原始索引,而不是修改临时索引用于生成提交。

但是,临时索引文件也起到了对原始索引文件的锁定作用。如果钩子(Hook)试图修改原始索引,而临时索引存在,则 Git 将中止并报错。

关于git - 如何在 git 预提交 Hook 中将文件添加到索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com