git:假设未设置未更改的位

时间:2015-06-23 08:59:42

标签: git

我的仓库中有一个文件,我尝试设置假设未更改的位,但它仍然显示在我的非暂存文件列表中。当我列出所有设置了假设未更改位的文件时,我没有得到任何文件。以下是我所做的步骤。

/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)上却没有。我在这里做错了什么,或者在与此相关的新版本中有什么变化?

1 个答案:

答案 0 :(得分:0)

虽然版本之间的实际行为可能已更改,但这是一个实现细节。从根本上说,assume-unchanged是一种允许Git避免命中文件系统以查找更改的机制。这意味着Git 可以避免查看文件,这并不意味着Git 必须避免查看文件。

特别是,使用assume-unchanged位是而不是一种机制,使Git忽略对文件所做的更改。

From the documentation

  

当“假定未更改”位打开时,用户承诺不更改文件并允许Git假定工作树文件与索引中记录的文件匹配。如果要更改工作树文件,则需要取消设置该位以告知Git。当在具有非常慢的lstat(2)系统调用(例如cifs)的文件系统上处理大项目时,这有时很有用。

我发现这个主题的文档有点被动。 Junio Hamano(git的维护者)is more direct

  

假设 - 忽略机制不应滥用。它   是“我知道我的文件系统操作很慢。我会向Git承诺   我不会用这一点改变这些路径 - 那样,   Git没有必要检查我每次都改变了东西   要求'git status'输出“。这并不意味着什么   那。特别是,Git承诺Git永远不会承诺   考虑这些路径是未修改的 - 如果Git可以确定路径   标记为假设未更改的内容已更改而不会发生   额外的lstat(2)成本,它保留报告该路径的权利   已被修改(因此,“git commit -a”可以自由提交   那个改变)。