撤消git update-index --skip-worktree

时间:2012-06-21 03:40:59

标签: git undo

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

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

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

的效果

谢谢, 凯文

8 个答案:

答案 0 :(得分:154)

啊哈!我只想要:

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

答案 1 :(得分:30)

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

git ls-files -v

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

编辑:正如@amacleod所提到的,创建一个别名来列出所有隐藏文件是一个很好的技巧,所以你不需要记住它。我在.bash_profile中使用alias hidden="git ls-files -v | grep '^S'"。它很棒!

答案 2 :(得分:14)

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

title
  1. title: { text: "<strong>Number of Notes By Class Module</strong>" } 将打印状态为
  2. 的所有文件
  3. git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree 将过滤文件并仅选择跳过工作树(S)或跳过工作树并假设未更改,-i表示忽略区分大小写
  4. git ls-files -v将删除状态并仅留下路径,从第3个字符切换到最后
  5. grep -i ^S会将行尾字符(\ 012)替换为零字符(\ 000)
  6. cut -c 3-会将所有以零字符分隔的路径传递给tr '\012' '\000'以撤消

答案 3 :(得分:4)

对于所有喜欢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'

答案 4 :(得分:2)

根据@ 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)

答案 5 :(得分:1)

对于使用Tortoise Git的用户:

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

答案 6 :(得分: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”复选框->单击底部的“应用”。

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

答案 7 :(得分:0)

如果您是 PowerShell 用户,这里有一些受@yossico 的 bash 别名启发的函数(别名)

<#
Command: gitskipped
Description: List skipped files in git
Usage: gitskipped
#>
function gitskipped {
  (git ls-files -v $args) -split "\r\n" | Select-String -Pattern '^S ' | ForEach-Object {
    Write-Output $_.Line.Substring(2)
  }
}


<#
Command: gitskip
Description: Mark file(s) as "skip-worktree" in git
Usage: gitskip .env
#>
function gitskip {
  git update-index --skip-worktree $args
}


<#
Command: gitunskip
Description: Unmark file(s) as "skip-worktree" in git
Usage: gitunskip .env
#>
function gitunskip {
  git update-index --no-skip-worktree $args
}


<#
Command: gitunskipall
Description: Unmark all skipped files in git
Usage: gitunskipall
#>
function gitunskipall {
  $files = @((git ls-files -v $args) -split "\r\n" | Select-String -Pattern '^S ' | ForEach-Object { $_.Line.Substring(2) })
  git update-index --no-skip-worktree $files
}