Git filter-branch在工作目录干净的情况下报告工作目录不干净

10

我试图在我的git仓库中重写历史记录,因为我需要删除一个包含限制信息的文件。

具体情况如下:

$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILE' master
Cannot rewrite branch(es) with a dirty working directory.

所以我认为“这很奇怪,我相当确定我没有未提交的更改”,然后我运行:

$ git status -u
# On branch master
nothing to commit (use -u to show untracked files)

这里发生了什么事情?有人知道可能发生了什么吗?这个代码库中有子模块。

子模块阶段信息

我有18个子模块(全部是Vim插件),下面是它们的状态。我认为这可能是有用的信息。

$ for i in $(ls); do cd $i; git status -u; cd ..; done;
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# On branch master
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)
# Not currently on any branch.
nothing to commit (working directory clean)

其他信息

$ git diff-files --ignore-submodules --quiet
$ echo $?
1
$ git diff-index --cached --quiet HEAD --
$ echo $?
0

你尝试在运行git status之后再次尝试使用filter-branch了吗?也许只是文件的时间戳发生了变化,而filter-branch没有检查以删除脏标记。 - Tobias Kienzler
我非常确定不是这个问题。我已经在所有的子模块中运行了git status命令,它们都有干净的工作目录。 - dwlz
1
git status -u 显示什么?您是否尝试删除任何未跟踪的文件或在全新克隆上执行此操作? - X-Istence
3
你粘贴的命令没有提供子模块状态,而是多次给出相同的超级模块状态。请检查以下命令的退出状态: "git diff-files --ignore-submodules --quiet", "git diff-index --cached --quiet HEAD --"。 - drizzd
@X-Istence git status -u 显示相同的输出。 - dwlz
显示剩余6条评论
1个回答

7

我不能确定,但这个错误可能是由一个漏洞造成的,该漏洞在你最初发帖之后发布的git v1.7.7.1中被修复。从提交信息来看:

在开始之前,Filter-branch已经要求我们拥有一个干净的工作树。然而,在检查之前它未能刷新索引,这意味着在stat-dirtiness情况下它可能是错误的。


在1.7.7.1之前(我使用的是1.7.0.4),你可能需要强制Git刷新索引。我发现可以通过运行git stash,然后再运行git stash apply来实现这一点,就好像你有一个脏的工作目录一样(取自这个问题)。Git会抱怨,但是filter-branch应该能够正常工作。如果有人有更少hacky的方法,请在这里提出! - J-P
4
@J-P:我的答案中提供的修复链接会导致 git filter-branch 运行以下命令来刷新索引:git update-index -q --ignore-submodules --refresh - Richard Hansen
升级到1.8.3.4版本后,这个问题就被解决了。 - Dan Bolser
我在尝试将一个目录拆分为单独的仓库时遇到了这个问题。 - Chris Conover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接