Desfazer git update-index --skip-worktree

148

Há um tempo atrás eu fiz isso para ignorar as alterações em um arquivo rastreado pelo git:

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

Agora, na verdade, quero confirmar as alterações desse arquivo na origem. Como desfazer os efeitos de skip-worktree?

Kevin Burke
fonte
11
Também estou interessado em obter a lista de arquivos no estado 'skip-worktree'?
troex

Respostas:

202

Aha! Eu simplesmente quero:

git update-index --no-skip-worktree <file>
Kevin Burke
fonte
8
Eu amo a Aha!
Ruto Collins
1
quem seria um thunk-lo
FluffyBeing 16/03
1
Aha! = Eurika! : D
Daut 22/10
Eu poderia ter inventado isso!
Tom Padilla
Por que a melhor resposta está na parte inferior da página
Carl Kroeger Ihl
35

De acordo com http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html , use

git ls-files -v

para ver os arquivos "assumir inalterados" e "pular árvore de trabalho" marcados com uma letra especial. Os arquivos "skip-worktree" estão marcados com S.

Edit : Como o @amacleod mencionou, criar um alias para listar todos os arquivos ocultos é um bom truque, para que você não precise se lembrar. Eu uso alias hidden="git ls-files -v | grep '^S'"no meu .bash_profile. Isso funciona muito bem!

Stefan Anca
fonte
9
Arrumado. Posso usar git ls-files -v | grep '^S'para listar apenas os arquivos que "ocultei" com o skip-worktree. Esperava tornar um alias "oculto" para esse comando, mas colocar um redirecionamento de pipe no alias não parecia funcionar.
amacleod
5
@amacleod use a !. Assim [alias] ignored = !git ls-files -v | grep "^S"testado, funciona.
9189 Steven St Luan
@amacleod Não suponha que você possa sugerir um comando alternativo para o Windows?
Steve Chambers
1
@SteveChambers, curto de instalar grep, eu não sei. Depende da sua concha, eu acho. Git Bash vem com grep, eu acho.
amacleod 16/09/15
1
Brilhante, obrigado @amacleod - simplesmente não estava no meu caminho. A única coisa que eu precisei mudar para que isso funcionasse no Windows foi o estilo de cotação - 'não funcionou, mas "funcionou, por exemplogit ls-files -v | grep "^S"
Steve Chambers
17

Se você deseja desfazer todos os arquivos aplicados, pule a árvore de trabalho, use o seguinte comando:

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 imprimirá todos os arquivos com seu status
  2. grep -i ^S filtrará arquivos e selecionará apenas pular árvore de trabalho (S) ou pular árvore de trabalho e assumir a (s) inalterada (s), -i significa ignorar distinção entre maiúsculas e minúsculas
  3. cut -c 3- removerá o status e deixará apenas caminhos, cortando do terceiro caractere até o final
  4. tr '\012' '\000' substituirá o caractere de final de linha (\ 012) por zero (\ 000)
  5. xargs -0 git update-index --no-skip-worktreepassará todos os caminhos separados por zero caractere git update-index --no-skip-worktreepara desfazer
C0DEF52
fonte
1
Esta é a melhor resposta
Dev
Esta resposta é ouro puro!
yossico 26/03
7

Baseado na resposta do @ GuidC0DE, aqui está uma versão do Powershell (eu uso o posh-git )

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

E para referência também o comando oposto para ocultar os arquivos:

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

Para aqueles que usam o Tortoise Git:

  1. Clique com o botão direito do mouse na pasta ou no arquivo específico e escolha TortoiseGit > Check for modifications
  2. Apenas verifique Show ignore local changes flagged files . Você deve ver o arquivo que ignorou (ou todos os arquivos que ignorou, se clicou com o botão direito do mouse na pasta)
  3. Clique com o botão direito do mouse no arquivo e escolha Unflag as skip-worktree and assume-unchanged
user276648
fonte
3

Para todos vocês que amam aliases do Bash, aqui está o meu conjunto para governá-los todos (com base em 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'
yossico
fonte
0

Esta resposta é direcionada a pessoas menos técnicas que usam o Windows.

Se você não se lembra / sabe em quais arquivos clicou em "ignorar worktree", 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".

Para corrigir seu problema:

Você pode acessar os arquivos -> clicar com o botão direito do mouse -> restaurar para uma versão anterior -> clicar na guia "git" na parte superior -> desmarcar a caixa de seleção "skip-worktree" -> clicar em "Aplicar" na parte inferior.

Se os arquivos forem muitos para corrigir manualmente, você precisará consultar as outras respostas.

Bojidar Stanchev
fonte