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


83

刚刚在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

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


1
GIT_DIR是与CVSROOT完全不同的概念!
innaM

Answers:


54

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

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

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

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


10
1.我们仅关注Linus T.的“ 20条命令中的日常GIT”和git-init(1)manpPage(不幸的是,它可能已经过时了?)2.您的帖子仅表明出了什么问题,但没有给出任何建议有关如何处理的线索

54
只是git config --unset core.bare
Matthias Urlichs,2015年

blj的答案解决了我的问题,但是在该子文件夹中,通过使用git branch命令,我可以列出分支,但无法执行git checkout -b feature22。这是否意味着列出分支不需要工作的树,但要签出它呢?
亲爱的

203

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


7
我见过的最好的答案!应该是公认的答案。
GeertVc

这是最好的答案。我见过 小问题。小解决方案。爱它。
阿里(Ariful Islam)

2
有没有办法抑制此消息?
roachsinai

大声笑...你得到了我。+1
fungusanthrax

17

以防万一我发生的事情正在别人身上发生,我需要这样说:当我收到此错误时,我在项目的.git目录中。我搜寻并搜寻答案,但没有任何效果。我要做的就是回到正确的目录。对我来说,这真像是个脸红的时刻。万一还有其他人像我一样傻,我希望您觉得这个答案有用。


1
类似的经验。就我而言,我使用的是GitExtensions(适用于Windows),并且在尝试打开存储库时,我单击了打开.git文件而不是包含文件夹。最初看起来不错,但是当我开始实际执行任何操作时却给了我树错误。
thund

1
我喜欢这有十二个投票。我很高兴我发布了这个答案,即使它看起来很明显。
Jacob Zimmerman

12

只是克隆在另一个文件夹相同的项目和复制git的/文件夹到您的项目。

创建临时文件夹:

mkdir temp

切换到临时文件夹

cd temp/

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

git clone [-b branchName] git@path_to_your_git_repository

将.git文件夹复制到您的projet中:

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

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

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

希望这会帮助某人


1
我发现这很有用,但是我不得不说第一行足以让我意识到出了什么问题。其余的内容实际上使我有些困惑。无论如何,还是非常感谢:)
randombee '16

@randombee这对我有用。。。但为什么?这是做什么的?
Yatharth Agarwal


8

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

在您的示例中,由于指定了aGIT_DIR且未命名.git(前导点很重要),并且您未提供任何--work-tree选项或设置GIT_WORK_TREE环境变量,因此您在说时需要一个裸存储库git init

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

您是否有特定的原因需要在git存储库中使用非标准位置,而不是在.git工作树根目录下的子文件夹中?尽管可以安排它,但它往往需要更多的工作并且更容易出错。


设置GIT_WORK_TREE为我解决了它。我使用GIT_DIR的原因是,我需要一个单独的git repo作为我的工作副本,其中我有一个后台任务,每隔几分钟就会添加/提交一次。此过程将GIT_DIR设置为.gitsave。我的实际回购工作是在.git中。现在,我有一个本地实时跟踪存储库,因此我拥有更改它们时所有文件的版本。
MikeJansen

6

创建一个裸露的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

希望这可以帮助你


1
这很简单。您可以创建一个裸存储库并将其克隆。即使是正确的,它仍然不能解决问题。(例如$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CB Bailey

抱歉,如果我使用“ <>”打包“裸存储库的URL或路径”,将看不见。我说的好处真的很有用。我进行了自我测试。
user1329261

4

我有这个问题,因为.git/config包含在内worktree = D:/git-repositories/OldName。我刚改成worktree = D:/git-repositories/NewName

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

git gui错误


1
我使用git bash并收到消息fatal: this operation must be run in a work tree。修改配置文件为我修复了它。
pawellipowczan

4

就我而言,我的存储库与“ .git”文件位于同一文件夹中。我不得不上一级目录,它解决了它。


2

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

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


1

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


0

如果以上任何一种常用方法都无法帮助您,请查看此错误消息("fatal: This operation . . .")下方的调用跟踪,然后找到引发实际错误的脚本和行。找到该error()调用后,将其禁用,看看您尝试执行的操作是否完成,甚至带有一些警告/消息-现在将其忽略。如果是这样,最后在完成后可能会提到操作未成功完成的部分。现在,酌情单独处理此部分。

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


0

我遇到了同样的问题,我按照以下步骤操作,

  1. git初始化
  2. git添加
  3. git commit -m“初始设置”
  4. git push -f原始主机

然后它开始工作。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.