3

我来自 SVN,我不明白整个 Git 是如何工作的。我已经创建了一个远程仓库,在我的本地机器上克隆了这个仓库——如果我对本地机器上的文件进行更改并尝试将这些文件推送到我克隆的确切远程仓库,我会收到这样的错误。

远程:错误:拒绝更新签出分支:refs/heads/master

我浏览了一些关于同一问题的 SO 问题,最流行的解决方案是创建一个裸存储库,然后提交给它。那么当我从那个新的 repo 克隆时会发生什么——这会再次发生吗?我应该继续为本地的每次提交创建新的裸仓库吗?我很困惑,如果有人能指出我正确的方向,那就太好了。我认为我这样做是完全错误的。

我正在遵循的确切步骤:1)在远程服务器中创建一个目录-init as git repo 2)将我需要的所有内容复制到服务器中 3)将内容添加到 git 并在那里提交 4)将 git repo 从远程克隆到我的本地机器 5) 对我本地的文件进行了更改,将更改添加到我的本地并提交。6)当我尝试将本地所做的更改推送到远程使用时: git push origin 我收到错误消息。我在下面提供了整个错误消息。

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: Auto packing the repository for optimum performance.

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'.
 ! [remote rejected] master -> master (branch is currently checked out)
4

2 回答 2

2

裸存储库是您通常应该推送的唯一存储库,因为非裸存储库意味着有需要更新的签出文件的副本。如果您有两个您控制的存储库,并且您希望它们都具有数据的签出副本,git pull则从两个位置使用从对面的位置提取。一方面,您可以进行克隆,但另一方面,您必须使用git remote add才能创建要从中提取的遥控器。

一个简单的 repo 可以让你进入它,因为你知道你并没有搞乱签出副本的 in-the-middle-of-doing-something 概念。

如果您还没有阅读“gittutorial”的手册页,我会从那里开始,因为它们是开始学习的好地方。

至于一个好的工作模型,我经常有一台(服务器)机器,里面有一个裸仓库,并且经常在包括服务器本身在内的多台其他机器上克隆该仓库。因此,如果我在服务器上的 repo 上工作,我不会从裸 repo 工作(显然),我克隆它并在其他地方工作并推入它。这让每个克隆都可以推入“主”裸仓库并从中提取。它使同步更容易一些,尤其是当某些副本并不总是在线时。

注意:没有“错误的方式”或“最好的方式”。每个人都有自己喜欢的存储库处理方式。这是分布式存储库系统(git 或其他)的更好的部分之一:它让每个用户做最适合自己的事情。

于 2012-07-11T14:06:45.587 回答
2

共享/远程存储库使用裸格式,这意味着它们没有工作副本。Subversion 是一样的——中央存储库没有工作副本。工作副本是通过 subversion 中的签出和 git 中的克隆创建的。

如果您将远程存储库更改为裸格式,该问题将不会继续发生。

工作流程与颠覆没有显着不同,只是一个额外的步骤(或两个,取决于您使用的命令)

Make changes
git add (to add the changes to the staging area)
git commit (to save the changes to the local repo)
git push (to push the changes to the remote repo)

当您想从远程仓库中拉取其他人的更改时,您可以执行“git pull”,其功能类似于“svn update”。

于 2012-07-11T14:08:42.723 回答