git - Git 忽略对文件的本地更改
问题描述
我在 Git-Extensions 中开始提交以添加对文件的更改myfile
。然后我想我点击了我不想点击的地方,现在我所做的任何更改myfile
都被 git 忽略了。我已经关闭了 git-extensions 并且只在 powershell 中运行。
如果我更改文件,则git status
没有区别。但是如果我添加文件git add myfile
(尽管没有理由假设它没有被跟踪,它在最后一次提交中被更改)然后git status
仍然不会显示它。如果我删除.gitignore
,那么.gitignore
会出现git status
但myfile
仍然不会。
如果我更改远程文件并执行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
工作,但之后我就开始了:没有确认本地更改。
我从未观察到这种行为,我无法重现它。如何进一步调试并解决问题?
现在找到了解决方案:
解决方案
有两个不太公开的标志assume-unchanged
和skip-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]'
推荐阅读
- sql - 如何根据字符获取子字符串并从右侧开始读取字符串
- python - 为什么 ArgumentParser add_argument 不接受这个论点?
- c++ - 带有类模板的c ++多态性,没有要调用的匹配函数
- zurb-foundation - Zurb Foundaion CLI 在基本主题上无法识别 Zurb Stack
- javascript - html中的快速框弹出错误不起作用
- java - 如何按 Y 值对实体的 ArrayList 进行排序?
- c# - EventSystem.current.IsPointerOverGameObject() 在 MouseEnter 事件中返回 false
- python - 为超级用户排除某些字段
- angular - 生产构建删除份额
- python - 如何从 PVlib 确定形状怪异的每小时 PV 功率输出曲线的问题