之前我使用过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
时,它会拒绝它,因为它不是“裸存储库”。
有没有办法
hg up
之类的操作 - 是git checkout
,以便内容在mysite.com上立即显示(在任何地方使用任何Web浏览器) 更新
似乎通常的做法是推动一个简单的回购......但我们不能使用一个简单的回购并使(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'
吗?
答案 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。
所以你有两个选择:
mysite.com.git
)和一个非裸存储库(mysite.com
)。在裸存储库中,向post-update
git --git-dir=.../mysite.com pull
挂钩
只创建一个存储库并且:
脱头:git checkout master@{0}
向post-update
git merge master
挂钩
醇>
这里的原因是git拒绝修改签出分支,但是如果你取消选中分支,你就可以推送。并且您将能够从钩子更新工作目录(钩子是放置在存储库中的hooks
目录中的脚本)。您可以创建一个单独的分支并检查它,或者您可以使用“分离的HEAD”状态(如上所述 - git通过具有指向分支的特殊引用“HEAD”来记住检出哪个分支,但是如果你检查了一些东西,这不是一个分支,它被直接指向一个修订版,它被称为“分离分支”,因为没有分支被检出,允许你推送到其中任何一个。)
答案 4 :(得分:-2)
您应该只推送到裸存储库(裸存储库没有工作副本)。
您有两种解决方案: