Removendo vários arquivos de um repositório git que já foram excluídos do disco
-
20-08-2019 - |
Pergunta
Eu tenho um repositório git que eu tenha apagado quatro arquivos de usar rm
( não git rm
), e os meus Git de estado se parece com isto:
# deleted: file1.txt
# deleted: file2.txt
# deleted: file3.txt
# deleted: file4.txt
Como faço para remover esses arquivos do Git sem ter que ir manualmente através de e adicionar cada arquivo como este:
git rm file1 file2 file3 file4
Idealmente, eu estou procurando algo que funciona da mesma forma que git add .
faz, se isso é possível.
Solução
Para Git 1.x
$ git add -u
Isto diz git para arquivos automaticamente estágio monitorado - inclusive apagando os arquivos previamente rastreados.
Para Git 2.0
Para encenar sua árvore de trabalho inteira:
$ git add -u :/
Para estágio apenas o caminho atual:
$ git add -u .
Outras dicas
git ls-files --deleted -z | xargs -0 git rm
pode ser o que você está procurando .. ele funciona para mim ..
Você pode usar
git add -u
Para adicionar os arquivos apagados para a área de teste, em seguida, cometê-los
git commit -m "Deleted files manually"
Se você simplesmente executar:
git add -u
git irá atualizar seu índice para saber que os arquivos que você excluídos deve realmente ser parte do próximo commit. Em seguida, você pode executar "git commit" para verificar nessa mudança.
Ou, se você executar:
git commit -a
Isso levará automaticamente essas mudanças (e quaisquer outros) e cometê-los.
Atualização : Se você só quer adicionar arquivos apagados, tente:
git ls-files --deleted -z | xargs -0 git rm
git commit
Você está procurando provavelmente -A:
git add -A
este é semelhante ao u add git, mas também adiciona novos arquivos. Este é aproximadamente o equivalente de comando addremove
de hg (embora a detecção de movimento é automático).
Para estágio apenas o Suprimido arquivos:
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 apelido seu conjunto de comandos preferido para uso posterior conveniente .
git rm test.txt
Antes ou depois de eliminado o arquivo real.
Ao usar git-add com '--all' ou 'opções --update' você pode obter mais do que você queria. Novas e / ou modificados arquivos também serão adicionados ao índice. Eu tenho uma configuração festa alias para quando eu quiser remover arquivos apagados de git sem outros arquivos tocar:
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ída.
Não que isso realmente importa, mas eu discordo com a resposta escolheu:
git add -u
... irá remover arquivos do índice se os arquivos correspondentes na árvore de trabalho foram removidos, mas que também irá sediar os novos conteúdos modificados de arquivos rastreados.
git rm $(git ls-files --deleted)
... por outro lado, só vai rm os arquivos apagados que foram rastreados.
Assim, o ú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. Que irá incluir arquivos excluídos.
git ls-files --deleted | xargs git rm
é a melhor opção para adicionar arquivos somente excluídos.
Aqui está 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 --atualizar Apenas o jogo contra arquivos já rastreados no índice em vez da árvore de trabalho. Isso significa que ele nunca vai encenar novos arquivos, mas que será palco modificados novos conteúdos de arquivos rastreados e que ele irá remover arquivos do índice se os arquivos correspondentes na árvore de trabalho foram removidos.
Se não for dada, padrão para ""; em outras palavras, atualizar todos os arquivos rastreados no diretório atual e seus subdiretórios.
Essa solução simples funciona bem para mim:
git rm $(git ls-files --deleted)
Se você quiser adicionar ao seu .gitconfig
fazer isso:
[alias]
rma = !git ls-files --deleted -z | xargs -0 git rm
Então tudo que você tem a fazer é executar:
git rma
git ls-files --deleted -z | xargs -0 git rm --cached
Isto irá remover todos os arquivos excluídos que estavam anterior rastreado por git, bem como lidar com o caso em que seus nomes têm espaços entre eles.
Dependendo da sua variante POSIX, você pode precisar usar xargs -0 -r
:. Isso fará com que xargs
para sair graciosamente quando o conteúdo nulo encanada
Editar:. Bandeiras --cached
e --deleted
são usados ??em conjunto para salvaguarda contra a exclusão acidental de arquivos que já não tenham sido 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"
Utilize -t
para ver qual comando está realmente sendo ran
Eu só mexido resposta Virender fazer mesmo:
git ls-files --deleted -z | xargs -t -0 git rm
Nenhuma das bandeiras para git-add só vai encenar arquivos removidos; se tudo que você tenha modificado são arquivos apagados, então você está bem, mas caso contrário, você precisa executar git-status e analisar a saída.
Trabalhando fora da resposta de Jeremy, isso é o que eu tenho:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
- Obter status dos arquivos.
- Para arquivos apagados, isolar o nome do arquivo.
- Remova todas as linhas que começam com # s, bem como uma linha de status que tinha a palavra "excluído" nele; Não me lembro o que era, exatamente, e ele não está lá por mais tempo, então você pode ter que modificar este para diferentes situações. Eu acho que o agrupamento de expressões pode ser uma característica específica de GNU, por isso, se você não está usando gnutils, você pode ter que adicionar várias linhas
grep -v
. - Passe os arquivos para
git rm
.
Furar isso em um alias de shell agora ...
Como mencionado
git add -u
encena os arquivos removidos para exclusão, mas também modificado arquivos de atualização.
Para unstage os arquivos modificados você pode fazer
git reset HEAD <path>
Se você gosta de manter seus commits organizado e limpo
NOTA:. isso também poderia unstage os arquivos apagados, tão cuidadoso com esses curingas.
A seguir irá funcionar, mesmo se você tem um monte de arquivos para processo:
git ls-files --deleted | xargs git rm
Você provavelmente também querem se comprometer com um comentário.
Para obter mais informações, consulte: úteis Scripts Git
git commit -m 'commit msg' $(git ls-files --deleted)
Isso funcionou para mim depois que eu já tinha apagado os arquivos.
Eu precisava do mesmo e usado git gui "estágio mudou" botão. ele também adiciona todos.
E depois de "palco mudou" Eu fiz "comprometer" ...
então meu diretório de trabalho é limpo novamente.
Você pode usar git add -u <filenames>
para estágio somente os arquivos apagados.
Por exemplo, se você excluiu a templates/*.tpl
arquivos, em seguida, usar git add -u templates/*.tpl
.
O -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 de git add
é procurar os arquivos no diretório de trabalho, e se você especificar os arquivos que você tenha excluído lá, não vai encontrá-los.
algo como
git status | sed -s "s/^.*deleted: //" | xargs git rm
pode fazê-lo.
Adicionando apelido sistema para o estadiamento arquivos como comando rm-all
UNIX
alias rm-all='git rm $(git ls-files --deleted)'
Windows
doskey rm-all=bash -c "git rm $(git ls-files --deleted)"
Nota ??em>
Windows precisa ter bash
instalado.
(Ainda outra variação)
Eu queria apagar todos os já apagados dos arquivos de disco, mas a partir de uma pasta específica, deixando as outras pastas intocado. A seguir trabalhou para mim:
git ls-files --deleted | grep <folder-name> | xargs git rm
git rm $(git ls-files -d)
Remove todos os arquivos listados pelo comando git ls-files
(show -d apenas arquivos apagados). Não funciona para arquivos com espaços no nome do arquivo ou caminho, mas simples de lembrar
Para projeto visual studio
'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 eu encontrei até agora é
git cola
E selecionar todos os arquivos apagados que eu quero palco.
(Note que eu costumo fazer tudo de comando no git, mas alças git removido arquivos um pouco estranho).