A while ago I did this to ignore changes to a file tracked by git:
git update-index --skip-worktree <file>
Now I actually want to commit changes to that file to source. How do I undo the effects of skip-worktree?
A while ago I did this to ignore changes to a file tracked by git:
git update-index --skip-worktree <file>
Now I actually want to commit changes to that file to source. How do I undo the effects of skip-worktree?
According to http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html, use
git ls-files -v
to see the "assume unchanged" and "skip-worktree" files marked with a special letter. The "skip-worktree" files are marked with S.
Edit: As @amacleod mentioned, making an alias to list all the hidden files is a nice trick to have so that you don't need to remember it. I use alias hidden="git ls-files -v | grep '^S'" in my .bash_profile. It works great!
If you want to undo all files that was applied skip worktree, you can use the following command:
git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
git ls-files -v will print all files with their statusgrep -i ^S will filter files and select only skip worktree (S) or skip worktree and assume unchanged (s), -i means ignore case sensitivecut -c 3- will remove status and leave only paths, cutting from the 3-rd character to the endtr '\012' '\000' will replace end of line character (\012) to zero character (\000)xargs -0 git update-index --no-skip-worktree will pass all paths separated by zero character to git update-index --no-skip-worktree to undoFor all of you that love Bash aliases, here is my set to rule them all(based on 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'
Based on @GuidC0DE answer, here's a version for Powershell (I use posh-git)
git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})
And for reference also the opposite command to hide the files:
git update-index --skip-worktree $(git ls-files --modified)
For those using Tortoise Git:
TortoiseGit > Check for modificationsShow ignore local changes flagged files. You should see the file that you ignored (or all the files you've ignored, if you've right clicked on the folder)Unflag as skip-worktree and assume-unchangedThis answer is aimed at less technical people using Windows.
If you don't remember/know which files you clicked "skip-worktree" on then use:
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".
To fix your problem:
You can go to the files -> right click -> restore to a previous version -> click the "git" tab on top -> uncheck the "skip-worktree" checkbox -> click "Apply" at the bottom.
If the files are too many to fix by hand then you'll need to refer to the other answers.
If you're a PowerShell user, here's some functions (aliases) inspired by @yossico's bash aliases
<#
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
}