Remover um arquivo de um repositório Git, sem excluí-lo do sistema de arquivos local
-
16-09-2019 - |
Pergunta
Meu commit inicial continha alguns arquivos de log. Eu adicionei *log
ao meu .gitignore
, e agora eu quero remover os arquivos de log do meu repositório.
git rm mylogfile.log
irá remover um arquivo do repositório, mas também irá removê-lo do sistema de arquivos local.
Como posso remover esse arquivo do repo sem apagar minha cópia local do arquivo?
Solução
A partir da arquivo homem :
Quando
--cached
é dado, o encenado conteúdo tem de corresponder quer a ponta da sucursal ou do arquivo no disco, permitindo que o arquivo a ser removido a partir de apenas o índice.
Assim, para um único arquivo:
git rm --cached mylogfile.log
e para um único diretório:
git rm --cached -r mydirectory
Outras dicas
Para remover uma pasta inteira do repo (como arquivos ReSharper), faça o seguinte:
git rm -r --cached folderName
Eu tinha cometido alguns arquivos ReSharper, e não queria que aqueles que persistem por outros usuários do projeto.
Você também pode remover os arquivos a partir do repositório com base no seu .gitignore sem excluí-los a partir do sistema de arquivos local:
git rm --cached `git ls-files -i -X .gitignore`
Ou, em alternativa, no Windows PowerShell:
git rm --cached $(git ls-files -i -X .gitignore)
De acordo com a minha resposta aqui: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory -in-meu-github-repositório
Para remover pasta / diretório ou arquivo somente a partir do repositório git e não a partir da tentativa locais 3 passos simples.
Passos para remover o diretório
git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master
Passos para ignorar que pasta nos próximos commits
Para ignorar essa pasta a partir próximos commits fazer um arquivo na raiz chamada .gitignore e colocar esse nome pastas para ele. Você pode colocar quantos você quiser
.gitignore do arquivo será semelhante a este
/FolderName
Além disso, se você tiver cometido dados sensíveis (por exemplo, um arquivo contendo senhas), você deve excluí-lo completamente da história do repositório. Aqui está um guia que explica como fazer isso: http://help.github.com/remove-sensitive-data/
Uma solução mais genérica:
-
Editar arquivo
.gitignore
.ECHO mylogfile.log >> .gitignore
-
Remova todos os itens do índice.
git rm -r -f --cached .
-
Reconstruir índice.
git add .
-
Verifique novo commit
git commit -m "Removed mylogfile.log"
Git permite que você ignorar esses arquivos, assumindo que eles mantêm-se inalterados. Esta é feito executando o comando
git update-index --assume-unchanged path/to/file.txt
. Uma vez que marca um arquivo como tal vontade, git ignorar completamente quaisquer alterações nesse arquivo; eles não vão aparecer quando executar git status ou git diff, nem jamais ser cometido.
(De https://help.github.com/articles/ignoring-files )
Assim, não excluí-lo, mas ignorando alterações nele para sempre. Eu acho que isso só funciona localmente, de modo colegas de trabalho ainda pode ver alterações nele a menos que executar o mesmo comando como acima. (Ainda precisa verificar isso embora.)
Nota:. Isto não está respondendo à pergunta diretamente, mas se baseia em acompanhamento perguntas nos comentários das outras respostas
Se você quer apenas um arquivo untrack e não excluir do local e remoto repo em seguida, use este comando:
git update-index --assume-unchanged file_name_with_path
respostas acima não trabalho para mim. Eu costumava filter-branch
para remover todos os arquivos comprometidos.
Remover um arquivo de um repositório git com:
git filter-branch --tree-filter 'rm file'
Remover uma pasta de um repositório git com:
git filter-branch --tree-filter 'rm -rf directory'
Isso remove o diretório ou arquivo de todos os commits.
Você pode especificar um commit usando:
git filter-branch --tree-filter 'rm -rf directory' HEAD
Ou um intervalo:
git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD
Para empurrar tudo para remoto, você pode fazer:
git push origin master --force