在考虑从SVN转移到git时,一位同事提出了一个担忧:恶意或不小心的开发人员可以使用git rebase
从我们共享的代码库中删除远程历史。
编辑:正如答案中指出的那样,也可以使用git push origin :branch-name
从远程代码库中删除整个分支。
这是一个现实的问题吗?如果是,我们应该采取什么措施来防止它发生?
在考虑从SVN转移到git时,一位同事提出了一个担忧:恶意或不小心的开发人员可以使用git rebase
从我们共享的代码库中删除远程历史。
编辑:正如答案中指出的那样,也可以使用git push origin :branch-name
从远程代码库中删除整个分支。
这是一个现实的问题吗?如果是,我们应该采取什么措施来防止它发生?
你考虑过receive.denyNonFastForwards
和receive.denyDeletes
配置参数吗?据我所知,这些参数在Git 1.6及以上版本中可用。
来自《Pro Git》:
如果你重新整理已经推送的提交,然后再次尝试推送,或者以其他方式尝试将提交推送到不包含当前指向远程分支的提交的远程分支,你将被拒绝。这通常是一个很好的策略;但在重新整理的情况下,您可能会确定自己知道自己在做什么,并可以使用-f
标志强制更新远程分支到您的推送命令。receive.denyNonFastForwards
。不要将推送权限授予您不信任的开发人员。
当仓库共享时,不要混淆历史记录,如果需要从不同的分支添加内容,请使用合并或挑选而不是rebase。在这种情况下,历史记录不会受到影响。
您可以保持不在共享仓库上使用'push -f'的策略,在这种情况下,开发人员将知道如果推送被拒绝,则出现了问题(很可能是本地分支与远程分支不一致),应该在本地解决问题,而不是强制推送。
关于如何防止使用Gerrit修订系统的问题,它就像是在开发人员本地代码库和主代码库之间进行提交的中间步骤,并提供了一个良好的网络界面进行修订。您可以授权任何人将更改推送到修订代码库,但是在验证和批准后,更改将合并到您的主分支中(这需要一些通常授予核心开发人员的权限)。您可以在Mahara项目上查看其外观:https://reviews.mahara.org 在这种特殊情况下,只允许gerrit bot将更改推送到主分支(即here),其他人不行。
企业级 Git 服务器(如 Gerrit)有一些扩展功能,可以检测历史重写和分支删除,并将它们备份到特殊的引用下,以便在需要时进行恢复,并且不会被垃圾回收清除。如果出于法律原因需要,Gerrit 管理员仍然可以选择性地删除提交记录。