有什么原因迫使用户不要更改.gitignore文件。我的意思是让我们说有人会更改或删除此文件并推送此更改。
答案 0 :(得分:4)
使用Gitolite,预接收挂钩被称为VREFS(Virtual Refs,还有listed here):不要直接在由其管理的repos中设置预接收挂钩gitolite,通过在VREF
repo的gitolite-admin
目录中添加VREF来实现,Gitolite会将其传播到repos。
“restricting pushes by dir/file name”部分说明了如何通过更改目录和文件名来限制推送
这是一个你不需要添加到VREF
目录的VREF,实际上(它是由Gitolite管理的更新钩子的一部分。对于辅助更新钩子,see here)。
因此修改gitolite.conf
仓库中的gitolite-admin
,并将该管理仓库推回到gitolite服务器就足够了。
repo foo
RW+ = @senior_devs
RW = @junior_devs
- VREF/NAME/Makefile = @junior_devs
答案 1 :(得分:3)
Git是分散的。一旦有人克隆了回购,它就完全由他们控制,包括.gitignore
文件。
可以做的是阻止用户使用检查指定文件类型的Git hook将某些文件推送到您的服务器,并拒绝用户推送。
阅读pre-receive hooks。并编写一个搜索给定文件类型的脚本。
检查你的回购.git/hooks
会有一个示例文件列表,告诉你如何处理它。另请阅读this article以避免容易犯错。
修改强>
我不擅长shell脚本,但是这里有一个小脚本,它禁止.php和.css文件并在中止之前告诉用户。它位于.git/hooks/pre-receive
。请记住使其可执行(chmod +x
),否则它将无效。
#!/bin/sh
while read oldrev newrev refname
do
if [[ `git diff-tree --no-commit-id --name-only -r $newrev | grep -e 'css\|php'` != "" ]]
do
echo "Cannot push this"
exit 1;
fi
end
答案 2 :(得分:2)
您可以在服务器端设置预接收挂钩,如果.gitignore
被修改则拒绝推送。