(如何)我可以从预提交钩子中运行 git checkout 吗?

毫米

有一个文件应该在我们的 git 存储库中,以便它在任何结帐中。可能由用户更改,但通常不应重新检入更改。 --assume_unchanged 和 --skip_work_tree 都没有提供所需的灵活性,而且文件太麻烦,无法使用污迹/清洁过滤器进行合理的“修改”。

所以我编写了一个预提交钩子,它成功地询问用户是否确定要提交对这个文件的更改。如果他们说是,文件被签入(钩子返回 0,提交继续),如果不是,提交被中止。

我不想中止,而是让用户可以选择还原对文件的更改并继续提交。

要将文件恢复到未更改状态,我使用git checkout -- file/in/question.

鉴于文件已修改并暂存以进行提交,我运行以下预提交挂钩:

#!/bin/bash
echo "git checkout -- file/in/question"
git checkout -- file/in/question
echo "git status"
git status
exit 1 #would be 0 if the hook worked as expected

我得到以下输出:

git checkout -- file/in/question
git status
On branch blah
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   file/in/question

为什么 git status 报告 git checkout 没有效果?(这是正确的 - 从钩子返回 0 会导致文件被错误提交)

马克·阿德尔斯伯格

当给定路径时,默认情况下checkout从索引更新工作树(即从提交的更改阶段)。

您想要的是更新索引(大概来自HEAD,以便此提交保持文件不变)。这可以用

git reset HEAD -- file/in/question

默认情况下,这会将工作树中的更改保留为未暂存的更改。这可能比同时恢复索引和工作树更安全,但如果你真的想恢复两者,你可以说

git checkout HEAD -- file/in/question

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章