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. cd
no 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-index
comando funcionará. O que não está funcionando com os tubos?
Não, não é suficiente para mim adicionar dir
a .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.
fonte
git ls-files -z
git ls-files -z | xargs -0 git update-index --no-assume-unchanged
, eu acho ...git ls-files -z | git update-index -z --stdin
é mais limpo.O
find
comando do GNU Findutils tem uma-exec
opção que remove a maior parte do incômodo de usoxargs
, 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 pega todos os argumentos depois de
-exec
until;
(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
find
os 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-exec
você pode fazer todo tipo de coisas poderosas.Não tenho certeza sobre outras implementações do
find
comando. YMMV.fonte
-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.Adicione o nome do diretório a
.git/info/exclude
. Isso funciona para arquivos não rastreados.fonte
Sim,
funciona apenas com arquivos, não com diretórios. Eu acho, uma das maneiras mais rápidas:
fonte
cd
, você pode passar a dir como um argumento final:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
.