【发布时间】:2017-07-18 14:53:15
【问题描述】:
有一个文件应该在我们的 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 会导致文件被错误提交)
【问题讨论】:
-
你为什么不用
git reset HEAD file/in/question? -
@Leon 这也没有按预期运行。我希望它能够删除所有更改,以便文件不会显示为已更改。相反,它仍然显示为已更改,但未上演。一种改进,但不完全是一个解决方案。
-
第一个选择 revert 选项的开发人员,期望它保持提交干净,同时让他们保持本地版本,可能会不同意这种评估,@M_M
-
@Mark:我对文件的“删减”而不是仅仅取消暂存它不太满意,但是可以根据需要重新创建文件,只需付出少量努力,所以这是“同意”的解决方案。 :-p
-
好吧,我的回答解决了如何做到这两点。而且我想由于这是一个本地钩子,任何安装它的开发人员只能在它出现问题时责怪自己。但我预测你迟早会寻找“unstage”语法
标签: git githooks git-checkout pre-commit-hook pre-commit