我正在使用git,并进行了一个小的提交,然后是一个大的提交。我决定在推送之前使用git rebase将两个提交压缩在一起。(我以前从未这样做过。)

于是我做了:

我们回来了

这给了我一个编辑器,我选择选择较早的提交并删除较晚的提交。我攒钱的时候,少不要脸的人说:

错误:不能stat 'filename':权限被拒绝 不能为以后的提交应用sha1…提交的初始文本行

Now:

当我做git日志时,也没有提交。 git状态告诉我“当前不在任何分支上”。 一个文件被列为已修改并在索引中,两个文件被列为未跟踪。我的第一次提交只有一个文件(我想),而我的第二次提交有一打。

!发生了什么?我该怎么解决呢?


当前回答

我也遇到过类似的问题。但是解决起来很简单。 在一台Windows机器上,我的文件资源管理器打开了一个文件夹,它存在于一个分支中,但不存在于我签出的另一个分支中。 关闭文件资源管理器解决了这个问题。

其他回答

我只在Windows上见过这个错误,这似乎意味着当git试图应用补丁时,有什么东西阻止了它修改文件。

Windows倾向于在不必要的时候给予进程对文件的独占访问,在过去病毒检查一直是怀疑的来源之一,但我从未最终证明过这一点。

也许最简单的方法就是放弃,然后再试一次,希望下次不会发生这种情况。

git rebase --abort

你可以尝试使用git apply和commit git在做git rebase之前试图做的事情的知识——continue,但说实话,我不建议这样做。大多数时候,我看到这种尝试,有一个比偶数更好的机会,一些东西被不小心错过或搞砸了。

在Windows上,它可以是一个TortoiseGIT进程来阻止这些文件。 打开任务管理器,结束TGitCache.exe进程。

这通常发生在预处理软件/应用程序监视项目时,比如Prepros或Codekit。此外,Atom和Sublime(甚至notepad++)可以导致这种情况发生,如果项目中的文件当前正在编辑。

解决这个问题最简单的方法是关闭任何打开项目文件的文件,合并分支,然后重新打开它们以刷新它。这也将避免任何问题,即程序不再意识到已经发生的任何更改,迫使您手动刷新项目。

我也是在使用Git Shell的Windows机器上遇到同样的错误。

但是,当时我打开了多个Git终端。

第一个终端收到了你上面发布的错误,而另一个终端之前已经从yeoman运行了grunt服务终端命令(链接如下)。第二个终端需要保持打开状态以承载本地服务器实例。

关闭所有正在运行的进程的终端窗口可以使错误消失。

至少对我来说是这样的。在我关闭第二个终端窗口后,我可以轻松地签出不同的分支并操作文件。

咕哝服务命令-自耕农。I / O http://yeoman.io/learning/

此错误也可能是由于之前的git操作导致文件仍然处于“锁定”状态。它与Windows文件系统层的工作方式有关。我曾经读过一个很好的解释,但我不记得在哪里了。

然而,在这种情况下,由于它基本上是一个竞态条件,所以您所要做的就是继续中断的改基过程。不幸的是,这种情况一直发生在我身上,所以我写了这个危险的小助手来保持我的rebase运行:

#!/bin/sh

set -e

git checkout .
git clean -df
git rebase --continue

如果你想更加确定,你可以使用git rebase——edit-todo来检查下一个要应用的提交是否真的是之前应用失败的那个。使用git clean -dn来确保你不会删除任何重要文件。