我的仓库中有一个文件,我尝试设置假设未更改的位,但它仍然显示在我的非暂存文件列表中。当我列出所有设置了假设未更改位的文件时,我没有得到任何文件。以下是我所做的步骤。
/tmp/GitIssue on master ✗
❯ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hi.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
/tmp/GitIssue on master ✗
❯ git update-index --assume-unchanged hi.txt
/tmp/GitIssue on master ✗
❯ git ls-files -v | grep ^h | cut -c 3-
/tmp/GitIssue on master ✗
❯ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hi.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
这曾经在我的笔记本电脑上使用早期版本的git(~1.6),但在当前版本(2.4.4)上却没有。我在这里做错了什么,或者在与此相关的新版本中有什么变化?
答案 0 :(得分:0)
虽然版本之间的实际行为可能已更改,但这是一个实现细节。从根本上说,assume-unchanged
是一种允许Git避免命中文件系统以查找更改的机制。这意味着Git 可以避免查看文件,这并不意味着Git 必须避免查看文件。
特别是,使用assume-unchanged
位是而不是一种机制,使Git忽略对文件所做的更改。
当“假定未更改”位打开时,用户承诺不更改文件并允许Git假定工作树文件与索引中记录的文件匹配。如果要更改工作树文件,则需要取消设置该位以告知Git。当在具有非常慢的lstat(2)系统调用(例如cifs)的文件系统上处理大项目时,这有时很有用。
我发现这个主题的文档有点被动。 Junio Hamano(git的维护者)is more direct:
假设 - 忽略机制不应滥用。它 是“我知道我的文件系统操作很慢。我会向Git承诺 我不会用这一点改变这些路径 - 那样, Git没有必要检查我每次都改变了东西 要求'git status'输出“。这并不意味着什么 那。特别是,Git承诺Git永远不会承诺 考虑这些路径是未修改的 - 如果Git可以确定路径 标记为假设未更改的内容已更改而不会发生 额外的lstat(2)成本,它保留报告该路径的权利 已被修改(因此,“git commit -a”可以自由提交 那个改变)。