【问题标题】:Undo git update-index --assume-unchanged <file>撤消 git update-index --assume-unchanged <文件>
【发布时间】:2013-06-16 06:14:59
【问题描述】:

我已运行以下命令来忽略监视/跟踪特定目录/文件:

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

如何撤消此操作,以便再次监视/跟踪 &lt;file&gt;

【问题讨论】:

标签: git version-control git-index


【解决方案1】:

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

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

要获取assume-unchanged 的目录/文件列表,请运行此

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

【讨论】:

  • 对你的 grep 语句的小改进,它可以使用 '^[a-z]' 来捕获所有被忽略的文件,因为第一个字母标签可能是 'H'/'h' 以外的字母。来自git-scm.com/docs/git-ls-files:此选项在每行的开头使用以下标签(后跟空格)标识文件状态: H:: 缓存 S:: 跳过工作树 M:: 未合并 R:: 删除/删除 C: : 修改/改变 K:: 被杀死 ?:: 其他
  • 另一个有用的技巧是git ls-files -v|grep '^h'|cut -c3-,它只会给你文件名,没有“h”前缀。
  • 如果您不再知道assume-unchanged 的文件,请使用git update-index --really-refresh。使用该命令,您无需先查找带有git ls-files 的文件。
  • 值得一提的是,如果你使用--skip-worktree,撤销/恢复它的过程非常相似:用git ls-files -v|grep '^S'列出文件并用git update-index --no-skip-worktree &lt;file&gt;恢复。
【解决方案2】:

所以这发生了! 我不小心点击了“假设不变”! 我尝试在互联网上搜索,但找不到任何可行的解决方案! 所以,我在这里和那里尝试了一些东西,最后我找到了解决方案(最简单的一个),这将撤消假设不变!

右击“你的项目”然后Team &gt; Advanced &gt; No assume Unchanged

【讨论】:

    【解决方案3】:

    为了综合来自@adardesign、@adswebwork 和@AnkitVishwakarma 的优秀原始答案,以及来自@Bdoserror、@Retsam、@seanf 和@torek 的cmets,以及额外的文档链接和简洁的别名...

    基本命令

    reset a fileassume-unchanged恢复正常:

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

    list all 假定不变的文件:

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

    reset all 假设未更改的文件恢复正常:

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

    注意:这个已在别处列出的命令似乎不再重置所有假定未更改的文件(我相信它曾经并且以前将其列为解决方案):

    git update-index --really-refresh
    

    快捷方式

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

    [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-
    

    【讨论】:

    • 对于git hidden,你可以在没有shell别名或脚本的情况下达到同样的效果,像这样使用!hidden = ! git ls-files -v | grep '^h' | cut -c3-
    • --really-refresh 不会(或不再这样做,也许曾经这样做过)清除索引文件上的假定未更改标志。
    • 谢谢你,@torek!我确认了您描述的行为,并使用“全部重置”案例的不同解决方案更新了答案。
    【解决方案4】:

    在 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' 再次列出所有未缓存的文件并检查上述命令是否有效 - 现在应该不会返回任何内容

    【讨论】:

      【解决方案5】:

      如果这是您经常使用的命令 - 您可能还需要考虑为其设置别名。添加到您的全球.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 documentation 很有帮助。

      根据 cmets,这也是找出 哪些文件 当前被隐藏的有用别名:

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

      【讨论】:

      • 这个别名也很方便:hidden = ! git ls-files -v | grep '^h' | cut -c3-
      【解决方案6】:

      这里没有没有涵盖的内容。但想加我的 2 美分。有时,我运行一个构建,它改变了很多文件,然后我想处理一些东西,所以这个命令真的对我有很大帮助。

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

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

      【讨论】:

      • 我认为您会受益于使用.gitignore 忽略您的构建工件。
      • 我有.gitignore,但根据我的经验,这有时是不够的。但我理解你说这句话的背景。
      【解决方案7】:

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

      1. 进入提交窗口。
      2. 点击名为工作目录更改的下拉菜单。
      3. 选择显示假定未更改的文件选项。
      4. 右键单击要取消假设的文件。
      5. 选择不要假设不变

      你已经完成了。

      【讨论】:

        【解决方案8】:

        如果要撤消所有已应用的文件,假设任何状态都保持不变,而不仅仅是缓存(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- 将删除状态并只留下路径,从第三个字符切到结尾
        4. tr '\012' '\000' 会将行尾字符 (\012) 替换为零字符 (\000)
        5. xargs -0 git update-index --no-assume-unchanged 会将所有以零字符分隔的路径传递给git update-index --no-assume-unchanged 以撤消

        【讨论】:

        • 这太有用了。感谢您提供详细信息!
        【解决方案9】:

        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 --really-refresh ,撤消我所做的所有假设不变,谢谢提示
        • git update-index --no-assume-unchanged &lt;file&gt; 救了我的命。好吧,我可以再次同步文件夹,但我确实想要一个“真正”的解决方案来解决这个问题。
        【解决方案10】:

        添加到@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 输出的两个字符,即"h ",然后转义文件名中可能存在的任何空格,最后|| true 将防止命令过早终止,以防循环中的某些文件有错误。

        【讨论】:

          【解决方案11】:

          我假设(呵呵)你的意思是--assume-unchanged,因为我没有看到任何--assume-changed 选项。 --assume-unchanged 的倒数是--no-assume-unchanged

          【讨论】:

            猜你喜欢
            • 2018-03-03
            • 2013-04-27
            • 2011-08-31
            • 2012-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            相关资源
            最近更新 更多