基本上,我只是想使用 git 作为一种版本化的单向 FTP。
我在 有一个本地 git repo local/
。我想将其推送到server:remote/
,然后我希望所有文件都在remote
服务器上签出(与本地显示的内容相同,假设我git-add
编辑了所有内容)
换句话说,我想重现 Mercurial 的这种行为:
[hooks]
changegroup.update = hg update && echo updated successfully.
我发现很多教程都是在服务器端使用两个单独的目录来实现这一点,但我更愿意使用一个目录。这可能吗?当我尝试时,我收到了下面的消息,我不太明白。
这样做的最佳做法是什么?(如果有必要,你可以假设我从未在服务器上更改任何东西,因此--force
更改某些东西不会有问题。)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
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.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
答案1
我想从 Mercurial 重现这种行为:
和最近的git 版本,错误消息中提到的设置现在支持一个新值:
[receive]
denyCurrentBranch = updateInstead
这应该会给你你想要的行为。
- http://databio.org/posts/push_to_deploy.html
- https://blog.tfnico.com/2015/05/a-better-way-to-git-push-to-deploy.html
我发现很多教程都是在服务器端使用两个独立的目录来实现这一点的
另外,您也可以仍然使用大部分这些教程,通过推送到不同的分支(即,不是当前签出的那个,而是类似的deploy
)。
git push origin master:deploy
现在,您可以使用类似(甚至相同)的post-receive
或post-update
钩子,就像推送到裸存储库一样。例如,钩子可以运行git merge --ff-only deploy
或甚至git reset --hard deploy
。
答案2
在第一次提交到远程仓库之前,为了避免error: refusing to update
我被迫这样做:
git config receive.denycurrentbranch ignore
要启用自动结账,只需设置
git config receive.denycurrentbranch updateInstead