I have run the following command to ignore watching/tracking a particular directory/file:
git update-index --assume-unchanged <file>
How can I undo this, so that <file>
is watched/tracked again?
I have run the following command to ignore watching/tracking a particular directory/file:
git update-index --assume-unchanged <file>
How can I undo this, so that <file>
is watched/tracked again?
要获取设置为假设不变的撤消/显示目录/文件,请运行以下命令:
git update-index --no-assume-unchanged <file>
要获取正在assume-unchanged
运行的目录/文件的列表:
git ls-files -v|grep '^h'
如果这是您经常使用的命令 - 您可能还需要考虑为其设置别名。添加到您的全局.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-
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>
为了综合来自@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 unhide --
hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-
我假设(呵呵)你的意思是--assume-unchanged
,因为我没有看到任何--assume-changed
选项。的倒数--assume-unchanged
是--no-assume-unchanged
。
如果要撤消所有已应用的文件,假设任何状态都保持不变,而不仅仅是缓存(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,请按照以下步骤操作:
你完成了。
在 Windows 中,没有一个解决方案对我有用 - 它似乎使用大写H
而不是h
文件状态,并且 grep 命令需要一个额外的插入符号,因为它^
也代表行的开头以及否定下一个字符。
视窗解决方案
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'
再次列出所有未缓存的文件并检查上述命令是否有效 - 现在不应返回任何内容这里没有什么是未涵盖的。但想加我的 2 美分。有时,我运行一个构建,它改变了很多文件,然后我想处理一些东西,所以这个命令真的对我有很大帮助。
git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`
希望其他人也觉得它有用。