[英]Prevent git committers from creating certain directories
有没有办法阻止git提交者在存储库中创建目录。
我们有一些开发人员错误地将文件放在目录结构中。 应该在的文件
a/b/c/file
最终进入
a/a/b/c/file
我只是想阻止创作
a/a/*
它需要明显地发生,以便他们知道他们的文件没有被提交......因此,简单地忽略a/a/*
是不够的。
有没有办法做到这一点?
一些人指出,提交者应该“接受培训”,不要这样做。 那里有一些缺陷:
因此,需要一种自动化方法。
使用2x4线索的用户教育应该是首选。 对于技术解决方案,您可以阻止它们使用合适的提交挂钩在本地进行此类提交。 但是,它们可能也无法安装钩子。 因此,你只需要实现一个拒绝推送的钩子。 您可以使用更新挂钩执行此操作,该挂钩可以在将提交写入中央存储库之前拒绝提交。 这是一个这样的钩子脚本:
#!/bin/sh
#
# update hook - args: refname sha1-old sha1-new
ref="$1"
old="$2"
new="$3"
if [ -z "$ref" -o -z "$old" -o -z "$new" ]; then
echo >&2 "usage: $0 <ref> <oldrev> <newrev>"
exit 1
fi
for badpath in a/a a/z/x; do
if git ls-tree $new:$badpath >/dev/null; then
bogus=$(git ls-tree -r --name-only $new $badpath)
echo >&2 "REJECTED DUE TO BOGUS PATH \"$bogus\""
exit 1
fi
done
exit 0
如果我们创建一个简单的裸存储库并将其添加为hooks / update并使其可执行(在Windows上,我们不需要这样做 - 无论如何都会执行钩子)。 然后克隆存储库并添加一个禁止的路径(如示例中的/ b / c /文件)。 这是我推送此提交时得到的结果:
C:\Users\Pat\AppData\Local\Temp\x\L>git push origin master
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (7/7), 423 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote: REJECTED DUE TO BOGUS PATH "a/a/b/c/file"
remote: error: hook declined to update refs/heads/master
To C:/Users/Pat/AppData/Local/Temp/x/R
! [remote rejected] master -> master (hook declined)
error: failed to push some refs to 'C:/Users/Pat/AppData/Local/Temp/x/R'
这说明了两件事。 首先,这些钩子脚本实际上非常简单,可以在一些临时存储库中创建和测试。 您回显到stderr或stdout的任何内容都会被复制到推送用户。 第二 - 这也适用于Windows(至少在使用Git for Windows时)。
提交钩子在用户本地存储库上工作并且不那么令人讨厌,但是你有一个问题就是确保所有本地克隆都有正确的钩子。 这在服务器端处理起来要简单得多。
这将完成阻止创建子目录a
,但它不是理想的,更好的答案可能是训练:
ln -s . a
git add a
git commit -m "Create top-level self-referential symlink to stifle subdirectory creation"
子模块(在评论中提出)是一个选项,但这不会阻止用户创建a/a
,它可能只是阻止他推入不相关的目录。
您可以创建一个git挂钩,检查文件夹a/a/
是否放置了文件,如果发生这种情况则拒绝推送。 结帐git挂钩: http : //git-scm.com/book/en/Customizing-Git-Git-Hooks
你可能正在寻找pre-receive
挂钩。 然后,你只需要编写自己的脚本 - 不应该太难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.