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 modifications
Show 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-unchanged
This 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
}