Git 忽略对文件的本地更改
Git ignores local changes to file
我在 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
不会隐藏 myfile
。我可以删除 myfile
然后 git pull
可以工作,但在那之后我就回到了开始的地方:没有确认本地更改。
我从未观察到这种行为,也无法重现。我该如何进一步调试并解决问题?
既然找到了解决方案:
我一定是不小心点到了这里
有两个不太公开的标志,assume-unchanged
和 skip-worktree
,可以在本地存储库中的文件上设置,并在本地版本控制中“隐藏”它们。
这些标志可以是 set/unset 和 git update-index
, and you can spot files who have one (or both) of these flags using git ls-files -v
,并检查每行开头的状态字母。
根据我们在评论中的讨论:显然,某些操作在您的文件上设置了该标志。
您现在知道如何发现这些文件,以及如何取消设置该标志。
我不精通 Git-Extensions,您可能会找到一种方法来从其 GUI 执行相同的操作 (set/unset/list)。
This SO question 包含相当完整的参考 --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]'
正如您已经发现的那样,有几种方法可以忽略 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
不会隐藏 myfile
。我可以删除 myfile
然后 git pull
可以工作,但在那之后我就回到了开始的地方:没有确认本地更改。
我从未观察到这种行为,也无法重现。我该如何进一步调试并解决问题?
既然找到了解决方案:
我一定是不小心点到了这里
有两个不太公开的标志,assume-unchanged
和 skip-worktree
,可以在本地存储库中的文件上设置,并在本地版本控制中“隐藏”它们。
这些标志可以是 set/unset 和 git update-index
, and you can spot files who have one (or both) of these flags using git ls-files -v
,并检查每行开头的状态字母。
根据我们在评论中的讨论:显然,某些操作在您的文件上设置了该标志。
您现在知道如何发现这些文件,以及如何取消设置该标志。
我不精通 Git-Extensions,您可能会找到一种方法来从其 GUI 执行相同的操作 (set/unset/list)。
This SO question 包含相当完整的参考 --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]'
正如您已经发现的那样,有几种方法可以忽略 git 和 Git 扩展中的文件更改。
这些选项也通过每个文件的上下文菜单显示在“提交”对话框中:
您还可以更改过滤器以查看更多或更少: