Desfazer git update-index --assume-inalterado <file>

463

A maneira como você Git ignora assistindo / rastreando um diretório / arquivo específico. você acabou de executar isso:

git update-index --assume-unchanged <file>

Agora, como você desfaz isso para que eles sejam vistos novamente? (Vamos chamá-lo de não assumir).

adardesign
fonte
5
Apenas uma observação para dizer que parece que skip-worktree é provavelmente o que você usaria melhor do que assume inalterado, a menos que o desempenho do git seja o seu problema. stackoverflow.com/questions/13630849/…
GreenAsJade 29/04

Respostas:

587

Para desfazer / mostrar os diretórios / arquivos configurados para assumir inalterados, execute o seguinte procedimento :

git update-index --no-assume-unchanged <file>

Para obter uma lista de diretórios / arquivos assume-unchangedexecutados :

git ls-files -v|grep '^h'

adardesign
fonte
7
Pequenas melhorias na sua declaração grep, ele pode usar '^ [az]' para capturar todos os arquivos ignorados, pois a primeira letra da letra pode ser outra que não seja 'H' / 'h'. Em git-scm.com/docs/git-ls-files : Esta opção identifica o status do arquivo com as seguintes tags (seguidas de um espaço) no início de cada linha: H :: S :: em cache S :: skip-worktree M: : unmerged R :: removido / excluído C :: modificado / alterado K :: para ser morto? :: other
Bdoserror
8
Outro truque útil é o git ls-files -v|grep '^h'|cut -c3-que fornecerá apenas os nomes dos arquivos, sem o prefixo "h".
Retsam 27/10/14
9
Se você não conhece mais os arquivos que você assume-unchanged, basta usar git update-index --really-refresh. Com esse comando, você não precisa procurar os arquivos git ls-filesprimeiro.
theDmi
103

Se esse é um comando que você usa com freqüência - você também pode considerar ter um alias para ele. Adicione ao seu global .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Como definir um alias (se você ainda não sabe):

git config --configLocation alias.aliasName 'command --options'

Exemplo:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Depois de salvar isso no seu .gitconfig, você pode executar um comando mais limpo.

git hide myfile.ext

ou

git unhide myfile.ext

Essa documentação do git foi muito útil.

Conforme os comentários, este também é um alias útil para descobrir quais arquivos estão sendo ocultos no momento:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-
adswebwork
fonte
2
Este alias também é útil:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
42

A função git update-index possui várias opções, você pode encontrar digitando como abaixo:

git update-index --help

Aqui você encontrará várias opções - como lidar com a função update-index.

[se você não souber o nome do arquivo]

git update-index --really-refresh 

[se você souber o nome do arquivo]

git update-index --no-assume-unchanged <file>

reverterá todos os arquivos pelos quais foram adicionados na lista de ignorados.

git update-index --assume-unchanged <file>
Ankit Vishwakarma
fonte
git update-índice --really-refresh, desfazer todos assumem-inalterada que eu tenho feito, obrigado pela dica
Sérgio
git update-index --no-assume-unchanged <file>salvei minha vida .. ok, eu poderia sincronizar a pasta novamente, mas queria uma solução "real" para esse problema.
Cagatay Ulubay
38

Eu suponho (heh) você quis dizer --assume-unchanged, já que não vejo nenhuma --assume-changedopção. O inverso de --assume-unchangedé --no-assume-unchanged.

hobbs
fonte
32

Para sintetizar as excelentes respostas originais de @adardesign, @adswebwork e @AnkitVishwakarma, e comentários de @Bdoserror, @Retsam, @seanf e @torek, com links adicionais para documentação e aliases concisos ...

Comandos básicos

Para redefinir um arquivo que é assumido inalterado de volta ao normal:

git update-index --no-assume-unchanged <file>

Para listar todos os arquivos que são assumidos inalterados:

git ls-files -v | grep '^[a-z]' | cut -c3-

Para redefinir todos os arquivos assumidos inalterados de volta ao normal:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Nota: Este comando que foi listado em outro lugar não parece redefinir mais todos os arquivos assumidos inalterados (acredito que ele costumava e o listou anteriormente como uma solução):

git update-index --really-refresh

Atalhos

Para facilitar a execução dessas tarefas comuns no git, adicione / atualize a seguinte seção de alias.gitconfig para o seu usuário (por exemplo, ~/.gitconfigem um sistema * nix ou macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-
Will Caim
fonte
1
Pois git hidden, você pode obter o mesmo efeito sem scripts ou aliases de shell, usando o !seguinte:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
1
--really-refreshnão limpa (ou já não o faz, talvez já tenha limpado) os sinalizadores assumidos sem alteração nos arquivos de índice.
torek 29/08/19
Obrigado, @torek! Confirmei o comportamento que você descreveu e atualizei a resposta com uma solução diferente para o caso "redefinir tudo".
Will Caim
20

Se você deseja desfazer todos os arquivos aplicados, assume-se inalterado com qualquer status, não apenas em cache (o git os marca por caractere em minúsculas), é possível usar o seguinte comando:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v imprimirá todos os arquivos com seu status
  2. grep '^[a-z]' irá filtrar arquivos e selecionar apenas assumir inalterados
  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-assume-unchangedpassará todos os caminhos separados por zero caractere git update-index --no-assume-unchangedpara desfazer
C0DEF52
fonte
Isso é muito útil. Obrigado pela informação detalhada!
Chamithra Thenuwara 20/04
11

Adicionando à @adardesignresposta da, se você deseja redefinir todos os arquivos que foram adicionados à assume-unchangedlista de no-assume-unchangeduma só vez, você pode fazer o seguinte:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Isso apenas retira os dois caracteres de saída do grep "h ", e então || trueevita qualquer espaço que possa estar presente nos nomes dos arquivos e, finalmente , evita que o comando seja encerrado prematuramente, caso alguns arquivos no loop apresentem erros.

sagunms
fonte
4

Se você estiver usando extensões Git , siga as etapas abaixo:

  1. Vá para a janela de confirmação.
  2. Clique no menu suspenso chamado Alterações no diretório de trabalho .
  3. Selecione a opção Mostrar arquivos assumidos como inalterados .
  4. Clique com o botão direito do mouse no arquivo que você deseja desprezar.
  5. Selecione Não assumir nenhuma alteração .

Você terminou.

Shivang Gupta
fonte
0

Nada aqui que não seja coberto. Mas gostaria de adicionar meus 2 centavos. Às vezes, eu executo uma compilação e ela altera muitos arquivos e, em seguida, quero trabalhar em algo, portanto esse comando realmente me ajuda muito.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Espero que alguém ache útil também.

Tyagi Akhilesh
fonte
Eu acho que você se beneficiaria com o uso .gitignorepara ignorar seus artefatos de construção.
Nick
1
Eu tenho, .gitignoremas isso é, às vezes, na minha experiência não é suficiente. Mas eu entendo o contexto em que você está dizendo isso.
Tyagi Akhilesh
0

Nenhuma das soluções funcionou para mim no Windows - parece usar capital Hem vez hdo status do arquivo e o comando grep requer um sinal de intercalação extra, pois ^também representa o início da linha e nega o próximo caractere.

Solução Windows

  1. Abra o Git Bash e mude para o diretório de nível superior relevante.
  2. git ls-files -v | grep '^^H' para listar todos os arquivos não armazenados em cache
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree para desfazer os arquivos pulando todos os arquivos que foram feitos via update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged para desfazer os arquivos pulando todos os arquivos que foram feitos via update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' para listar novamente todos os arquivos não armazenados em cache e verificar se os comandos acima funcionaram - isso agora não deve retornar nada
Steve Chambers
fonte
-1

Se você estiver usando o eclipse, poderá achar útil o seguinte:

não assuma inalterado com eclipse

Antonio
fonte
1
por que os votos negativos, por favor?
Antonio