【问题标题】:Git clone prevent from cloning working copy (non bare) repositoryGit clone 防止克隆工作副本(非裸)存储库
【发布时间】:2020-08-08 09:13:00
【问题描述】:

如果您克隆 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-clone working-copy git-non-bare-repository


    【解决方案1】:

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

    (Git 的索引和复制到索引中的文件至少在某种程度上是存储库的一部分,但索引本身没有被复制。Blob 对象——文件内容——新存储到 Git 存储库中,通过git add,但尚未提交,可能可能被复制,尽管在克隆期间通常不应该复制未引用的对象。我很确定我在新克隆中找到了未引用对象的实例至少有一次,回到 Git 1.5.5 / Git 1.6-ish 的日子。但是 working tree 从未被git add-ed 的文件在 repository 数据库,这些是在克隆期间复制的。)

    【讨论】:

      【解决方案2】:

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

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

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

      我的建议是不要太担心这种情况,而不是试图在这方面与 Git 抗争。这种行为几乎不会造成实际问题,通常不应该引起关注。

      【讨论】: