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

刚安装在Windows上的git。 我将GIT_DIRvariables设置为c:\ git \,并validation了这个环境variables是由cygwin维护的(即echo $ GIT_DIR就是它应该是的)。 我去了我想创buildgit仓库的文件夹,让我们说c:\ www,然后运行:

git init git add . 

然后我得到错误:

 fatal: This operation must be run in a work tree 

我不知道出了什么问题,但c:\ git目录有一个configuration文件,说:

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

我很确定这不应该是光秃秃的,这是我们的问题。

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

不过,您可能需要在这里设置一些思路。 GIT_DIR是用于所有git命令的存储库目录。 你真的试图为你跟踪的所有东西创build一个单一的存储库,也许是你的系统上的所有东西? 本质上,git仓库跟踪单个目录的内容。 您需要将GIT_WORK_TREE设置为包含您要跟踪的所有内容的path,然后您需要一个.gitignore来阻止您不感兴趣的所有内容。

也许你正在试图创build一个只会跟踪c:\www的仓库? 那么你应该把它放在c:\www (不要设置GIT_DIR)。 这是git的正常用法,存储库位于“模块”顶级目录的.git目录中。

除非你有一个很好的理由,否则我会build议坚持git喜欢的方式。 如果你有几件事要跟踪,你可能需要几个存储库!

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

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

在你的例子中,因为已经指定了一个GIT_DIR并且它没有被命名为.git (前导点很重要),并且你没有提供一个--work-tree选项或者设置了GIT_WORK_TREE环境variables,当你说git init

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

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

只要在另一个文件夹中克隆相同的项目, 并将 .git /文件夹复制到您的项目。

创build临时文件夹:

 mkdir temp 

切换到临时文件夹

 cd temp/ 

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

 git clone [-b branchName] git@path_to_your_git_repository 

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

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

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

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

希望这会帮助别人

为了防止发生在我身上的事情发生在别人身上,我需要这样说:当我得到这个错误时,我在我的项目的.git目录中。 我search和search答案,但没有任何工作。 我所要做的就是回到正确的目录。 对我来说,这是一个脸掌的时刻。 如果还有其他人像我一样愚蠢,我希望你发现这个答案有帮助。

创build一个纯粹的GIT存储库

小咆哮:git无法自行创build一个正常的裸仓库。 愚蠢的git确实。

确切地说,克隆空的存储库是不可能的。 所以一个空的仓库是一个无用的仓库。 事实上,你通常创build一个空的仓库,并立即填写:

 git init git add . 

但是,创build裸存储库时,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 

解决scheme是在别处创build另一个存储库,在该存储库中添加一个文件,并将其推送到裸存储库。

 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 

希望这可以帮助你

如果没有上述常用的方法可以帮助您,请查看此错误消息下面的调用跟踪( "fatal: This operation . . ." ),并find引发实际错误的脚本和行。 find该错误()调用后,将其禁用并查看您尝试的操作是否完成,即使出现一些警告/消息 – 现在就忽略它们。 如果是这样,最后在完成之后可能会提到没有成功完成的部分操作。 现在,分别适用这个部分。

把上面的逻辑关系到我的情况,我得到这个错误消息"fatal: This operation . . ." 当我试图通过repo sync . . .获取Android-x86代码时repo sync . . . repo sync . . . 。 并且调用跟踪显示了raise GitError("cannot initialize work tree")上述错误消息( "fatal: . . ." raise GitError("cannot initialize work tree")的error()调用引发了raise GitError("cannot initialize work tree") "fatal: . . ." )。 所以,在.repo/repo/project.py中的GitError()注释之后, repo sync . . . repo sync . . . 继续,最后指出三个项目没有正确同步的错误。 我刚从本地的Android-x86源码树中的相关path中删除了他们的*.git文件夹,并运行了repo sync . . . repo sync . . . 再次尝到成功!

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

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

git gui错误