Removendo vários arquivos de um repositório Git que já foram excluídos do disco

1311

Eu tenho um repositório Git que excluí quatro arquivos do uso rm( não git rm ), e meu status Git se parece com o seguinte:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

Como faço para remover esses arquivos do Git sem ter que passar manualmente e adicionar cada arquivo assim:

git rm file1 file2 file3 file4

Idealmente, estou procurando por algo que funcione da mesma maneira que git add .se possível.

Codebeef
fonte
2
relacionado: stackoverflow.com/questions/1856654/…
kch 6/12/09
10
@seth, nem sempre é fácil de usar git rm, a remoção poderia ter sido de uma ferramenta separada, IDE ou gerenciador de arquivos. O Visual Studio para um pode ser um problema ao remover / renomear arquivos.
Brett Ryan
67
Ugh, perguntar por que alguém não usa git rmé como perguntar por que eles não usam git vimou git cd. É uma coisa estúpida a ser feita, e o git deve ter um comando ou alias embutido para remover arquivos excluídos da preparação, e você não deve procurar no SO ou ler as páginas de manual no seu horário de almoço.
precisa saber é o seguinte
7
A resposta de Varinder não é uma boa maneira. Considere git add -u como Cody sugeriu e que também é a resposta para esta pergunta: stackoverflow.com/questions/1402776/…
Roland

Respostas:

2300

Para Git 1.x

$ git add -u

Isso diz ao git para preparar automaticamente os arquivos rastreados - incluindo a exclusão dos arquivos rastreados anteriormente.

Para Git 2.0

Para preparar toda a sua árvore de trabalho:

$ git add -u :/

Para preparar apenas o caminho atual:

$ git add -u .
carl
fonte
133
Observe que isso adicionará todos os arquivos rastreados e alterados - excluídos e atualizados.
Ian Hunter
19
@beanland, você só precisa fornecer o caminho para o arquivo específico que deseja modificar, se não quiser que ele obtenha todos. por exemplo, git add -u [caminho]
Paul Prewett
27
também git add -u folder/para executar esta operação em uma pasta
c ..
2
FYI: esta resposta foi
Shog9
1
Pode ser a pergunta que as pessoas estavam perguntando quando chegaram a esta página e pode ser o que o OP realmente queria perguntar, mas não responde à pergunta exata.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

pode ser o que você está procurando .. funciona para mim ..

Varinder
fonte
5
para Windows, tente adicionar o seguinte alias na sua configuração sem as aspas, como indicado acima por Evan Moran 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS 31/01
21
ter cuidado com arquivos com espaços em seu nome
maazza
44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u como Cody sugeriu é uma maneira muito mais simples e segura, sem risco de excluir arquivos acidentalmente.
Roland
4
Voto negativo, pois é a resposta errada, mesmo que funcione para alguns arquivos. use "git add -u" abaixo. É para isso que serve.
n13
733

Você pode usar

git add -u

Para adicionar os arquivos excluídos à área de preparação, confirme-os

git commit -m "Deleted files manually"
Cody Caughlan
fonte
101
Observe o usuário do Google: ele também adiciona os arquivos rastreados modificados à área de preparação.
erenon
4
Execute este comando apenas se você acabou de remover os arquivos e deseja prepará-los imediatamente.
Aryo #
1
eu não sou capaz de remover arquivo de bitbucket repo]
srinivas gowda
356

Se você simplesmente executar:

git add -u

O git atualizará seu índice para saber que os arquivos que você excluiu devem realmente fazer parte do próximo commit. Em seguida, você pode executar o "git commit" para verificar essa alteração.

Ou, se você executar:

git commit -a

Ele automaticamente pega essas alterações (e quaisquer outras) e as confirma.

Atualização : se você deseja adicionar apenas arquivos excluídos, tente:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Sit
fonte
1
Certo, git commit -afarei o que eu quero, exceto em alguns casos, tenho arquivos que não quero confirmar, então quero preparar o commit manualmente.
Igor Zevaka 10/09/09
2
commit -a essencialmente faz um "add -u" primeiro; ele atualizará o índice com quaisquer alterações nos arquivos conhecidos (sejam exclusões ou alterações simples). Obviamente, você pode ser mais específico e adicionar / rm apenas os arquivos que deseja. git.or.cz/gitwiki/… pode ser útil.
Emil Sit
2
O conjunto de comandos abaixo da "Atualização: .." funcionou como um encanto. Obrigado!
Jay Taylor
10
Muito obrigado por 'git ls-files --deleted | xargs git rm '!
mit
18
"git ls-files --deleted | xargs git rm" é a resposta correta! Obrigado!
reto
166

Você provavelmente está procurando -A:

git add -A

isso é semelhante ao git add -u, mas também adiciona novos arquivos. Isso é aproximadamente o equivalente ao addremovecomando hg (embora a detecção de movimentação seja automática).

Dustin
fonte
8
Em uma observação rápida, o uso de -u limita a adição aos arquivos rastreados e -a também inclui arquivos não rastreados. Apenas pensei em apontar a diferença.
spaaarky21
Nesta fase, você também pode adicionar tudo por meio do sinalizador commit -a.
Zac Grierson #
94

Para preparar apenas os arquivos excluídos :

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Ou (da maneira xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Você pode alternar o seu conjunto de comandos preferido para uso posterior conveniente.

Saeb Amini
fonte
2
@Saeb Entenda sobre a fila, mas leva xargscerca de 15 minutos para dominar.
Eric Wilson
11
git status | awk '/deleted/ {print $3}' | xargs git rmseria uma maneira mais curta de fazer isso. grep | awk... Apenas diga que não.
Mark Reed
58
git rm $(git ls-files --deleted)não é mais conveniente (copiado disso ).
Hotschke 26/03
1
xargs ou a substituição $ () acima, se você souber que a lista não é enorme. Se a lista for grande: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
O @Andrew xargsé provavelmente mais eficiente que um loop while para uma lista enorme, pois passa mais de um argumento cada vez que é executado git rm. Para limitar o número de argumentos passados para git rmcada vez que é executado, use a -nopção:git ls-files --deleted | xargs -n 15 git rm
Ajedi32
61
git rm test.txt

Antes ou depois de você excluir o arquivo real.

Peaker
fonte
7
Embora funcione, muitas vezes encontro-me excluindo uma tonelada de arquivos rme me arrependendo mais tarde.
carl
4
Por que isso é pior do que fazer git add -u? Parece que seria mais seguro adicionar os arquivos específicos que foram excluídos ao commit, em vez de adicionar TODAS as alterações.
Ian Dunn
2
na verdade, essa deve ser a melhor resposta, de acordo com a última linha da pergunta "Eu só quero um comando que exclua todos os arquivos do git que também são excluídos do disco".
Ramsharan
2
@Ramsharan não, porque não faz isso. Isso exclui um único arquivo; o OP solicitou especificamente "todos" os arquivos excluídos.
21413 Adam
1
@Ramsharan não, esse é o ponto - em quase todos os casos, você NÃO PODE simplesmente usar um curinga (não há curinga que corresponda). É por isso que a resposta principal é muito mais complicada.
Adam
49

Usando as opções git-add com '--all' ou '--update', você pode obter mais do que queria. Arquivos novos e / ou modificados também serão adicionados ao índice. Eu tenho uma configuração de alias do bash para quando eu quero remover arquivos excluídos do git sem tocar em outros arquivos:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Todos os arquivos que foram removidos do sistema de arquivos são adicionados ao índice como excluídos.

zobie
fonte
39

Não que isso realmente importe, mas eu discordo da resposta escolhida:

git add -u 

... removerá os arquivos do índice se os arquivos correspondentes na árvore de trabalho tiverem sido removidos, mas também preparará o novo conteúdo modificado dos arquivos rastreados.

git rm $(git ls-files --deleted)

... por outro lado, apenas controlará os arquivos excluídos que foram rastreados.

Portanto, o último, na minha opinião, é a melhor opção.

Stephan Tual
fonte
29

Se essas são as únicas alterações, você pode simplesmente fazer

git commit -a

confirmar todas as alterações. Isso incluirá arquivos excluídos.

SpoonMeiser
fonte
3
Não sei por que recebi votos negativos; O git faz um bom trabalho na identificação de arquivos que foram excluídos, mesmo que você não tenha explicitamente explicado isso usando o git rm.
SpoonMeiser
Você recebeu votos negativos porque "-a" não é uma opção aceitável, é "-A". Editando sua resposta.
Sheharyar
10
Não, "-a" é uma opção aceitável, porque o comando está confirmado . "-A" é uma opção para adicionar, mas não confirmar . Vejo que sua edição sugerida já foi rejeitada.
SpoonMeiser
Caso a única coisa que você esteja comprometendo seja o arquivo excluído, adicione a opção --allow-empty
billrichards
err, na verdade --allow vazio só é necessário se você se rm git --cached
billrichards
20
git ls-files --deleted | xargs git rm 

é a melhor opção para adicionar apenas arquivos excluídos.

Aqui estão algumas outras opções.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
Sijo Kurian
fonte
16

git add -u

-u --update Corresponde apenas aos arquivos já rastreados no índice, e não na árvore de trabalho. Isso significa que nunca preparará novos arquivos, mas preparará novos conteúdos modificados dos arquivos rastreados e removerá os arquivos do índice se os arquivos correspondentes na árvore de trabalho tiverem sido removidos.

Se não for fornecido, o padrão é "."; em outras palavras, atualize todos os arquivos rastreados no diretório atual e em seus subdiretórios.

Obay
fonte
A resposta mais votada já diz para usar git add -u. De onde vêm todas as outras coisas da sua resposta, a documentação? Você deve vincular a documentação e citá-la, se houver.
TheWarriorNamedFoo
14

Essa solução simples funciona bem para mim:

git rm $(git ls-files --deleted)
Houssem Badri
fonte
Eu acho que você deve sempre usar shell git em você diretório de trabalho atual
Houssem Badri
2
Isso é legal e simples, mas não funciona com pastas recursivas.
DRB
@BehnazChangizi Eu acho que sim, stackoverflow.com/questions/1054044/…
Houssem Badri
Não @PvdL aceita espaços no caminho é problema os-specefic
Houssem Badri
11

Se você quiser adicioná-lo ao seu, .gitconfigfaça o seguinte:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Então tudo que você precisa fazer é executar:

git rma
Evan Moran
fonte
1
e da linha de cmdgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey
9
git ls-files --deleted -z | xargs -0 git rm --cached

Isso removerá todos os arquivos excluídos que foram rastreados anteriormente pelo git, além de lidar com o caso em que seus nomes de arquivos têm espaços neles.

Dependendo da sua variante POSIX, você pode precisar usar xargs -0 -r: isso causaráxargs a saída seja normal quando o conteúdo nulo for canalizado.

EDIT: --cachede --deletedsinalizadores são usados ​​em conjunto para proteger contra a exclusão acidental de arquivos que ainda não foram excluídos.

Murphy Danger
fonte
7

Diga ao comando para preparar automaticamente os arquivos que foram modificados e excluídos, mas os novos arquivos que você não contou ao Git não são afetados:

-a
--all

git add . && git commit -m -a "Your commit"

ou

git add --all && git commit -m "Your commit"
ilgam
fonte
1
git add --all && git commit -m "Seu commit" Isso funcionou para mim no windows-7, usando o shell de comando do Git bash.
Kmarabet
1
O seguinte comando funcionou para mim no windows-7, usando o shell de comando do Git bash: $ git add --all && git commit -m "remover arquivos de propriedades" [master 58c41ac] remover arquivos de propriedades 1 arquivo alterado, 9 exclusões (-). .. Em seguida, para enviar essas alterações confirmadas ao repositório remoto, execute: $ git push origin . Contando objetos: 10, concluídos.
precisa saber é
6

O seguinte funcionará, mesmo se você tiver muitos arquivos para processar:

git ls-files --deleted | xargs git rm

Você provavelmente também desejará confirmar com um comentário.

Para obter detalhes, consulte: Scripts úteis do Git

l3x
fonte
6

Por favor, use -tpara ver qual comando está sendo executado

Acabei de ajustar a resposta do Virender para fazer o mesmo:

git ls-files --deleted -z | xargs -t -0 git rm
Venkateswara Rao
fonte
5

Nenhum dos sinalizadores para o git-add armazenará apenas os arquivos removidos; se tudo o que você modificou são arquivos excluídos, tudo bem, mas, caso contrário, você precisa executar o git-status e analisar a saída.

Trabalhando com a resposta de Jeremy, é isso que eu tenho:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Obter status dos arquivos.
  2. Para arquivos excluídos, isole o nome do arquivo.
  3. Remova todas as linhas que começam com #s, bem como uma linha de status que continha a palavra "excluída"; Não me lembro exatamente o que era e não existe mais, então você pode precisar modificar isso para diferentes situações. Eu acho que o agrupamento de expressões pode ser um recurso específico do GNU; portanto, se você não estiver usando gnutils, poderá ser necessário adicionar várias grep -vlinhas.
  4. Passe os arquivos para git rm.

Colando isso em um apelido de shell agora ...

Xiong Chiamiov
fonte
5

Como mencionado

git add -u

prepara os arquivos removidos para exclusão, MAS TAMBÉM modificou os arquivos para atualização.

Para desestabilizar os arquivos modificados, você pode

git reset HEAD <path>

se você gosta de manter seus commits organizados e limpos.
NOTA: Isso também pode desestabilizar os arquivos excluídos, portanto, tenha cuidado com esses curingas.

DarkNeuron
fonte
4
git commit -m 'commit msg' $(git ls-files --deleted)

Isso funcionou para mim depois que eu já havia excluído os arquivos.

Chade
fonte
3

Eu precisava do mesmo e usei o botão "estágio alterado" do git gui. também adiciona tudo.

E depois que "o estágio mudou", fiz "commit" ...

então meu diretório de trabalho está limpo novamente.

Serdar
fonte
Bem, usando um gui é enganar, lol! Mas mais rápido nos casos em que o designer da GUI atendeu às suas necessidades. É bom saber como mexer com "o que está por baixo do capô".
Dennis
1
FYI: esta resposta foi
Shog9
3
git rm $(git ls-files -d)

Remove todos os arquivos listados pelo git ls-filescomando (-d mostra apenas arquivos excluídos). Não funciona para arquivos com espaços no nome do arquivo ou caminho, mas é simples de lembrar

A. Albershteyn
fonte
2

Você pode usar git add -u <filenames>para preparar apenas os arquivos excluídos.

Por exemplo, se você excluiu os arquivos templates/*.tpl, use git add -u templates/*.tpl.

A -ué necessária para se referir a arquivos que existem no repositório, mas já não existem no diretório de trabalho. Caso contrário, o padrão git addé procurar os arquivos no diretório de trabalho e, se você especificar os arquivos excluídos, ele não os encontrará.

thomasrutter
fonte
2

Incluindo Alias ​​do Sistema para Disponibilizar Arquivos Excluídos como Comando rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

JANELAS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Nota

O Windows precisa ter bashinstalado.

Haris Krajina
fonte
2

(Ainda outra variação)

Eu queria excluir todos os arquivos já excluídos dos arquivos do disco, mas de uma pasta específica, deixando as outras pastas intocadas. O seguinte funcionou para mim:

git ls-files --deleted  | grep <folder-name> | xargs git rm
urbano
fonte
1

algo como

git status | sed -s "s/^.*deleted: //" | xargs git rm 

pode fazê-lo.

Jeremy French
fonte
2019 git versão 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841
1

Para projeto visual studio

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

o que é útil quando o caminho do arquivo excluído tem espaço

Sawyer
fonte
-1

A solução mais flexível que encontrei até agora é

git cola

E selecione todos os arquivos excluídos que eu quero preparar.

(Note que eu costumo fazer tudo na linha de comando no git, mas o git lida com os arquivos removidos um pouco estranho).

Broes De Cat
fonte
Os curingas não estavam funcionando para mim; git add -u path/to/my/deleted-files-pattern-*.ymlportanto, essa era a melhor resposta para mim (não desejando exibir todos os arquivos excluídos, mas 50 dentre algumas centenas).
Mlncn 01/11