Git clone防止克隆工作副本(非裸机)存储库

时间:2020-04-24 17:49:54

标签: git git-clone working-copy git-non-bare-repository

如果您克隆了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裸存储库一起使用,如果用于克隆工作副本,则应发出错误信号。

2 个答案:

答案 0 :(得分:2)

无法阻止您使用工作树来克隆存储库。当Git将内容提交到存储库中时,可以通过访问./password目录或其等效目录来访问它们,而无需检查或操纵工作树。

这实际上对安全性极为重要,因为您可以使用不受信任的存储库执行的唯一安全操作之一就是从该存储库进行克隆或获取。如果您被阻止这样做,将无法安全地从不受信任的存储库中获取数据。

您可以通过在相关存储库中运行.git(或使用git rev-parse --is-bare-repository)来检查本地存储库是否具有工作树。如果光秃秃的(即缺少工作树),它将打印-C,如果光秃秃的,则将打印true。您无法在无法通过本地文件系统(例如HTTPS或SSH远程)访问的存储库上进行检查,因为这将涉及您能够检查远程系统的文件系统,并且如果远程用户可以做到这一点。

我的建议是,不要过于担心这种情况,而不必尝试为此对抗Git。这种行为几乎没有实际问题,通常不应引起人们的关注。

答案 1 :(得分:1)

要增强bk2204's answer,您应该将工作树视为不是存储库的一部分 ...,因为在很强的意义上,它<不是存储库的一部分。由于工作树不是存储库的一部分,因此永远不会被git clone复制。这意味着这里没有问题。

(Git的索引和复制到索引中的文件至少在某种程度上是存储库的一部分,但索引本身并未被复制。Blob对象(文件内容)是通过以下方式新存储到Git存储库中的git add,但尚未提交,可以潜在地被复制,尽管通常在克隆过程中不应复制未引用的对象。重新克隆至少一次,回到Git 1.5.5 / Git 1.6-ish天,但是从未git add编辑过的工作树文件在< em>存储库数据库,这些是克隆过程中复制的数据库。)

相关问题