Git: lista apenas arquivos "não rastreados" (também comandos personalizados)

339

Existe uma maneira de usar um comando como git ls-filesmostrar apenas arquivos não rastreados?

A razão pela qual estou perguntando é porque uso o seguinte comando para processar todos os arquivos excluídos:

git ls-files -d | xargs git rm

Eu gostaria de algo semelhante para arquivos não rastreados:

git some-command --some-options | xargs git add

Consegui encontrar a -oopção git ls-files, mas não é isso que eu quero, porque também mostra arquivos ignorados. Também pude criar o seguinte comando longo e feio:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Parece que deve haver um comando melhor que eu possa usar aqui. E se não houver, como crio comandos git personalizados?

Somos todos Monica
fonte
Você poderia explicar por que precisa git ls-files -d | xargs git rm?
takeshin 27/09/10
Isso remove todos os arquivos que estão faltando nos avisos do git. Minha pergunta era sobre como fazer uma operação relacionada - adicione todos os arquivos que o git não está rastreando no momento. Normalmente, eu faria os dois depois de renomear, combinar e / ou dividir meus arquivos de código.
Estamos todos Monica
Se eles estiverem ausentes, eles já não foram excluídos? A menos que ... você tenha saído de outro lugar e tente sincronizar com o controle remoto ... acho que entendi.
Buttle Butkus
Eu testei todas as respostas; se houver uma pasta não rastreada vazia, ninguém poderá encontrá-la.
precisa saber é o seguinte
@kittygirl isso está correto. Como gitfunciona apenas em arquivos, ele não tem como rastrear pastas vazias. Tente em find . -type d -emptyvez disso.
Nós somos todos Monica

Respostas:

529

Para listar arquivos não rastreados, tente:

git ls-files --others --exclude-standard

Se você precisar canalizar a saída xargs, é recomendável cuidar dos espaços em branco usando git ls-files -ze xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Bom apelido para adicionar arquivos não rastreados:

au = !git add $(git ls-files -o --exclude-standard)

Edit: Para referência: git-ls-files

leva
fonte
7
Perfeito! O que !significa o início da linha de alias ou onde isso está documentado?
Estamos todos Monica
@takeshin Como obter apenas nomes de diretório pai? não subpastas. Significa nestes arquivos não rastreados: / P / a / arquivos, / P / a / imagens, / P / a / / P /, ... - Eu só quero listar / P /
Dr.jacky
2
Em que situação você precisaria do apelido? git add *fará o mesmo: adicione todos os arquivos não rastreados, exceto o padrão (arquivos em que os caminhos são abordados .gitignore).
toinetoine
11
Eu prefiro meus alias para trabalhar de forma consistente em todos os diretórios no repo (LS-arquivos de comando mostra apenas arquivos alterados na árvore atual), então eu tenho[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill
Obrigado. Bom comentário.
Darth Egregious
71

Se você deseja apenas remover arquivos não rastreados, faça o seguinte:

git clean -df

adicione xa isso se você quiser incluir também arquivos especificamente ignorados. Eu uso git clean -dfxum monte ao longo do dia.

Você pode criar um git personalizado, basta escrever um script chamado git-whatevere colocá-lo em seu caminho.

Dustin
fonte
É muito mais comum que eu queira adicionar todos os arquivos não rastreados (por exemplo, depois de mover algumas coisas). De qualquer forma, obrigado pela dica sobre comandos personalizados. Onde esse mecanismo está documentado?
Estamos todos Monica
5
Basta fazer git add -Aou git add -u(dependendo do que faz mais sentido para você)
Dustin
11
O seu comentário é a verdadeira resposta, que também é repetido mais tarde por @ Mike Lococo
andho
2
e "git clean -dfxn" para uma execução a seco adicionando "n"
charo 17/02/18
50

git add -A -nfará o que você quiser. -Aadiciona todos os arquivos não rastreados ao repositório, -ntorna-o dry-runonde a adição não é realizada, mas a saída de status é fornecida listando cada arquivo que teria sido adicionado.

Mike Lococo
fonte
7
Esta é uma ótima resposta! Observe que ele exclui arquivos em .gitignorearquivos, o que geralmente é o que queremos, mas se não git add -fAn,.
cdunn2001
11
Esta parece ser a melhor resposta.
Rob Grant
11
Esta é a melhor resposta. Diz explicitamente ao usuário o que ele faria (sem fazê-lo) e dando a chance de revisá-lo antes de realmente adicioná-lo. Perfeito. Obrigado!
digitguy
Ele também lista os arquivos modificados.
Frank-Rene Schäfer
bom, mas eu obtê-lo envolto: add '$file'. Considerando que git ls-files --exclude-standard -odá uma saída nua, muito quente.
Hyperpallium 16/08/19
28

A resposta aceita trava nos nomes de arquivos com espaço. Neste momento, não tenho certeza de como atualizar o comando alias, então colocarei a versão aprimorada aqui:

git ls-files -z -o --exclude-standard | xargs -0 git add
youurayy
fonte
Eu acho que esta é a resposta correta, porque fornece o caminho de cada arquivo para executar uma ação (como add git) sobre eles depois
Pablo Burgos
27

Tudo é muito simples

Para obter a lista de todos os arquivos não rastreados, use o comando git status com a opção -u (--untracked-files)

git status -u
Valentyna
fonte
que tal uma versão não recursiva disso?
David
Infelizmente, ele também lista os arquivos ignorados através dos arquivos .gitignore.
Plouff
8
Esta é a única resposta que mostrou meus arquivos ignorados na confirmação inicial, mas eu tive que adicionar --ignoredao git status -ucomando
DN
Isso é simples e agradável.
Eric Wang
11
Isso também mostra arquivos modificados. Portanto, não é uma resposta para a pergunta: mostre apenas arquivos não rastreados.
Curinga
6

Ao procurar arquivos para adicionar potencialmente. A saída git showfaz isso, mas também inclui muitas outras coisas. O comando a seguir é útil para obter a mesma lista de arquivos, mas sem todas as outras coisas.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Isso é útil quando combinado em um pipeline para encontrar arquivos que correspondam a um padrão específico e, em seguida, canalizá-lo para git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add
cmac
fonte
6

Eu sei que é uma pergunta antiga, mas em termos de lista de arquivos não rastreados, pensei em adicionar outro que também lista pastas não rastreadas:

Você pode usar a operação git clean com -n (execução a seco) para mostrar quais arquivos serão removidos (incluindo os arquivos .gitignore):

git clean -xdn

Isso tem a vantagem de mostrar todos os arquivos e pastas que não são rastreados. Parâmetros:

  • x - Mostra todos os arquivos não rastreados (incluindo ignorados pelo git e outros, como saída de compilação etc ...)
  • d - mostra diretórios não rastreados
  • n- e o mais importante! - dryrun, ou seja, na verdade não exclua nada, basta usar o mecanismo de limpeza para exibir os resultados.

Pode ser um pouco perigoso fazê-lo assim, caso você esqueça o -n. Então, eu costumo usar o apelido no git config.

code_fodder
fonte
2

Todas as respostas anteriores que eu verifiquei listariam os arquivos a serem confirmados também. Aqui está uma solução simples e fácil que lista apenas os arquivos que ainda não estão no repositório e não estão sujeitos a .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

ou

git status --porcelain | grep -v '\?\?'
Frank-Rene Schäfer
fonte
isso parece não funcionar bem com arquivos que têm um espaço em seu nome
ssc
-2

Eu acho que isso será o mesmo que o pôster original pretendia:

git add .

Tim Fulmer
fonte
2
Toda vez que você faz git/svn add ., o gatinho morre.
Nakilon
Heh, apenas se você tiver um monte de lixo em suas cópias locais de filiais remotas;) Faça filiais locais e você pode, git add .impunemente!
Tim Fulmer
@ Nakilon, é por isso que você configura .gitignorecorretamente. Ainda é bom evitar git add ., no entanto. Melhor é git add -u.
Curinga