Remova todos os arquivos "excluídos" no Git

5

Existe uma solução melhor para remover arquivos removidos manualmente do repositório Git do que meu comando atual propenso a erros?

git status | grep deleted: | cut -d: -f2 | xargs git rm
    
por Warren Seine 01.03.2012 / 00:23

2 respostas

5

Acho que você está pedindo para excluir arquivos do índice que foram excluídos da árvore de trabalho. O comando git add -u fará isso, além de adicionar quaisquer alterações na árvore de trabalho (mas não em arquivos novos).

Para fazer mais exatamente o que você pediu, a página git-rm(1) recomenda o seguinte, que é essencialmente igual à sua solução, mas muito menos frágil.

If all you really want to do is to remove from the index the files that are no longer present in the working tree (perhaps because your working tree is dirty so that you cannot use git commit -a), use the following command:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
    
por 01.03.2012 / 03:25
0

Oi eu vou apontar para o meu script etckeeper-ng foram resolvi o mesmo problema

link

Eu descreverei em breve como você poderia fazer melhor:

Primeiro, crie um arquivo auxiliar que possa ser analisado.

git_status_file=/tmp/git_status_file
git status -s > $git_status_file

A variável git_status_file é, neste caso, configurada para / tmp / git_status_file A próxima etapa é usar o $ git_status_file como uma entrada em um loop while:

while read line
do

  if [ $(echo $line |awk '{print $1}') == "D" 2> /dev/null ]
    then
      # git uses "" to denote files with spaces in their names
      # and does not use "" when the name has no spaces
      # so we must distinguish these two cases
      del_file=$(echo $line |awk -F\" '{print $2}'|| echo "no")       
      del_file_S=$(echo $line | awk '{print $2}')

      # ensures that del_file is a full string
      del_file="${del_file[*]}"


      # delete the file, ${del_file:0} expands to  the full file name
      # this is important for files with blanks in their names
      git rm "${del_file:0}" 2> /dev/null|| git rm $del_file_S 2> /dev/null

# this line does only work on non-possix shells
done < <($git_status_file)

Isso realmente funciona com meu módulo do etckeeper-ng, onde resolvi o problema dessa maneira. espero que isso tenha ajudado.

    
por 01.03.2012 / 00:55

Tags