git: Como ignorar todos os arquivos não rastreados presentes?

131

Existe uma maneira útil de ignorar todos os arquivos e pastas não rastreados em um repositório git?
(Eu sei sobre o .gitignore.)

Então git status, forneceria um resultado limpo novamente.

sjas
fonte
Ou você pode adicionar um único * ao seu arquivo .gitignore. :)
vilicvane
1
Apenas um *provavelmente não será o que você deseja.
sjas
Surpreso com tantas respostas incorretas. -u noestá errado. -unoestá correto. -u notenta fazer um status em um arquivo chamado no! O nãono é um argumento para . Para forçar a ser interpretado como um argumento para , não deve haver espaço. Para testar isso, faça e compare com . -uno-utouch Invalidgit status -uInvalidgit status -u Invalid
Aaron McDaid

Respostas:

251

Como já foi dito, para excluir do status, basta usar:

git status -uno  # must be "-uno" , not "-u no"

Se você preferir ignorar permanentemente os arquivos não rastreados no momento, poderá, a partir da raiz do seu projeto, iniciar:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Toda chamada subseqüente git statusignorará explicitamente esses arquivos.

UPDATE : o comando acima tem uma pequena desvantagem: se você ainda não possui um .gitignorearquivo, seu gitignore irá se ignorar! Isso acontece porque o arquivo .gitignoreé criado antes da git status --porcelainexecução. Portanto, se você ainda não possui um .gitignorearquivo, recomendo usar:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Isso cria um subshell que é concluído antes da .gitignorecriação do arquivo.

EXPLICAÇÃO DO COMANDO Como estou recebendo muitos votos (obrigado!) Acho melhor explicar um pouco o comando:

  • git status --porcelainé usado em vez de git status --shortporque o manual declara "Forneça a saída em um formato fácil de analisar para scripts. Isso é semelhante à saída curta, mas permanecerá estável nas versões git e independentemente da configuração do usuário". Portanto, temos a parseabilidade e a estabilidade;
  • grep '^??'filtra apenas as linhas iniciadas por ??, as quais, de acordo com o manual de status do git , correspondem aos arquivos não rastreados;
  • cut -c4- remove os 3 primeiros caracteres de cada linha, o que fornece apenas o caminho relativo para o arquivo não rastreado;
  • os |símbolos são tubos , que passam a saída do comando anterior para a entrada do comando a seguir;
  • os símbolos >>e >são operadores de redirecionamento , que anexam a saída do comando anterior a um arquivo ou substituem / criam um novo arquivo, respectivamente.

Outra variante para aqueles que preferem usarsed em vez de grepe cut, aqui está uma outra maneira:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Diego
fonte
3
cut -c4- remove os 4 primeiros caracteres de cada linha, o que nos fornece apenas o caminho relativo para o arquivo não rastreado; Não. -cMarca o início de uma lista de números de coluna a serem cortados. E 4- seleciona a linha da coluna 4 até o final, que corta as colunas 1-3. Portanto, seu comando recortar remove os 3 primeiros caracteres de cada linha. Se você removesse 4 caracteres de uma linha de status do git, como a do arquivo aqui:, ?? app/views/static_pages/contact.html.erbvocê removeria a primeira letra de app. Portanto, o comando está correto, mas a explicação está com defeito.
7stud 10/09/14
@ 7stud: obrigado, você está certo, eu escrevi 4 por engano. Eu corrigi a resposta.
Diego
2
Eu realmente aprecio a explicação do comando. É bom saber o que os comandos aleatórios que copiei da Internet estão fazendo e nos ajuda a aprender como usar a linha de comando e o git melhor.
Eric Fitting
1
-u nonão funciona para mim. Mas -unofaz. Atualizei a resposta de acordo. Esse é um design estranho para o git. Estou no git 1.7.1
Aaron McDaid 01/01
2
@AaronMcDaid: obrigado. A mudança está documentado aqui , e discutido aqui
Diego
51

Se você deseja ignorar permanentemente esses arquivos, uma maneira simples de adicioná-los .gitignoreé:

  1. Mude para a raiz da árvore git.
  2. git ls-files --others --exclude-standard >> .gitignore

Isso enumerará todos os arquivos em diretórios não rastreados, que podem ou não ser o que você deseja.

poolie
fonte
3
Por que isso não recebe tantos votos? Não há necessidade de passar por outros 2 programas!
JoelFan
4
@ JoelFan: duas razões: 1) essa funciona apenas a partir da raiz do git , enquanto a aceita funciona em todos os subdiretórios, você só precisa ajustar o .gitignorecaminho de destino 2) se você tiver um diretório não rastreado, esta lista cada e todos os arquivos nele, mas não o diretório não rastreado em si (para que você não ignore o diretório e, portanto, ainda receba os arquivos futuros relatados no diretório como não rastreados, enquanto o aceito lista apenas o diretório, e não os arquivos não rastreados dentro . Esta é uma questão do que você quer fazer, mas muitas vezes você só quer ignorar toda a dir
Diego
1
Obrigado, Poolie. Agradeço a diferença de sua sugestão, devido aos pontos mencionados por @Diego. Comecei a trabalhar com uma biblioteca de arquivos e pastas e não quero rastrear / enviar os arquivos originais. Eu só quero rastrear os arquivos que adiciono ou reconstruo na biblioteca. Adicionar as pastas pai ignoraria tudo. Esta / sua solução adicionou todos os 1696 arquivos em um piscar de olhos. xD
Chaos7703 30/07
Isso também pode ser alcançado usando git config status.showUntrackedFiles no.
Larsch 26/12/19
16

Encontrado no manual

O parâmetro mode é usado para especificar a manipulação de arquivos não rastreados. É opcional: o padrão é para todos e, se especificado, deve estar preso à opção (por exemplo, -uno, mas não -u no).

git status -uno

sjas
fonte
39
Bem, se todo mundo iria RTFM antes de postar, nenhum de nós jamais iria obter qualquer representante :-)
Jenny D
4

Dois caminhos:

use o argumento "-uno" para git-status. Aqui está um exemplo:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Ou você pode adicionar os arquivos e diretórios ao .gitignore, caso em que eles nunca aparecerão.

Jenny D
fonte
2
Uma maneira prática de editar o .gitignoreser git status | cat >> temp && vim temp. Em seguida, edite o arquivo para que as primeiras linhas e a última linha sejam excluídas, assim como o final #e o espaço em branco a seguir. Então cat temp >> .gitignore && rm temp. Caso não .gitignoreestivesse presente antes, mv temp .gitignoreservirá. Coisas feias, mas melhor do que atualizar .gitignoremanualmente.
Sj #
1
Esta resposta está incorreta. A resposta correta é -uno. Se você usar -u no, é equivalente a no -u- fará um status em um arquivo chamado no(que provavelmente não existe) e usará o -umodo padrão . ou seja, é equivalente agit status no
Aaron McDaid
3

-u notambém não mostra arquivos não estágios. -unofunciona como desejado e mostra sem estágio, mas oculta sem rastreamento.

futebol
fonte
1
Mesmo isso não está correto. git status -u Xé equivalente a git status X -u( Xnão é um argumento para -u). Isso, por sua vez, é equivalente a git status X(porque -usem argumento é o padrão -u). Portanto, é simplesmente um status git no arquivo X. Então, se Xé nosimplesmente tenta fazer um git status em um arquivo chamado no, o que você provavelmente não tem
Aaron McDaid
2

Caso você não esteja no Unix como o SO, isso funcionaria no Windows usando o PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

No entanto, o .gitignorearquivo precisa ter uma nova linha vazia, caso contrário, ele acrescentará texto à última linha, independentemente de ter conteúdo.

Esta pode ser uma alternativa melhor:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

vhanla
fonte
1

Se você possui muitos arquivos não rastreados e não deseja " gitignore" todos, observe que, desde o git 1.8.3 (22 de abril de 2013) , git statusele mencionará o --untracked-files=nomesmo se você não adicionou essa opção no diretório " " primeiro lugar!

" git status" sugere que os usuários estudem o uso da --untracked=noopção quando demorar muito.

VonC
fonte
0

Eu vim aqui tentando resolver um problema um pouco diferente. Talvez isso seja útil para outra pessoa:

Eu crio um novo ramo feature-a. como parte deste ramo, crio novos diretórios e preciso modificar .gitignore para suprimir alguns deles. Isso acontece muito ao adicionar novas ferramentas a um projeto que cria várias pastas de cache. .serverless, .terraformetc.

Antes que eu esteja pronto para mesclar isso de volta ao master, eu tenho outra coisa, então faço o checkout master novamente, mas agora git statusrecolho as pastas suprimidas novamente, pois o .gitignore ainda não foi mesclado.

A resposta aqui é realmente simples, embora eu tivesse que encontrar este blog para descobrir:

Basta fazer o checkout do arquivo .gitignore da feature-aramificação

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
William George
fonte