刚刚在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
我很确定这不应该是裸露的,这是我们的问题。
答案 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,它显示了更详细的错误消息:
答案 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)
我遇到了同样的问题,我做了以下步骤,
然后它开始工作。
答案 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文件夹上方一步]