Answers:
要获取设置为假定不变的撤消/显示目录/文件,请运行以下命令:
git update-index --no-assume-unchanged <file>
要获取assume-unchanged
运行此目录的目录/文件:
git ls-files -v|grep '^h'
git ls-files -v|grep '^h'|cut -c3-
,它将只为您提供文件名,而没有“ h”前缀。
assume-unchanged
使用的文件,请使用git update-index --really-refresh
。使用该命令,您无需首先查找文件git ls-files
。
如果这是您经常使用的命令-您可能还希望考虑为其使用别名。添加到您的全局.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-
hidden = ! git ls-files -v | grep '^h' | cut -c3-
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 update-index --no-assume-unchanged <file>
挽救了我的命。.好的,我可以再次同步该文件夹,但是我确实想要针对此问题的“真正”解决方案。
要综合来自@ 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-
git hidden
,您可以使用shell别名或脚本来达到相同的效果,!
如下所示:hidden = ! git ls-files -v | grep '^h' | cut -c3-
--really-refresh
不会(或不再这样做,也许曾经这样做)清除索引文件上的假设不变的标志。
如果要撤消所有已应用且假定处于任何状态的文件,并且不撤消所有状态,不仅要缓存(git用小写字母将它们标记为小写),还可以使用以下命令:
git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
git ls-files -v
将打印所有文件及其状态grep '^[a-z]'
将过滤文件并选择仅假定不变cut -c 3-
从第3个字符到最后一个字符将删除状态并仅保留路径tr '\012' '\000'
将行尾字符(\ 012)替换为零字符(\ 000)xargs -0 git update-index --no-assume-unchanged
将通过零字符分隔的所有路径传递git update-index --no-assume-unchanged
给撤消添加到@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
将防止命令过早终止,以防循环中的某些文件出错。
如果您使用的是Git Extensions,请按照以下步骤操作:
大功告成
这里没有什么不包括在内。但是想加我的2美分。有时,我运行一个构建,它会更改许多文件,然后我想处理某些东西,因此此命令确实对我有很大帮助。
git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`
希望其他人也觉得它有用。
.gitignore
忽略构建工件将使您受益。
.gitignore
但是有时候,以我的经验还不够。但我了解您所说的上下文。
在Windows中,所有解决方案都不适合我-它似乎使用大写字母H
而不是h
文件状态,并且grep命令需要额外的插入符号,因为它^
也表示行的开头以及下一个字符的取反。
Windows解决方案
git ls-files -v | grep '^^H'
列出所有未缓存的文件git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
撤消通过以下方式跳过的所有文件的文件 update-index --skip-worktree
git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
撤消通过以下方式跳过的所有文件的文件 update-index --assume-unchanged
git ls-files -v | grep '^^H'
再次列出所有未缓存的文件并检查以上命令是否有效-现在应该不返回任何内容