【发布时间】:2014-10-21 13:29:41
【问题描述】:
我正在使用类似于this one 的方法来使用预提交挂钩来跟踪对我的数据库架构(以及一些元数据表)的更改。
我喜欢尝试保持我的提交干净,所以当有自动更改被暂存/提交时,我希望在提交消息中得到大声警告。这是我的 pre-commit 和 pre-commit-msg 钩子:
.git/hooks/pre-commit
#!/bin/sh
# Save user changes to db/ (if any)
git diff --quiet db/
user_dirty=$?
[[ $user_dirty > 0 ]] && git stash save --keep-index
# Regenerate db/ automatically
db/save_schema_and_meta_tables.sh
# Were any automatic changes made? If so, commit them but warn about it
git diff --quiet db/
auto_dirty=$?
if [[ $auto_dirty > 0 ]]; then
git add db/
echo "WARNING: automatic changes to db/ added to commit" | tee .git/COMMIT_WARNING
fi
[[ $user_dirty > 0 ]] && git stash pop
exit 0
.git/hooks/prepare-commit-msg
#!/bin/sh
msgf=$1
wf=.git/COMMIT_WARNING
if [ -e $wf ]; then
msg=$(<$msgf)
( cat $wf; echo "$msg" ) > $msgf
rm -f $wf
fi
这是它的行为方式:
- 如果我对
db/进行了更改但尚未暂存它们,它们将保留在工作树中而不会干扰提交,这要感谢stash save --keep-index和stash pop。好! - 但是,如果我对
db/进行了暂存 更改并且它们被自动提交覆盖,那么用户预期的更改会在提交后消失。糟糕!
这是我希望发生的情况:如果用户对db/ 进行了更改,并且它们与自动更改不完全匹配,那么整个事情应该中止。我在弄清楚如何实现这一点时遇到了很多麻烦:如何保存用户所做的分阶段更改,然后查看自动更改是否不匹配?
【问题讨论】:
-
我在这里没有考虑过你的整个问题,但你可能想看看stackoverflow.com/q/20479794/1256452,我在那里写了如何在预提交钩子中使用
git stash save --keep-index,以及如何制作它主要是可靠的。在您的情况下,我认为您在这里要做的是进行几次提交(包括隐藏的提交)并进行比较。 -
谢谢,@torek。您线程中的策略很好。尝试使用
git stash技巧来做到这一点让我有点发疯。你指出的错误也令人沮丧......我肯定也被它咬过。