3

有什么理由强迫用户不要更改 .gitignore 文件。我的意思是假设有人会更改或删除此文件并推送此更改。

4

3 回答 3

4

使用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
于 2013-02-13T14:26:16.467 回答
3

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
于 2013-02-13T14:15:01.540 回答
2

可以在服务端设置预接收钩子,.gitignore修改后拒绝推送。

于 2013-02-13T14:12:53.037 回答