无法git克隆服务器上的文件夹,然后编辑和git push?

时间:2011-04-18 13:03:49

标签: git

之前我使用过Mercurial(Hg),可以在本地PC上做一些事情:

hg clone ssh://peter@hostingcompany.com/~/mysite.com

然后将有一个名为mysite.com的本地文件夹,我可以编辑其内容,提交并说出hg push并将其推送到服务器。当然,为了让内容显示在“工作目录”中,我必须在那里ssh并执行hg up

使用Git,如果我这样做,在服务器上,做一个

git init
git add .
git commit -m "ok"

在本地电脑上做一个

git clone ssh://peter@hostingcompany.com/~/mysite.com

但是当我编辑文件和git push ssh://peter@foo.com/~/mysite.com master时,它会拒绝它,因为它不是“裸存储库”。

有没有办法

  1. 无论如何推它,比如Hg?
  2. 或者,更好的是,推送它并自动执行hg up之类的操作 - 是git checkout,以便内容在mysite.com上立即显示(在任何地方使用任何Web浏览器)

  3. 更新

    似乎通常的做法是推动一个简单的回购......但我们不能使用一个简单的回购并使(2)上面的工作?如果这是一种实用的方式,那么我们就不必坚持“推动裸机回购”规则了吗?

    如果仍有其他原因需要推送到服务器上的裸仓库并克隆......那么:

    如果服务器有~/mysite.com~/other_folder等目录,那么mysite.com的回购应该在哪里? mysite.com是网站的内容,因此,如果我放置index.html,那么世界上任何浏览器都可以看到它。那么创建一个裸仓库,让~/mysite.com克隆它,并在本地PC上,在本地PC上自动使用git push <path> master; ssh <path> "cd to that folder and do git checkout to update the content"一行是不错的?该行是git push ssh://peter@hostingcompany.com/~/mysite.com master; ssh ssh://peter@hostingcompany.com/~/mysite.com 'git pull; git checkout'吗?

5 个答案:

答案 0 :(得分:5)

我不知道为什么人们说它不受支持。虽然推荐使用裸仓库,但是您可以通过将receive.denyCurrentBranch配置变量设置为'ignore'或'warn'来推送到非裸机,如您收到的错误消息所示(至少在1.7上) .1)当你尝试这样做时:

remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.

我想说你使用git push进行部署,然后在远程端进行硬重置的工作流正是创建此配置变量的规则的例外。

另外,我没有亲自尝试过,但是“当前分支”语言意味着您可以推送到签出且没有任何错误的远程分支,之后您可以在远程端进行快速合并到已签出的分支。

答案 1 :(得分:0)

在Git中,将其他人推送到服务器上的repo作为裸存储库通常是一种很好的做法。强烈推荐。

git init . --bare

这是失败的原因,因为你正在推动非裸(带有工作副本)仓库以及检出的分支。

答案 2 :(得分:0)

在Git中,你只能推送到一个裸存储库。最好的解决方案是在您推送到的服务器上创建一个裸存储库,然后在其中包含结帐的非裸存储库,因此在您推送到裸存储库之后,您将SSH连接到服务器并执行{{1来自非裸仓库(或设置hook)在裸仓库收到新版本后自动执行此操作。)

答案 3 :(得分:-1)

Git不支持推送到远端检出的分支。

推荐的方法是在服务器上使用裸存储库。通常,您要么推送到存储库(并使其裸露),要么继续工作,但不是两者兼而有之。即使你想在服务器上有一个工作副本,我建议你看看this question

所以你有两个选择:

  1. 创建一个裸存储库(mysite.com.git)和一个非裸存储库(mysite.com)。在裸存储库中,向post-update
  2. 添加git --git-dir=.../mysite.com pull挂钩
  3. 只创建一个存储库并且:

    1. 脱头:git checkout master@{0}

    2. post-update

    3. 添加git merge master挂钩

      这里的原因是git拒绝修改签出分支,但是如果你取消选中分支,你就可以推送。并且您将能够从钩子更新工作目录(钩子是放置在存储库中的hooks目录中的脚本)。您可以创建一个单独的分支并检查它,或者您可以使用“分离的HEAD”状态(如上所述 - git通过具有指向分支的特殊引用“HEAD”来记住检出哪个分支,但是如果你检查了一些东西,这不是一个分支,它被直接指向一个修订版,它被称为“分离分支”,因为没有分支被检出,允许你推送到其中任何一个。)

答案 4 :(得分:-2)

您应该只推送到裸存储库(裸存储库没有工作副本)。

您有两种解决方案:

  • 从您的远程存储库中提取(然后它将要求解决冲突)
  • 使您的远程存储库成为一个
编辑我的猜测远程仓库有本地修改是错误的;不知道为什么你不能推,但我的帖子的其余部分仍然有效:你不应该推到正常的回购。