在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
开头的行,并检查"创建器"第一个文件名与最近提交的作者匹配。