有什么理由强迫用户不要更改 .gitignore 文件。我的意思是假设有人会更改或删除此文件并推送此更改。
3 回答
使用Gitolite,预接收 Hooks 称为VREFS(虚拟参考,也在这里列出):不要直接在由 gitolite 管理的 repos 中设置预接收钩子,通过在 repo 的 VREF
目录中添加 VREF 来做到这一点gitolite-admin
,而 Gitolite会将其传播到存储库。
“通过目录/文件名限制推送”部分说明了如何通过更改的目录和文件的名称来限制推送。
实际上,这是一个您不需要添加到VREF
目录中的 VREF(它是 Gitolite 管理的更新挂钩的一部分。有关二级更新挂钩,请参见此处)。
因此,修改repogitolite.conf
中的gitolite-admin
,并将该管理 repo 推回 gitolite 服务器就足够了。
repo foo
RW+ = @senior_devs
RW = @junior_devs
- VREF/NAME/Makefile = @junior_devs
Git 是去中心化的。一旦有人克隆了一个 repo,它就完全在他们的控制之下,包括.gitignore
文件。
您可以做的是通过使用检查指定文件类型并拒绝用户推送的Git 挂钩来阻止用户将某些文件推送到您的服务器。
阅读pre-receive hooks。并编写一个搜索给定文件类型的脚本。
检查您的存储库.git/hooks
,将有一个示例文件列表,向您展示如何处理它。另请阅读本文以避免容易犯错误。
编辑
我不擅长 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
可以在服务端设置预接收钩子,.gitignore
修改后拒绝推送。