0

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

4

2 回答 2

2

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

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

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

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

于 2020-04-24T21:18:44.113 回答
1

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

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

于 2020-04-24T22:34:36.357 回答