为什么我收到消息,“致命:这个操作必须在工作树中运行?”

时间:2009-09-21 21:16:41

标签: git

刚刚在Windows上安装了git。我将GIT_DIR变量设置为c:\ git \并验证此环境变量是由cygwin维护的(即echo $ GIT_DIR应该是什么)。我去了我想创建git存储库的文件夹,让我们说c:\ www,然后运行:

git init
git add .

然后我收到错误:

fatal: This operation must be run in a work tree

我不确定出了什么问题,但是c:\ git目录有一个配置文件说:

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

我很确定这不应该是裸露的,这是我们的问题。

16 个答案:

答案 0 :(得分:154)

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

答案 1 :(得分:46)

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

尽管如此,您可能需要在设置中加入一些思考。 GIT_DIR是用于所有git命令的存储库目录。您是否真的尝试为您跟踪的所有内容创建单个存储库,可能是您系统中的所有内容? git存储库本质上跟踪单个目录的内容。您需要将GIT_WORK_TREE设置为包含您要跟踪的所有内容的路径,然后您需要.gitignore来阻止您对跟踪不感兴趣的所有内容。

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

除非你有充分的理由,否则我建议坚持使用git喜欢的方式。如果你有几件要跟踪的东西,你可能需要几个存储库!

答案 2 :(得分:12)

万一发生在我身上的事情发生在别人身上,我需要这样说: 当我收到此错误时,我在我的项目中的.git目录中。我搜索并搜索了答案,但没有任何效果。我所要做的就是回到正确的目录。对我来说,这是一个面孔的时刻。 如果那里的其他人和我一样愚蠢,我希望你发现这个答案很有帮助。

答案 3 :(得分:9)

只需克隆另一个文件夹中的同一个项目,然后 .git / 文件夹 添加到您的项目中。

实施例

创建临时文件夹:

mkdir temp

切换到 temp 文件夹

cd temp/

克隆 temp 文件夹中的同一项目:

git clone [-b branchName] git@path_to_your_git_repository

将.git文件夹复制到您的项目:

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

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

如果您已完成,请

删除 temp 文件夹。

希望这会对某人有所帮助

答案 4 :(得分:6)

显式设置GIT_DIR环境变量强制git使用给定目录作为git存储库。在正常使用过程中从不需要它。

在您的示例中,因为指定了GIT_DIR并且未命名为.git(前导点很重要)并且您没有提供--work-tree选项或设置GIT_WORK_TREE环境变量,当您说git init时,您想要一个裸存储库。

由于裸存储库没有工作树,因此大量选择的命令对裸存储库没有意义。 git add只是一个。

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

答案 5 :(得分:5)

创建一个裸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
希望这可以帮助你

答案 6 :(得分:4)

这应该解决它:

git config --unset core.bare

答案 7 :(得分:3)

在我的情况下,我和我的repo的“.git”文件位于同一个文件夹中。我不得不进入一个目录级别,它解决了它。

答案 8 :(得分:1)

我遇到了这个问题,因为.git/config包含worktree = D:/git-repositories/OldName。我刚把它改成了worktree = D:/git-repositories/NewName

我发现了,因为我使用了git gui,它显示了更详细的错误消息:

git gui error

答案 9 :(得分:1)

如果现有(非裸露)结帐开始出现此错误,请检查.git / config文件;如果core.bare为真,则删除该配置行

答案 10 :(得分:0)

如果上述常用方法都不起作用,请查看此错误消息("fatal: This operation . . .")下面的调用跟踪,并找到引发实际错误的脚本和行。找到error()调用后,禁用它并查看您正在尝试的操作是否完成,即使有一些警告/消息 - 暂时忽略它们。如果是这样,最后在完成后可能会提到未成功完成的操作部分。现在,在适用的情况下单独说明这一部分。

将上述逻辑与我的情况相关联,当我尝试使用"fatal: This operation . . ."获取Android-x86代码时,我收到此错误消息repo sync . . .。并且调用跟踪显示raise GitError("cannot initialize work tree")作为error()调用导致上述错误消息("fatal: . . .")。因此,在对GitError()中的.repo/repo/project.py进行评论后,repo sync . . .继续并最终指出三个未正确同步的项目的错误。我刚刚在本地Android-x86源代码树的相关路径中删除了他们的*.git文件夹,并再次运行repo sync . . .并尝到了成功!

答案 11 :(得分:0)

我遇到了同样的问题,我做了以下步骤,

  1. git init
  2. git add。
  3. git commit -m&#34; inital setup&#34;
  4. git push -f origin master
  5. 然后它开始工作。

答案 12 :(得分:0)

编辑配置文件并进行更改 裸=真 至 裸=假

答案 13 :(得分:0)

如果似乎没有其他效果,请仔细检查git config core.worktree中的路径。如果该路径未指向您的工作目录,则可能需要更新它。

我收到此错误的方法是我在网络驱动器上创建了一个Git存储库。它在一台计算机上工作正常,但在另一台计算机上返回了此错误。原来,我已将驱动器映射到创建它的计算机上的Windows驱动器盘符上,而不是另一台计算机上,并且Git将工作树的路径保存为映射路径而不是UNC路径。

答案 14 :(得分:0)

此外,如果克隆到NTFS Ram Drive,显然会发生此错误。

答案 15 :(得分:0)

简单的 2 衬里解决方案:

1- 在您的代码存储库上执行此命令: git config --unset core.bare

2- 转到您的 git 存储库的配置文件并将其添加到核心标签下:

裸=假 worktree = /webroot/repo [你的根目录路径,在git文件夹上方一步]