撤消git update-index --skip-worktree


148

前一段时间,我这样做是为了忽略对git跟踪的文件的更改:

git update-index --skip-worktree <file>

现在,我实际上想将对该文件的更改提交给源。如何消除的影响skip-worktree


11
我也对如何获取“ skip-worktree”状态的文件列表感兴趣?
troex 2012年

Answers:



35

根据http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html,使用

git ls-files -v

查看带有特殊字母标记的“假定未更改”和“ skip-worktree”文件。“ skip-worktree”文件标记为S

编辑:正如@amacleod所提到的,制作一个别名来列出所有隐藏文件是一个不错的技巧,因此您无需记住它。我alias hidden="git ls-files -v | grep '^S'"在.bash_profile中使用。效果很好!


9
整齐。我可以git ls-files -v | grep '^S'用来仅列出我用skip-worktree“隐藏”的文件。希望为该命令创建一个别名“隐藏”,但是在别名中放置管道重定向似乎无效。
amacleod

5
@amacleod使用!。像这个经过[alias] ignored = !git ls-files -v | grep "^S"测试的作品。
史蒂文·卢

@amacleod不要以为您可以建议Windows的替代命令吗?
史蒂夫·钱伯斯

1
@SteveChambers,grep没有安装,我不知道。我猜取决于您的外壳。grep我认为,Git Bash附带了。
amacleod

1
太棒了,谢谢@amacleod-才不在我的路上。为了在Windows上运行,我唯一需要更改的是报价样式- '无效,但是有效",即git ls-files -v | grep "^S"
Steve Chambers

17

如果要撤消所有应用的跳过工作树的文件,可以使用以下命令:

git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
  1. git ls-files -v 将打印所有文件及其状态
  2. grep -i ^S 将过滤文件并仅选择跳过工作树(S)或跳过工作树并假定不变(s),-i表示忽略大小写
  3. cut -c 3- 从第3个字符到最后一个字符将删除状态并仅保留路径
  4. tr '\012' '\000' 将行尾字符(\ 012)替换为零字符(\ 000)
  5. xargs -0 git update-index --no-skip-worktree将通过零字符分隔的所有路径传递git update-index --no-skip-worktree给撤消

1
这是最好的答案
2016年

这个答案是纯金的!
Yossico

7

基于@ GuidC0DE答案,这是Powershell的版本(我使用posh-git

git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})

作为参考,也提供了隐藏文件的相反命令:

git update-index --skip-worktree $(git ls-files --modified)

3

对于使用Tortoise Git的用户:

  1. 右键单击该文件夹或特定文件,然后选择 TortoiseGit > Check for modifications
  2. 只检查Show ignore local changes flagged files。您应该看到被忽略的文件(或者如果您右键单击该文件夹,则将忽略所有被忽略的文件)
  3. 右键单击该文件,然后选择 Unflag as skip-worktree and assume-unchanged

3

对于所有喜欢Bash别名的人来说,这是我的全部规则(基于C0DEF52)

alias gitskip='git update-index --skip-worktree ' #path to file(s)
alias gitlistskiped='git ls-files -v | grep ^S'
alias gitunskip='git update-index --no-skip-worktree ' #path to file(s)
alias gitunskipall='git ls-files -v | grep -i ^S | cut -c 3- | tr ''\\012'' ''\\000'' | xargs -0 git update-index --no-skip-worktree'

0

该答案针对使用Windows的技术含量较低的人员。

如果您不记得/不知道单击了“跳过工作树”的文件,请使用:

git ls-files -v             //This will list all files, you are looking for the ones with an S at the beginning of the line. 

git ls-files -v | grep "S " //Use this to show only the lines of interest. Those are the files that have "skip-worktree".

要解决您的问题:

您可以转到文件->右键单击->恢复到以前的版本->单击顶部的“ git”选项卡->取消选中“ skip-worktree”复选框->单击底部的“应用”。

如果文件太多,无法手工修复,则需要参考其他答案。

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.