[如果您克隆了git工作副本(带有工作树的存储库),请更改一些文件,提交并尝试推送您将收到一条消息:
remote: error: refusing to update checked out branch: refs/heads/master
...
! [remote rejected] master -> master (branch is currently checked out)
对我来说,这是可以理解和想要的行为。
我想防止意外克隆存储库的工作副本。
如何防止git clone克隆工作副本而不是远程裸仓库,并在尝试克隆工作副本的情况下发出错误信号?
是否有任何命令行开关在尝试克隆工作副本而不是裸远程存储库的情况下导致git clone非零退出状态?
如果没有,那么如何检查存储库位置(URL或dir的路径)是否包含裸露的存储库,以便在克隆之前我可以在bash中对其进行测试。
请注意,存储库的工作副本不一定表示它是本地的,因为它也可以被远程共享。
在我的情况下,应仅允许git clone与git裸存储库一起使用,如果用于克隆工作副本,则应发出错误信号。
无法阻止您使用工作树来克隆存储库。当Git将内容提交到存储库中时,可以通过访问.git
目录或其等效文件来使用它们,而无需检查或操纵工作树。
这实际上对安全性极为重要,因为可以使用不受信任的存储库进行的唯一安全操作之一就是从该存储库进行克隆或获取。如果您被阻止这样做,将无法安全地从不受信任的存储库中获取数据。
您可以通过在相关资源库中运行git rev-parse --is-bare-repository
(或使用-C
)来检查本地资源库是否具有工作树。如果它是光秃秃的(即缺少工作树),它将打印true
,如果不是光秃秃的,它将打印false
。您无法在无法通过本地文件系统(例如HTTPS或SSH远程)访问的存储库上进行检查,因为这将涉及您能够检查远程系统的文件系统,并且如果远程用户可以做到这一点。
我的建议是不要过分担心这种情况,而应该尝试在此问题上与Git对抗。此行为几乎没有实际问题,通常不应引起关注。