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.



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 .

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 ..


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"

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

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).


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.


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.


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.


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.


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.


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.

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.


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


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

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.


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"

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


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

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 ...


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.


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

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


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.


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


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á.


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.


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

1

algo como

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

pode fazê-lo.


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


-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).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.