Why am I getting the message, "fatal: This operation must be run in a work tree?"

Just installed git on Windows. I set the GIT_DIR variable to be c:\git\ and verified that this environment variable is maintained by cygwin (i.e. echo $GIT_DIR is what it should be). I went to the folder that I wanted to create the git repository for, let's say c:\www, and then ran:

git init
git add .

Then I get the error:

fatal: This operation must be run in a work tree

I'm not sure what went wrong, but the c:\git directory has a config file that says:

[core]
repositoryformatversion = 0
filemode = false
bare = true
symlinks = false
ignorecase = true

I'm pretty sure this shouldn't be bare and that's our problem.

242874 次浏览

出现这个错误的直接原因是,是的,不可能在一个空的存储库中使用 git-add。根据定义,裸库没有工作树。git-add从工作树中获取文件并将它们添加到索引中,为提交做准备。

不过,您可能需要对这里的设置进行一些思考。GIT _ DIR 是用于所有 GIT 命令的存储库目录。您是否真的想要为您跟踪的所有内容创建一个单一的存储库,也许是系统中的所有内容?Git 存储库本质上跟踪单个目录的内容。您需要将 GIT_WORK_TREE设置为一个包含您想要跟踪的所有内容的路径,然后需要一个 .gitignore来屏蔽您不感兴趣的跟踪内容。

也许您正在尝试创建一个只跟踪 c:\www的存储库?然后应该将其放在 c:\www中(不要设置 GIT _ DIR)。这是 git 的正常用法,存储库位于。你的“模块”的顶级目录的 git 目录。

除非你有一个很好的理由,否则我建议你坚持 Git 喜欢的工作方式。如果您需要跟踪多个内容,那么您可能需要多个存储库!

显式地设置 GIT_DIR环境变量强制 git 使用给定的目录作为 git 存储库。正常使用时从不需要。

在您的示例中,由于指定了一个 GIT_DIR,但它没有命名为 .git(前面的点很重要) ,并且您没有提供一个 --work-tree选项或设置 GIT_WORK_TREE环境变量,所以当您说到 git init时,您需要一个空的存储库。

因为裸库没有工作树,所以大量的命令选择对于裸库是没有意义的。git add只是其中之一。

您需要为您的 git 存储库使用非标准位置,而不是在工作树根目录下的 .git子文件夹中,是否有特殊的原因?虽然这是可能的安排这往往是更多的工作和更容易用户的错误。

创建一个空白的 GIT 存储库

一个小小的抱怨: git 无法自己创建一个普通的裸仓库。

确切地说,不可能克隆空存储库。所以一个空的存储库就是一个无用的存储库。实际上,您通常会创建一个空存储库并立即填充它:

git init
git add .

但是,当您创建一个空的存储库时,git add 是不可能的:

git --bare init
git add .

给出了一个错误: “足以致命: 此操作必须在工作树中运行”。

你也不能去查:

Initialized empty Git repository in /home/user/myrepos/.git/
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server?


git --bare init
git update-server-info # this creates the info/refs file
chown -R <user>:<group> . # make sure others can update the repository

解决方案是在其他地方创建另一个存储库,在该存储库中添加一个文件,然后将其推送到裸存储库中。

mkdir temp; cd temp
git init
touch .gitignore
git add .gitignore
git commit -m "Initial commit"
git push (url or path of bare repository) master
cd ..; rm -rf temp

希望这个能帮到你

另外,您可能位于.git 子文件夹中,将一个文件夹上移到您的项目根目录。

只是 clone同一个项目在另一个文件夹和 收到. git/文件夹到您的项目。

例子

创建临时文件夹:

mkdir temp

切换到 临时工文件夹

cd temp/

临时工文件夹中克隆相同的项目:

git clone [-b branchName] git@path_to_your_git_repository

copy .git folder to your projet:

cp -R .git/ path/to/your/project/

切换到您的项目并运行 git status

如果完成了,删除 临时工文件夹。

希望这能帮到某人

以防发生在我身上的事也发生在别人身上,我得说:
当我得到这个错误时,我在我的项目中的 .git目录中。
I searched and scoured for answers, but nothing worked.
我所要做的就是返回到正确的目录 ( cd .. )
对我来说,这是一个面对面交流的时刻。
如果还有人像我一样愚蠢,我希望这个答案对你有所帮助。

如果上述通常的方法都不能帮助您,请查看此错误消息("fatal: This operation . . .")下的调用跟踪,并找到引发实际错误的脚本和行。一旦您找到了 error ()调用,禁用它,看看您正在尝试的操作是否完成,即使有一些警告/消息-现在忽略它们。如果是这样,最后在完成它之后可能会提到操作中没有成功完成的部分。现在,根据具体情况分别处理这一部分。

将上面的逻辑与我的案例联系起来,当我试图使用 repo sync . . .获得 Android-x86代码时,我得到了这个错误消息 "fatal: This operation . . ."。调用跟踪将 raise GitError("cannot initialize work tree")显示为导致上述错误消息("fatal: . . .")的 error ()调用。因此,在评论了 .repo/repo/project.py中的 GitError()之后,repo sync . . .继续并最终指出了三个没有正确同步的项目的错误。我只是删除了他们的 *.git文件夹从他们的相关路径在 Android-x86源代码树本地和运行 repo sync . . .和尝试成功!

I had this issue, because .git/config contained worktree = D:/git-repositories/OldName. I just changed it into worktree = D:/git-repositories/NewName

我发现了这一点,因为我使用了 Git gui,它显示了一个更详细的错误消息:

git gui error

我也遇到过同样的问题,我按照步骤做了,

  1. 走吧
  2. Git add.
  3. Git commit-m“ inital setup”
  4. Git push-f 原点控制器

然后就开始起作用了。

在我的案例中,我和他在同一个文件夹里。我的回购文件。我不得不去一个目录层,它解决了它。

如果现有的(非空的)签出开始出现此错误,请检查您的。Git/config 文件; 如果 core.bare为 true,则删除该配置行

这应该能解决问题:

git config --unset core.bare

编辑配置文件并更改 赤裸 = 真实 到 bare = false

如果似乎没有其他工作,在 git config core.worktree中再次检查路径。如果这条路径没有指向你的工作目录,你可能需要更新它。

我得到这个错误的方法是在网络驱动器上创建了一个 Git 存储库。它在一台计算机上运行良好,但在另一台计算机上返回此错误。事实证明,我在创建驱动器的计算机上将驱动器映射到一个 Windows 驱动器号,但在另一台计算机上没有,Git 将到工作树的路径保存为映射路径,而不是 UNC 路径。

此外,显然,这个错误将发生,如果你克隆到 NTFS 内存驱动器。

简单的2班轮解决方案:

1- Execute this command on your code repo: Git config —— unset core.bare

2-转到你的 git repo 的配置文件,在 core 标签下添加:

裸露 = 虚假 worktree = /webroot/repo [Path to your root directory,one step above the git folder]

在我的情况下,它是从 Github 的一边 他们的服务器正在维护或更新 you can check the status of github services in this link: Https://www.githubstatus.com/

项目目录中的以下命令修复了我的问题

git --work-tree=/path/to/work/tree

To get your project path, enter the pwd command in your project directory if you are using Linux or MacOs