git:防止非加者删除/重命名文件



在git -我怎么能防止一个人删除/重命名/移动他没有添加的文件?也许是一些commit hook?我更喜欢在本地进行检查,即尽快在服务器端进行检查。下面是查看谁添加了文件的方法:

git log --diff-filter=A --pretty=format:"%an" <file>

在我的案例中,它不是关于创建一个无法绕过的防弹安全机制,而是一个"提醒"。参赛队伍必须遵守上述规则。我不希望我的团队操纵钩子,但我确信重命名/移动可能会错误地发生。

注意git不跟踪单个文件,"重命名/移动"这只是基于文件内容比较的猜测。

您可以在git help diff中查看-M,-C,--find-copies-harder-l选项的描述。

还有:除非提交者必须签署他们的提交,否则"作者姓名";是纯粹的信息,可以设置为任何值。

你可能仍然尝试使用git来检测这些重命名,并添加一个钩子(正如@JoachimSauer正确评论的那样:服务器端的中央钩子)来拒绝它们,但要知道这些检查可能会以某种方式被绕过(例如:我可以先创建一个文件config.copy,其内容是foobar, push它,然后更新它使其具有与config相同的内容)。

取决于您的存储库保存的内容(代码?1个文件= 1篇博客文章?一本书的章节?),你可能需要进一步考虑你想忽略的内容。


为了识别重命名,所有处理显示提交信息的git命令(git diff,git show,git log)都有一个--name-status选项。

下面是一个例子:

$ git diff --name-status HEAD^ HEAD
R097    a.txt   aa.txt
$ git log -1 --format=""
R097    a.txt   aa.txt

根据您使用的钩子,您应该查看的差异会有轻微的变化:

  • pre-commit钩子(客户端,在每次提交之前运行)中,您应该查看阶段差异:
git diff --cached --name-status
  • pre-push钩子(客户端,在每次推送之前运行)中,你可能想看看:
git diff --name-status $remote_sha...$local_sha

(有关名称的解释,请参阅git提供的示例预推送脚本)

  • pre-receive钩子中(服务器端,在接受推送之前运行),你可能想看看:
git diff --name-status $old_sha...$new_sha

(参见文档部分的预接收钩子)

然后,您可以查找以R开头的行,并检查"创建器"第一个文件名与最近提交的作者匹配。