撤消git update-index-假定未更改的<文件>


462

Git忽略观看/跟踪特定目录/文件的方式。您只需运行以下命令:

git update-index --assume-unchanged <file>

现在,您如何撤消操作,以便再次监视它们?(我们称其为未假设。)


5
仅需说明一下,似乎skip-worktree很可能比假设不变的要好用,除非git的性能是您的问题。 stackoverflow.com/questions/13630849/...
GreenAsJade

Answers:


587

要获取设置为假定不变的撤消/显示目录/文件,请运行以下命令

git update-index --no-assume-unchanged <file>

要获取assume-unchanged运行此目录的目录/文件

git ls-files -v|grep '^h'


7
对grep语句进行了较小的改进,它可以使用'^ [az]'来捕获所有忽略的文件,因为第一个字母标签可以是'H'/'h'以外的其他字母。来自git-scm.com/docs/git-ls-files:此选项在每行的开头用以下标记(后跟一个空格)标识文件状态:H ::缓存S ::跳过工作树M: :未合并R ::删除/删除C ::修改/更改K ::被杀死?::其他
Bdoserror

8
另一个有用的技巧是git ls-files -v|grep '^h'|cut -c3-,它将只为您提供文件名,而没有“ h”前缀。
Retsam 2014年

9
如果您不知道自己要assume-unchanged使用的文件,请使用git update-index --really-refresh。使用该命令,您无需首先查找文件git ls-files
theDmi

102

如果这是您经常使用的命令-您可能还希望考虑为其使用别名。添加到您的全局.gitconfig

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

如何设置别名(如果您还不知道):

git config --configLocation alias.aliasName 'command --options'

例:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

将其保存到后.gitconfig,您可以运行一个更清洁的命令。

git hide myfile.ext

要么

git unhide myfile.ext

这个git文档非常有帮助。

根据注释,这也是查找当前隐藏哪些文件的有用别名:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
这个别名也很方便:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

git update-index函数有几个选项,您可以找到以下键入内容:

git update-index --help

在这里,您会找到各种选项-如何使用功能update-index。

[如果您不知道文件名]

git update-index --really-refresh 

[如果您知道文件名]

git update-index --no-assume-unchanged <file>

将恢复通过忽略列表添加的所有文件。

git update-index --assume-unchanged <file>

git的更新索引--really刷新,取消所有的假设未发生变化的,我发了,谢谢你的提示
塞尔吉奥

git update-index --no-assume-unchanged <file>挽救了我的命。.好的,我可以再次同步该文件夹,但是我确实想要针对此问题的“真正”解决方案。
Cagatay Ulubay

38

我认为(他)你的意思是--assume-unchanged,因为我看不到任何--assume-changed选择。的倒数--assume-unchanged--no-assume-unchanged


32

要综合来自@ adardesign,@ adswebwork和@AnkitVishwakarma的出色原始答案,以及来自@ Bdoserror,@ Retsam,@ seanf和@torek的评论,以及其他文档链接和简洁的别名...

基本命令

重置文件假设未发生变化恢复正常:

git update-index --no-assume-unchanged <file>

列出所有假定不变的文件:

git ls-files -v | grep '^[a-z]' | cut -c3-

要将所有假定不变的文件恢复为正常,请执行以下操作:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

注意:此命令已在其他地方列出,似乎不再能重置所有假定不变的文件(我相信它以前曾经作为解决方案,并且以前已将其列出为解决方案):

git update-index --really-refresh

捷径

为了使这些常见任务易于在git中执行,请为您的用户添加/更新以下别名部分.gitconfig(例如~/.gitconfig,在* nix或macOS系统上):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
对于git hidden,您可以使用shell别名或脚本来达到相同的效果,!如下所示:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refresh不会(或不再这样做,也许曾经这样做)清除索引文件上的假设不变的标志。
torek

谢谢@torek!我确认了您描述的行为,并使用针对“全部重置”情况的其他解决方案更新了答案。
隐该会

20

如果要撤消所有已应用且假定处于任何状态的文件,并且不撤消所有状态,不仅要缓存(git用小写字母将它们标记为小写),还可以使用以下命令:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v 将打印所有文件及其状态
  2. grep '^[a-z]' 将过滤文件并选择仅假定不变
  3. cut -c 3- 从第3个字符到最后一个字符将删除状态并仅保留路径
  4. tr '\012' '\000' 将行尾字符(\ 012)替换为零字符(\ 000)
  5. xargs -0 git update-index --no-assume-unchanged将通过零字符分隔的所有路径传递git update-index --no-assume-unchanged给撤消

这很有用。感谢您提供详细信息!
Chamithra Thenuwara

11

添加到@adardesign的答案中,如果您想一次重置所有已添加到assume-unchanged列表中的文件,则no-assume-unchanged可以执行以下操作:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

这只会删除grep ie输出的两个字符"h ",然后转义文件名中可能存在的任何空格,最后|| true将防止命令过早终止,以防循环中的某些文件出错。


4

如果您使用的是Git Extensions,请按照以下步骤操作:

  1. 转到提交窗口。
  2. 单击名为工作目录更改的下拉列表。
  3. 选择显示假定不变的文件选项。
  4. 右键单击要取消声明的文件。
  5. 选择不做任何假设不变

大功告成


0

这里没有什么不包括在内。但是想加我的2美分。有时,我运行一个构建,它会更改许多文件,然后我想处理某些东西,因此此命令确实对我有很大帮助。

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

希望其他人也觉得它有用。


我认为使用.gitignore忽略构建工件将使您受益。
尼克

1
我有,.gitignore但是有时候,以我的经验还不够。但我了解您所说的上下文。
Tyagi Akhilesh

0

在Windows中,所有解决方案都不适合我-它似乎使用大写字母H而不是h文件状态,并且grep命令需要额外的插入符号,因为它^也表示行的开头以及下一个字符的取反。

Windows解决方案

  1. 打开Git Bash并转到相关的顶级目录。
  2. git ls-files -v | grep '^^H' 列出所有未缓存的文件
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree 撤消通过以下方式跳过的所有文件的文件 update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged 撤消通过以下方式跳过的所有文件的文件 update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' 再次列出所有未缓存的文件并检查以上命令是否有效-现在应该不返回任何内容

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.