git update-index --assume-unchanged no diretório

101

git 1.7.12

Quero marcar todos os arquivos abaixo de um determinado diretório como assumido como inalterado.

1) git update-index --assume-unchaged dir/dá "Ignorando caminho."

2) git update-index --assume-unchaged dir/*falha rapidamente porque encontrará arquivos que não estão sendo rastreados, portanto, dá "fatal: Não é possível marcar o arquivo" e fecha.

3) Tente gerar uma lista de arquivos a serem marcados. cdno diretório desejado e execute git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Isso não produz nenhuma mensagem de erro, mas não marca os arquivos com êxito. A primeira parte do comando git ls-files | tr '\n' ' ',, produz corretamente uma lista delimitada por espaços de todos os arquivos que desejo marcar. Se eu copiar e colar a saída desse comando na linha de comando, o git update-indexcomando funcionará. O que não está funcionando com os tubos?

Não, não é suficiente para mim adicionar dira .gitignore. Preciso que esses arquivos estejam no repositório, mas alterações indesejadas serão feitas localmente e precisam ser ignoradas para que os usuários possam fazer pulls.

Xander Dunn
fonte

Respostas:

173

git update-index deseja os nomes dos arquivos em sua linha de comando, não em sua entrada padrão.

Passo 1:

cd na pasta que você deseja assumir está inalterada

Passo 2:

Você pode fazer o seguinte:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

ou

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Embora, em ambos os casos, os nomes de arquivo com espaços sejam problemáticos. Se você tiver, você pode usar isto:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Editar: entrada incorporada de @MatthewScharley a respeito git ls-files -z.

Comandos do Windows

Observação: se você estiver no Windows, use Git Bash para executar esses comandos

Twalberg
fonte
2
FYI, que `| O bit tr '\ n' '' `é desnecessário.
Václav Slavík
7
@twalberg: Você poderia simplesmente usargit ls-files -z
Matthew Scharley
2
@twalberg Como desfazer este comando "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain
3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, eu acho ...
twalberg
1
git ls-files -z | git update-index -z --stdiné mais limpo.
Jed
22

O findcomando do GNU Findutils tem uma -execopção que remove a maior parte do incômodo de uso xargs, embora sua sintaxe seja um pouco especial. No entanto, trata perfeitamente com nomes de arquivos com espaços.

Este comando fará com que o git assuma que todos os arquivos dentro e sob o diretório listado estão inalterados:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find pega todos os argumentos depois de -execuntil ;(que você tem que escapar para que seu shell não o coma) e o executa uma vez para cada arquivo encontrado, enquanto substitui {}(novamente, aspas simples para que seu shell não o coma) pelo nome do arquivo encontrado.

Usando findos critérios de correspondência de (profundidade máxima de recursão, se a correspondência é um arquivo ou um diretório, se o nome do arquivo corresponde a uma expressão) e -execvocê pode fazer todo tipo de coisas poderosas.

Não tenho certeza sobre outras implementações do findcomando. YMMV.

Eles chamam de Himart
fonte
2
-execé uma opção padrão . Você também pode -exec git update-index --assume-unchanged {} +(também definido pelo padrão) que passa vários nomes de arquivo para o comando de uma vez, reduzindo o número de vezes que o comando git é chamado.
Tom Fenech
16

Adicione o nome do diretório a .git/info/exclude. Isso funciona para arquivos não rastreados.

Steve Pitchers
fonte
Este trabalho é ótimo! Você sabia se isso funciona com arquivos também?
betomoretti
Mas isso não empurra o github de arquivos não rastreados! existe alguma maneira possível de simplesmente ignorá-los dos registros, mas realmente mantê-los nos repositórios !?
Mahmoud Zalt
2

Sim,

git update-index --assume-unchanged

funciona apenas com arquivos, não com diretórios. Eu acho, uma das maneiras mais rápidas:

cd dir
ls | xargs -l git update-index --assume-unchanged
Victor Perov
fonte
2
Em vez de usar cd, você pode passar a dir como um argumento final: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh