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

Git clone prevent from cloning working copy (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 克隆非零退出状态?

如果不是,那么如何检查存储库位置(url,或目录路径)是否包含裸存储库,以便我可以在克隆之前在 bash 中对其进行测试。

请注意,存储库的工作副本并不一定意味着它是本地的,因为它也可以被远程共享。

在我的例子中,git 克隆应该只允许与 git 裸存储库一起工作,如果用于克隆工作副本则发出错误信号。

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

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

您可以通过 运行 git rev-parse --is-bare-repository 在有问题的存储库中检查本地存储库是否有工作树(或使用 -C)。如果它是裸露的(即缺少工作树),它将打印 true,如果不是,它将打印 false。您不能在无法通过本地文件系统(例如 HTTPS 或 SSH 远程)访问的存储库上检查它,因为这将涉及您能够检查远程系统的文件系统,如果远程用户可以,这将是一个安全问题这样做。

我的建议是不要过分担心这种情况,而不是试图为此争吵 Git。这种行为几乎不会造成实际问题,通常不应引起关注。

要扩充 ,您应该将 工作树 视为 不是存储库的一部分 ... 因为从某种意义上说,它 不是 存储库的一部分。由于工作树 不是 存储库的一部分,因此它永远不会被 git clone 复制。这意味着这里没有问题。

(Git 的索引和复制到索引中的文件至少是存储库的一部分,但索引本身不会被复制。Blob 对象——文件内容——被新存储到 Git 存储库中,通过 git add,但尚未提交,可以 可能 被复制,尽管通常不应该复制未引用的对象在克隆期间。我很确定我至少在 Git 1.5.5 / Git 1.6 左右的日子里在新克隆中发现了未引用对象的实例至少一次。但是 工作从未 git add 编辑过的树 文件在 存储库 数据库中根本没有表示,这些是在克隆期间复制的内容。)