推送到裸Git存储库(远程)会导致它停止裸存储

推送到裸Git存储库(远程)会导致它停止裸存储,git,push,Git,Push,我有一个名为TestRepo的本地存储库。我用-bare选项克隆它,把这个克隆压缩,然后把它扔到我的服务器上。解开它,它还是空的 然后通过ssh在本地克隆裸远程存储库,方法如下 git clone ssh://git@host.com/~/TestRepo.git TestRepoCloned 本地TestRepoCloned不是空的,它有一个名为origin的远程。从其配置文件的外观来看,它似乎正在正确跟踪 [core] repositoryformatversion = 0

我有一个名为TestRepo的本地存储库。我用-bare选项克隆它,把这个克隆压缩,然后把它扔到我的服务器上。解开它,它还是空的

然后通过ssh在本地克隆裸远程存储库,方法如下

git clone ssh://git@host.com/~/TestRepo.git TestRepoCloned
本地TestRepoCloned不是空的,它有一个名为origin的远程。从其配置文件的外观来看,它似乎正在正确跟踪

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ssh://git@host.com/~/TestRepo.git
[branch "master"]
    remote = origin
    merge = refs/heads/master
我编辑一个现有的文件。我通过将更改提交给当前分支主控

git commit -a -m "Edited a file."
提交成功,一切正常

我决定通过SSH和

git push
远程存储库现在不再是空的,而是有一个完整的工作目录,我会在所有进一步尝试推送到它时收到连续的错误消息


我所读到的一切似乎都表明我所做的是正确的,但它根本不起作用。我该如何将更改推送到一个简单的远程回购协议上,并让它保持简单

这不应该发生。我的猜测是,可能存在某种hook脚本post-receive,这会导致签出,或者Git中有一个bug。这两种情况都不太可能发生,但这是我唯一能想到的。

可能是zip/unzip不保留文件权限,例如可执行位,因此会激活一些以前停用的挂钩。您可能希望检查服务器上的钩子权限,或者跳过整个zip部分,直接在服务器上创建裸存储库,并使用常规git push上传数据。

顺便说一下,查看SCP样式的URL。ssh://git@host.com/~/TestRepo.git变为git@host.com:TestRepo.git,它更干净。当它神奇地变为非裸时,工作树会去哪里?通常非裸存储库称为.git,位于工作树的根目录中。不过,您的远程存储库名为TestRepo.git。SCP样式的URL似乎不起作用,也不会使任何内容更干净。您已经接近了。它似乎很好地保留了可执行位,但我解压缩的hooks目录只包含.sample文件。所有这些文件中的所有内容都被注释掉了,所以我不知道可能在运行什么,但是如果我在服务器上执行init-bare,然后在本地远程添加origin,我看不出问题。在这种情况下,hooks目录中有更多的文件,尽管我不知道为什么。本地机器和服务器都运行相同的Git版本,但本地是OS X,远程是RedHat之类的。钩子是机器的私有钩子,它们从不被克隆、推送或拉取。示例钩子是由您正在使用的Git的任何版本在本地创建的。如果你的客户机和服务器有不同版本的Git,它们会创建不同的示例钩子。我从来没有在任何地方接触过任何钩子目录,所以如果Git创建的东西在我对现有存储库进行裸克隆时无法移动到另一台机器,那么我肯定会觉得这是一个bug。