首页 > 解决方案 > Git 忽略对文件的本地更改

问题描述

我在 Git-Extensions 中开始提交以添加对文件的更改myfile。然后我想我点击了我不想点击的地方,现在我所做的任何更改myfile都被 git 忽略了。我已经关闭了 git-extensions 并且只在 powershell 中运行。

如果我更改文件,则git status没有区别。但是如果我添加文件git add myfile(尽管没有理由假设它没有被跟踪,它在最后一次提交中被更改)然后git status仍然不会显示它。如果我删除.gitignore,那么.gitignore会出现git statusmyfile仍然不会。

如果我更改远程文件并执行git pull,git 将确认我的本地文件:

error: Your local changes to the following files would be overwritten by merge:
        myfile
Please commit your changes or stash them before you merge.
Aborting
Updating 09ad056..eef460f

但我不能提交(因为我不能添加)并且git stash不会 stash myfile。我可以删除myfile然后git pull工作,但之后我就开始了:没有确认本地更改。

我从未观察到这种行为,我无法重现它。如何进一步调试并解决问题?

现在找到了解决方案:

我一定是不小心点击了这里
在此处输入图像描述

标签: gitgit-extensions

解决方案


有两个不太公开的标志assume-unchangedskip-worktree,可以在本地存储库中的文件上设置,并将它们从本地版本控制中“隐藏”。

可以使用 设置/取消设置这些标志git update-index,您可以使用 发现具有这些标志中的一个(或两个)的文件git ls-files -v,并检查每行开头的状态字母。

根据我们在评论中的讨论:显然,某些操作在您的文件上设置了该标志。
您现在知道如何发现这些文件,以及如何取消设置该标志。

我不精通 Git-Extensions,您可能会找到一种从其 GUI 执行相同操作(设置/取消设置/列表)的方法。


这个 SO 问题包含一个非常完整的参考--assume-unchanged

# set the flag :
git update-index --assume-unchanged <file>

# unset the flag :
git update-index --no-assume-unchanged <file>

# check for lines where the status letter is in *lowercase* :
git ls-files -v

# using grep :
git ls-files -v | grep '^[a-z]'

--skip-worktree使用类似的命令:

# set the flag :
git update-index --skip-worktree <file>

# unset the flag :
git update-index --no-skip-worktree <file>

# check for lines where the status letter is 'S' (or 's') :
git ls-files -v

# using grep :
git ls-files -v | grep '^[Ss]'

推荐阅读