Como remover vários arquivos excluídos no repositório Git

237

Excluí alguns arquivos e o status do git é mostrado abaixo.

Eu cometi e empurrei.

O GitHub ainda mostra os arquivos excluídos no repositório. Como posso excluir arquivos no repositório do GitHub?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

Se eu usar git rm, ele fornece o seguinte.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched
canela
fonte

Respostas:

638
git add -u 

atualiza todas as suas alterações

mshameers
fonte
31
Funciona um encanto. Quando você vê algo como "git status | sed -n '/ ^ # * excluído: / s /// p' | xargs git rm" como uma solução proposta para um requisito tão simples e frequente, você sabe que uma solução melhor é: ou em breve estará ao virar da esquina.
Arcseldon #
simples é melhor, este é realmente útil em seguida, o "bash" maneira
Castiel
1
Autor pergunta como remover arquivos, por que adicionar arquivos é a resposta correta?
Kelin
3
@kelin: from git docs ( git-scm.com/docs/git-add ): "-u --update Atualize o índice exatamente onde ele já possui uma entrada correspondente a <pathspec>. Isso remove e modifica as entradas do índice para corresponda à árvore de trabalho, mas não adiciona novos arquivos.Se não for fornecido <pathspec> quando a opção -u for usada, todos os arquivos rastreados em toda a árvore de trabalho serão atualizados (versões antigas do Git usadas para limitar a atualização ao diretório atual e subdiretórios) ".
HEDMON 23/02
92

Seja muito cauteloso git rm .; pode remover mais do que você deseja. Obviamente, você pode se recuperar, mas é mais simples não precisar fazê-lo.

O mais simples seria:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

Você não pode usar curingas do shell porque os arquivos não existem, mas você pode usar (no Bash pelo menos):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Ou considere:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

Isso pega a saída de git status, não imprime nada por padrão ( sed -n), mas nas linhas iniciadas # deleted:, ele se livra do #e do deleted:e imprime o que resta; xargsreúne os argumentos e os fornece a um git rmcomando. Isso funciona para qualquer número de arquivos, independentemente da semelhança (ou diferença) nos nomes.

Jonathan Leffler
fonte
6
Você pode usar caracteres curinga (embora seja necessário evitá-los), e o git corresponderá aos caminhos no índice, não apenas aos da árvore de trabalho, portanto, não importa que eles não existam no sistema de arquivos.
Ben James
109
git diff --diff-filter=D --name-only -z | xargs -0 git rmé uma abordagem mais confiável do que tentar analisar, git statusorientado ao usuário e sem garantia de estabilidade em versões futuras.
CB Bailey
@ Charles: isso é certamente melhor, mas requer bastante conhecimento sobre quais opções estão disponíveis git diff(as quais eu não tinha, por não ter tido a necessidade antes). Obrigado!
Jonathan Leffler
8
Note que há também "git ls-files --deleted"
Petr Gladkikh
1
então, git ls-files --deleted | xargs git rmfez o truque para mim.
Fiacobelli
50

Outra versão da resposta ByScripts é

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

Isso APENAS removerá os arquivos excluídos do git.

Também pode ser usado para adicionar APENAS arquivos modificados.

git add $(git ls-files --modified)

Esses comandos também funcionam no gitbash para Windows.

Vijay C
fonte
2
Inestimável, o git ls-filesstatus excluído ou modificado é muito útil.
Mario Peshev
1
O comportamento do 'git add --update (or -u)'argumento sem caminho de um subdiretório da árvore será alterado no Git 2.0 e não deverá mais ser usado. Para adicionar conteúdo para a árvore inteira, execute: git add --update :/ (ou git add -u: /) Para restringir o comando ao diretório atual, execute: git add --update . (ou git add -u.) Com a versão atual do Git, o comando é restrito ao diretório atual
Ans
1
Alguma idéia de como lidar com caminhos com espaços? Exemplo: src/my spaced directory/myfile. Isso pode ser tratado individualmente, mas como pode ser tratado usando os comandos nesta resposta?
Muhammad Gelbana
35

Atualize todas as alterações feitas:

git add -u

Os arquivos excluídos devem mudar de não estágios (geralmente vermelho) para estágios (verde). Em seguida, comprometa-se a remover os arquivos excluídos:

git commit -m "note"
Aziz Alto
fonte
1
Merece o distintivo populista.
John
1
Esta é de longe a melhor solução. Sem hackers de script, sem processo demorado, apenas um sinalizador para dizer ao git para atualizar seu índice completamente.
Ron Dahlgren
Brilhante! Me salvou de ter que digitar mais de 20 caminhos de arquivo. Obrigado!
allardbrain
12

A melhor solução se você não se importa com o armazenamento temporário de arquivos modificados é usar o git add -uque foi dito por mshameers e / ou pb2q .

Se você deseja apenas remover arquivos excluídos, mas não colocar nenhum arquivo modificado, acho que você deve usar o ls-filesargumento com a --deletedopção (não há necessidade de usar regex ou outros argumentos / opções complexos):

git ls-files --deleted | xargs git rm
ByScripts
fonte
1
git add -Aresolve esse problema ... caso alguém queira saber no futuro. verifique a resposta abaixo #
Ja8zyjits 30/11
8

Sim, git rm <filename>encenará o estado excluído de um arquivo, onde <filename>pode haver um padrão global:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

Então, você pode confirmar.

git commit -a fará isso de uma só vez, se você quiser.

Você também pode usar git add -upara preparar todas as alterações, incluindo todos os arquivos excluídos, e confirmar.

Ben James
fonte
tão rm. (ponto final) excluí-los de uma só vez?
shin
então apenas git rm removerá tudo de uma vez?
shin
1
Você pode usar um padrão de estilo glob para remover vários arquivos; Eu atualizei minha resposta para mostrar um exemplo.
Ben James
5
Parece que git add -ué exatamente o que estamos procurando - se você fizer muitas exclusões, em seguida, deseja confirmar todas as exclusões, que parece ser a maneira mais fácil e mais 'padrão' (ou seja, sem globs específicos de caso ou shell complexo analisando xargs). Existe uma razão para não querermos usar isso, além do fato de adicionar todas as alterações de uma só vez?
trisweb
7

Quando tenho muitos arquivos excluídos que não estão em estágio de confirmação, você pode git rmtodos eles em um programa com:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

Como o respondente da pergunta mencionado, tenha cuidado com git rm.

Justin Mandzik
fonte
5

Tente o seguinte:

 git rm `git ls-files -d`
eludom
fonte
Isso resolveu o meu problema de encenar somente scripts excluídos (usando bash)
Mariano Argañaraz
3

Você pode usar

git commit -m "remove files" -a
git push

Depois de excluir os arquivos manualmente.

onalbi
fonte
1
Ou de forma idêntica, mas de forma mais sucinta: git commit -AM "arquivos Remover"
BradChesney79
3

Você pode criar um script de shell que removerá todos os seus arquivos quando executar:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

O script criado é remove.she contém a lista completa de git rmcomandos.

La-comadreja
fonte
2
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
Boush
fonte
2
git add -u .

git add --update .
euccas
fonte
2

Se você deseja excluir todos eles usando "git rm". Isto é o que eu faço:

git ls-files --deleted -z | xargs -0 git rm

Esta consulta lista todos os arquivos que foram removidos e os exclui do seu repositório git. Espero que ajude.

DevWL
fonte
1

A função de limpeza integrada também pode ser útil ...

git clean -fd
Randall Borck
fonte
1
Isso se aplica apenas a arquivos não rastreados.
Elijah Lynn
1

Eu tive esse problema de arquivos fantasmas aparecendo no meu repositório depois que os apaguei e me deparei com esse comando puro!

git add -A

É essencialmente o mesmo git add -ae git add -ucombinado, mas diferencia maiúsculas de minúsculas. Comprei-o neste link incrível (este link aponta para a versão em archive.org agora, porque o original foi convertido em uma página de spam / phishing em junho de 2016)

NetOperator Wibby
fonte
0

Aqui está como detectar arquivos excluídos e organizar sua exclusão como parte do próximo commit. Todas as soluções neste segmento têm méritos diferentes. Esta solução abaixo lida especificamente com o problema de nomes de arquivos com espaços neles.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

certifique-se de testar isso com a opção --dry-run do git antes de executá-lo com o seguinte:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

explicação:

git status --porcelain

Isso imprime algo como D "/ caminho para uma pasta / caminho para um arquivo", que ocorre apenas quando há espaços nos nomes dos caminhos.

awk '/^.D .*$/ {print $0}'

corresponde apenas às linhas que começam com "D"

sed 's/ D \(.*\)/\1/'

remova "D" da frente de cada corda

tr -d '"'

remova aspas, se houver

xargs -I {} git rm '{}'

defina variáveis ​​de nome de arquivo como {} execute o nome do arquivo em git rm entre aspas simples para garantir que ele suporte nomes de arquivos com espaços.

ND
fonte