Removendo vários arquivos de um repository Git que já foram apagados do disco

Eu tenho um repository do Git que eu deletei quatro arquivos usando rm ( não git rm ), e meu status do Git é assim:

 # 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 como este:

 git rm file1 file2 file3 file4 

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

Para o Git 1.x

 $ git add -u 

Isso diz ao git para organizar automaticamente os arquivos rastreados – incluindo a exclusão dos arquivos previamente rastreados.

Para o Git 2.0

Para preparar toda a sua tree de trabalho:

 $ git add -u :/ 

Para encenar apenas o caminho atual:

 $ git add -u . 
 git ls-files --deleted -z | xargs -0 git rm 

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

Você pode usar

 git add -u 

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

 git commit -m "Deleted files manually" 

Se você simplesmente executar:

 git add -u 

O git atualizará seu índice para saber que os arquivos que você apagou devem, na verdade, fazer parte do próximo commit. Então você pode executar “git commit” para verificar essa mudança.

Ou, se você correr:

 git commit -a 

Ele irá automaticamente aceitar essas mudanças (e quaisquer outras) e comprometê-las.

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

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

Você provavelmente está procurando por -A:

 git add -A 

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

Para preparar apenas os arquivos excluídos :

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

Ou (o caminho xargs):

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

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

 git rm test.txt 

Antes ou depois de ter excluído o arquivo real.

Ao usar o git-add com as opções ‘–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 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.

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

 git add -u 

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

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

… por outro lado, apenas rm os arquivos excluídos que foram rastreados.

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

Se essas são as únicas mudanças, você pode simplesmente fazer

 git commit -a 

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

 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. 

git add -u

-u –update Apenas coincide com arquivos já rastreados no índice, em vez da tree de trabalho. Isso significa que ele nunca colocará novos arquivos, mas organizará novos conteúdos modificados de arquivos rastreados e removerá os arquivos do índice se os arquivos correspondentes na tree de trabalho tiverem sido removidos.

Se nenhum for dado, padrão para “.”; Em outras palavras, atualize todos os arquivos rastreados no diretório atual e em seus subdiretórios.

Essa solução simples funciona bem para mim:

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

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

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

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

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

Isso removerá todos os arquivos excluídos que foram rastreados anteriormente pelo git, bem como manipulará o caso em que os nomes dos arquivos têm espaços neles.

Dependendo da sua variante POSIX, talvez seja necessário usar xargs -0 -r : isso fará com que os xargs saiam normalmente quando o conteúdo nulo for canalizado.

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

Tente.

 -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add . && git commit -m -a "Your commit" 

ou

 git add --all && git commit -m "Your commit" 

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

Eu apenas mexi na resposta da Virender para fazer o mesmo:

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

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

Trabalhando fora da resposta de Jeremy, é isso que recebi:

 git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm 
  1. Obter o 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 tenha a palavra “excluído”; Eu não lembro exatamente o que era, e ele não está mais lá, então você pode ter que modificar isso para situações diferentes. Eu acho que o agrupamento de expressões pode ser um recurso específico do GNU, então se você não estiver usando o gnutils, você pode ter que adicionar várias linhas grep -v .
  4. Passe os arquivos para git rm .

Colocando isso em um alias de shell agora …

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

 git ls-files --deleted | xargs git rm 

Você provavelmente também vai querer se comprometer com um comentário.

Para obter detalhes, consulte: Scripts úteis do Git

Como mencionado

 git add -u 

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

Para desassociar os arquivos modificados, você pode fazer

 git reset HEAD  

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

Eu precisava do mesmo e usei o botão git gui “stage changed”. também adiciona tudo.

E depois de “estágio alterado” eu fiz “commit” …

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

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

Isso funcionou para mim depois que eu já tinha apagado os arquivos.

Você pode usar git add -u para organizar somente os arquivos excluídos.

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

O -u é necessário para se referir aos arquivos que existem no repository, mas não existem mais no diretório de trabalho. Caso contrário, o padrão de git add é procurar os arquivos no diretório de trabalho e, se você especificar os arquivos excluídos, não os encontrará.

algo como

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

pode fazer isso.

Adicionando o alias do sistema para preparar arquivos apagados como o comando rm-all

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

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

Nota

O Windows precisa ter o bash instalado.

(Ainda outra variação)

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

 git ls-files --deleted | grep  | xargs git rm 

Para projeto de estúdio visual

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

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

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

 git cola 

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

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