如何解决在“git status”中未显示的未暂存更改问题

12
考虑。
$ git status
On branch chore/nbsp-fix-2
nothing to commit, working directory clean
$ git rebase -i master
Cannot rebase: You have unstaged changes.
Please commit or stash them.
如何确定未暂存的更改是什么,以防止 git rebase?有些文件名含有非断行空格(%A0),导致这个问题。用 git status 命令会显示这些文件为未跟踪状态,而 Git 认为该存储库是脏的。我使用的解决方法是在这些更改之前创建一个新的分支,然后挑选几个提交记录以后将它们应用到新分支上。不幸的是,我现在陷入了这种情况。我猜想可能还有其他文件或那个问题的其他遗留物阻止了我前进。在选择了错误文件名后面的单个提交记录之后,我现在处于这种情况。 我正在寻找解决这个问题的建议。rebase 究竟发生了什么,status 没有看到什么呢?

1
尝试使用 git diff-files 命令,它会显示什么?这就是 rebase 检查的内容。 - jthill
@jthill,如果您提供正确的答案,我会给您信用。git diff-files(和git diff)提供了答案。 - Bill Door
发生了什么?我习惯于它是一个未跟踪和被状态忽略的文件,但在新的检出中被跟踪,因此git拒绝对其进行覆盖,但这里发生的不是这种情况,我很好奇到底发生了什么。 - jthill
2个回答

5
原来 git rebase 是一个位于 /usr/libexec/git-core/git-rebase 的 shell 脚本,搜索该目录中的 "have unstaged changes",只会得到一个结果,在 git-sh-setup 中的这个函数:
require_clean_work_tree () {
    git rev-parse --verify HEAD >/dev/null || exit 1
    git update-index -q --ignore-submodules --refresh
    err=0

    if ! git diff-files --quiet --ignore-submodules
    then
        echo >&2 "Cannot $1: You have unstaged changes."
        err=1
    fi

[ ... ]

并且rebase确实会调用它。因此,回答你的问题,请尝试使用git diff-files命令。

谢谢,这就是我想要的。git diffgit diff-files显示了一个由git-fat管理的0长度文件引起了问题。存在针对长度为0的过滤文件的错误。 - Bill Door
报告中甚至提供了一个补丁。我已经为此提交了一个拉取请求。 - jthill
这就是我找出问题所在的方式。我也可以验证修改解决了这个问题。 - Bill Door
1
“git diff-files” 显示了这个文件。但现在怎么办?该文件位于我移出仓库并重新添加为符号链接的目录中。因此,git 对此感到困惑。但现在怎么办? - donquixote
你正在运行哪个版本的git? - jthill

0

虽然与 OP 的问题不太相关,但希望对其他人有所帮助。在我的情况下,git status 没有在特定文件夹下的 repo 中看到新文件。它们可以手动提交,但在取消提交时会再次消失。原因在于 .git/info/exclude 文件中找到了一些东西,这个文件不知何故是非空的,显然是由我以前的某个IDE生成的,很久以前。


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