昨天,我发布了一个关于如何从我的一台机器克隆Git存储库到另一台机器的问题,我如何从另一台机器“克隆Git”?

现在我可以成功地将Git存储库从源存储库(192.168.1.2)克隆到目标存储库(192.168.1.1)。

但是当我对文件进行编辑,git commit -a -m "test"和git push时,我在目的地(192.168.1.1)上得到了这个错误:

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

我正在使用两个不同版本的Git(远程上的1.7版本和本地机器上的1.5版本)。这是一个可能的原因吗?


当前回答

最好的方法是:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

这将克隆存储库,但不会在…/remote中生成任何工作副本。如果查看远程,您将看到创建了一个名为currentrepo的目录。Git,这可能是你想要的。

然后从本地Git存储库中:

git remote add remoterepo ..../remote/currentrepo.git

进行更改后,您可以:

git push remoterepo master

其他回答

我相信大多数看到这个问题的人会止步于前两个重要的答案,但我仍然想提供我的解决方案。

当遇到描述的错误时,我有一个Eclipse + EGit web项目设置。帮助我的是使用GitHub应用程序,它似乎神奇地解决了这个问题。虽然EGit总是拒绝推送,但GitHub桌面应用程序只会耸耸肩,推送我的更改。也许它能更优雅地处理多次登录的情况。

您应该只推送到一个裸露的存储库。裸存储库是指没有检出分支的存储库。如果要cd到一个裸存储库目录,则只能看到.git目录的内容。

我刚刚在Heroku上部署git存储库时遇到了这个问题。

我不知道为什么Heroku在他们的一方有一个非裸库,但作为一个变通办法,我能够重置远程库,并重新加载。

你不应该使用Heroku的存储库副本作为你唯一的git存储库进行协作,但为了以防万一,我要明确地说:除非你确定你有一个存储库的完整副本安全地存储在Heroku之外的地方,否则不要这样做。重置操作将删除存储库内容。

重置:

如果您还没有安装Heroku工具带(其中包含命令行客户端)。 如果你还没有安装heroku-repo插件。 Heroku插件:安装https://github.com/heroku/heroku-repo.git 执行重置,删除存储库并创建一个新的空存储库 heroku回购:重置 像往常一样按下Heroku遥控器;它会重新加载所有内容。

错误消息描述发生了什么。更现代的Git版本在分支签出时拒绝通过推送更新该分支。

在两个非裸存储库之间工作的最简单方法是

总是通过pull(或fetch和merge)来更新存储库,如果必须的话, 通过推入到一个单独的分支(导入分支),然后将该分支合并到远程机器上的主分支。

这个限制的原因是推送操作只能在远程Git存储库上操作,它不能访问索引和工作树。因此,如果允许的话,对签出分支的推操作将使HEAD与远程存储库上的索引和工作树不一致。

这将非常容易意外地提交一个更改来撤销所有已推送的更改,也使得很难区分尚未提交的任何局部更改和新HEAD、索引和工作树之间的差异,这些差异是由推送移动HEAD引起的。

你有三种选择

又拉又推: git拉;git推 推入不同分支: Git push origin master:foo 并在远程合并它(通过git或pull-request) Git合并foo 强制执行(不推荐,除非你故意通过rebase改变提交): Git push origin master -f 如果仍然被拒绝,禁用远程存储库上的denyCurrentBranch: git config receive.denyCurrentBranch ignore