git-pull不能在没有工作树的情况下使用。

10

我试图从一个我刚刚设置的远程仓库拉取代码,但是我收到了这个消息:git-pull不能在没有工作树的情况下使用。

我读了很多资料,似乎都指向我的 .git 目录,但看起来一切正常。

git branch

输出结果

* master

git ls-tree --full-tree -r HEAD

列出很多这样的条目

100644 blob c825c0607f77e1df4e05920037a2ce09c08e5180app/assets/javascripts/ready.js

这看起来是正确的,让我觉得我已经成功地将文件推送到了这个仓库?

git status

输出结果

fatal: This operation must be run in a work tree

执行

ls -l .git

命令会输出:

drwxrwxr-x 2 roy roy 4096 Feb  6 14:24 branches
-rw-rw-r-- 1 roy roy   66 Feb  6 14:24 config
-rw-rw-r-- 1 roy roy   73 Feb  6 14:24 description
-rw-rw-r-- 1 roy roy   23 Feb  6 14:24 HEAD
drwxrwxr-x 2 roy roy 4096 Feb  6 14:24 hooks
drwxrwxr-x 2 roy roy 4096 Feb  6 14:24 info
drwxrwxr-x 4 roy roy 4096 Feb  6 14:24 objects
drwxrwxr-x 4 roy roy 4096 Feb  6 14:24 refs

这似乎有点奇怪,因为它看起来就像推送之前一样。

有人能帮我看看我做错了什么吗? 在进行git pull之前,我需要做些什么吗?我是否被ls-tree命令搞混了,文件还没有被推送?


3
你要拉取的是一个裸库吗? - cHao
1
@cHao。是的,我执行了git --bare init。然后在客户端上,我使用git remote add origin roy@.......连接到它并推送。客户端上的git ls-remote命令返回168c3cb6118b84b495810cd9295eb41dc23b7fa1 HEAD和168c3cb6118b84b495810cd9295eb41dc23b7fa1 refs/heads/master。 - RoyTheBoy
1
好的,正如Git所告诉你的那样,这些操作在没有工作树的情况下是没有意义的(裸仓库没有工作树)。因为没有工作树,所以也就没有状态(status),你也不能进行合并操作(合并可能会产生冲突,因此需要工作树来解决这些问题)。 - Nevik Rehnel
@Nevik。那么我出了什么问题?我的客户端上有我的代码,我在另一台机器上设置了一个服务器。我试图在服务器上设置一个仓库并将代码推送到其中,然后从仓库中获取我的代码并放到服务器上。 - RoyTheBoy
2
如果你想要两个工作副本,那么你还需要一个裸版本库(bare repo),两个副本都可以推送(push)和拉取(pull)的,并且你只需要通过推送(push)或获取(fetch)来修改裸版本库中的东西。否则,事情会变得非常奇怪。 - cHao
显示剩余4条评论
1个回答

18

看起来你正在使用一个裸仓库。

裸仓库就像普通仓库一样,只是没有关联的工作目录。因为 pullfetchmerge 的组合,所以不能应用于裸仓库。

具体而言:

Git 仓库实际上只是一个包含一组特定元数据的 .git 目录(例如 refs 目录存储本地和远程分支,objects 目录包含所有文件内容等等)。

通常情况下,Git 仓库都有一个名为工作目录的关联目录。这个工作目录是某个提交的检出:开发者可以使用该工作目录对源代码进行修改,从而准备下一个提交。

但有时并不需要工作目录。最常见的情况是当仓库托管在共享服务器上,并且被用作开发者集成其代码的中心共享位置时。仓库必须保存所有信息(因此,它有自己的 .git 目录副本),开发者可以将其贡献推送到仓库中,但没有开发者直接在其中工作。因此,不提供工作目录。这就是一个裸仓库。

现在有一些 Git 命令需要在工作目录上操作。由于裸仓库没有工作目录,因此这些命令不能在裸仓库上运行。

其中一个命令是 git pullgit pullgit fetchgit merge 的组合。现在,git fetch 仅涉及 .git 目录,因此可以在裸仓库上执行。另一方面,git merge 要求在工作目录上进行合并。由于没有工作目录,该命令将失败。

pullmerge不是唯一无法在裸仓库上执行的命令。 我强烈建议您查看此交互式地图,该地图将帮助您选择哪些操作不能在裸仓库上执行(查看神奇的交互式Git备忘单)。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接