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?

Foi útil?

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

directory remover

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:

  1. Editar arquivo .gitignore.

    ECHO mylogfile.log >> .gitignore

  2. Remova todos os itens do índice.

    git rm -r -f --cached .

  3. Reconstruir índice.

    git add .

  4. 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top