我正在进行预接收挂钩。我希望所有文件都以大写字母命名。如果文件不符合这个条件,我们应该停止推送并要求用户更改文件名。我试过了
if [[ "$fileName" =~ [a-z] ]]; then
echo -e "file should be in upper Case" >&2
exit 1;
fi
用户使用
更改文件名后停止推送git mv -f tes TES
我总是得到文件是小写的错误。我应该从上次提交中删除该文件并使用新名称再次提交吗?
答案 0 :(得分:2)
听起来好像钩子正在工作。但是,这并没有从本地repo的ref的历史记录中删除带有小写文件名的提交。
如果用户只是推送一个提交,那么他们可以修复文件名然后
git commit --amend
更常见的是,用户可能会同时推送多个提交。假设您的钩子检查所有提交(如果不是,小写名称将随时间泄漏到您的历史记录中),用户将必须在推送之前修复整个历史记录。这可以使用git filter-branch
完成。要清理一个名为the_branch
的分支,以便可以推送它:
ucfn.sh
所以
git filter-branch --tree-filter=ucfn.sh -- the_branch
或者
git filter-branch --tree-filter=ucfn.sh -- origin/the_branch..the_branch
(你可以通过切换到index-filter
来加快运行速度(如果有很多新的提交,或者工作树很大),但由于你没有工作,脚本更难写index-filter
中的树。)
最好的方法是帮助用户避免这种情况,方法是为他们提供一个预提交挂钩,检查推送是否被接受,否则拒绝提交。就像任何本地钩子一样,他们必须选择设置它并且你不能强迫它们使用它 - 所以你仍然需要后接收挂钩 - 但这可以阻止你的用户进入在他们可以推动之前他们有一个巨大的清理角落。