.gitignore e "Os seguintes arquivos da árvore de trabalho não rastreados seriam substituídos pelo checkout"


828

Então, adicionei uma pasta ao meu arquivo .gitignore.

Depois de fazer um git status, me diz

# On branch latest
nothing to commit (working directory clean)

No entanto, quando tento alterar ramificações, obtenho o seguinte:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

É assim que meu arquivo .gitignore se parece:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

Como faço para que isso funcione para que eu possa alternar ramificações sem excluir esses arquivos?

Se eu fizer uma alteração, isso afetará esses arquivos? Em outras palavras, se eu voltasse a esse ramo mais tarde, tudo seria perfeito até o meu último commit?

Não quero perder esses arquivos, apenas não os quero rastreados.


10
se você realmente não se preocupam com esses arquivos: git checkout -f <ramo> No meu caso os arquivos são gerados no processo de construção, então eu coudl não se importar menos
Hobbamok

Às vezes, acontece se você fizer 'git checkout' (sem um nome de filial). Para corrigir, faça 'git checkout branchname' #
crafter

Pergunta separada, mas criticamente relacionada: por que esse erro ocorre? por que o git não pode simplesmente alternar entre os ramos?
Ahnbizcad 08/12/19

@ahnbizcad Porque se você estivesse trabalhando em um novo arquivo, e alguém em outro ramo cometer um arquivo com o mesmo nome, você ficaria chateado se o git destruísse sua versão quando você trocasse de ramo. É por isso que a bandeira -f está lá.
Matthew Sharp

Respostas:


264

Parece que você deseja que os arquivos sejam ignorados, mas eles já foram confirmados. .gitignore não tem efeito nos arquivos que já estão no repositório, portanto eles precisam ser removidos com git rm --cached. O --cachedvai impedi-lo de ter qualquer efeito sobre a sua cópia de trabalho e ele vai marcar como removido na próxima vez que cometer. Após a remoção dos arquivos do repositório, o .gitignore impedirá que sejam adicionados novamente.

Mas você tem outro problema com o seu .gitignore, está usando excessivamente curingas e isso faz com que ele corresponda menos do que o esperado. Em vez disso, vamos alterar o .gitignore e tentar isso.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/

2
Obrigado .... Eu removi todos os arquivos da ramificação atual e fiz o backup deles. Depois troquei de galho e coloque-o de volta. Isso funcionou. Além disso, obrigado pela dica sobre o .gitignore
marcamillion

@ camcamillion: O que você quer dizer com "isso funcionou"? Se os arquivos foram monitorados no ramo que você mudou para, você substituído-los com suas versões, o que poderia ser diferente ...
Cascabel

1
Eu estava tendo um problema com uma pasta / build que não precisa ser rastreada. Então, excluí a pasta local, confirmei meu arquivo .gitignore e verifiquei a outra ramificação. Isso finalmente funcionou para mim.
Mike S.

16
Eu acho que a primeira parte é para o reverso dessa mensagem de erro específica. Este erro está indicando que o usuário está atualmente em uma ramificação que não tem esses arquivos JPG rastreados e o usuário está tentando passar para uma que possui. Portanto, fazer git rm --cachednão fará diferença, esses arquivos não existem na ramificação atual. Para esse erro, acho que o usuário precisa seguir a resposta de @Greg Hewgill - "mova-o para fora da cópia de trabalho, troque de ramificação e mova-o para trás".
precisa saber é o seguinte

5
Como um iria sobre como resolver o your files would be overwrittencom fatal: pathspec 'test/node_modules' did not match any filesquando eu faço git rm -r --cache test/node_modules? Eu não posso puxar por causa da mensagem sobreposta e não pode remover, porque git não pode encontrá-los (eles estão lá)
HMR

1047

AVISO: ele excluirá arquivos não rastreados, portanto, não é uma ótima resposta para a pergunta que está sendo feita.

Eu bati nessa mensagem também. No meu caso, eu não queria manter os arquivos, então isso funcionou para mim:

git 2.11 e mais recente

git clean  -d  -f .

idiota mais velho

git clean  -d  -f ""

Se você também deseja remover arquivos ignorados pelo git, execute o seguinte comando.

ESTEJA AVISADO!!! Isso provavelmente destrói o seu projeto, use apenas se você souber 100% do que está fazendo

git 2.11 e mais recente

git clean  -d  -fx .

idiota mais velho

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x significa que arquivos ignorados também são removidos e arquivos desconhecidos pelo git.

  • -d significa remover diretórios não rastreados, além de arquivos não rastreados.

  • -f é necessário para forçá-lo a executar.


7
Obrigado, depois dessa limpeza, pude me recuperar;
Alexander Beletsky

139
Tenha cuidado ao executar o git clean!
Noel

249
Para evitar um facepalm, primeiro execute-o com a opção dry-run para ver o que ele faria: git clean -dfxnougit clean -dfx --dry-run
Dennis

74
Puta merda. Isso exclui todos os arquivos de configuração no meu xcode e agora o projeto está se transformando em projeto mac. TENHA MUITO CUIDADO AO EXECUTAR ESTE COMANDO. Eu pensei que só iria removê-lo do git.
tyegah123

25
A -xopção de me dói
Wener

589

Aviso: Isso excluirá os arquivos locais que não estão indexados

Apenas force: git checkout -f another-branch


78
Aviso: Isso excluirá os arquivos locais que não estão indexados.
givanse

git clean não funcionou para mim, mas força era exatamente o que eu precisava. Estava preso naquele galho e eu só precisava mudar de galho.
Simon The Cat

7
Eu não queria o arquivo que não estava indexado! +1 para você
ryansstack 19/03/2015

Eu recebi este erro ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo 24/01

2
Esta é a verdadeira resposta.
Metamonkey 19/02/19

147

Se você estiver no OS X, pode ser porque o nome de um arquivo teve certos caracteres que mudam de caso. Tente definir a seguinte opção de configuração:

git config core.ignorecase true

13
Ele trabalhou em Windows, bem, parece que esta situação aconteceu, em primeiro lugar devido à mudança caso em que GIT não conseguiu determinar
SagiLow

4
Este é exatamente o problema que tive, um caminho de arquivo era diferente em uma letra maiúscula - o Windows trata isso da mesma forma, mas o GIT não, qual é o problema.
Daniel Sokolowski

1
Meu problema aconteceu no checkout de outra ramificação no Windows 10, e somente esse trabalho para mim, Obrigado
Weijie dom

impressionante! Isso resolveu o meu problema quando eu estava se movendo entre as tags
William Añez

1
Funciona também se você tentar git rebasetambém. Obrigado.
User3890355

42

O Git está lhe dizendo que deseja criar arquivos (nomeados public/system/images/9/...etc), mas você já possui arquivos existentes nesse diretório que não são rastreados pelo Git. Talvez alguém tenha adicionado esses arquivos ao repositório Git, e esta é a primeira vez que você muda para esse ramo?

Provavelmente, existe um motivo para esses arquivos em sua developramificação, mas não em sua ramificação atual. Você pode ter que perguntar a seus colaboradores por que isso acontece.

como faço para que isso funcione para que eu possa alternar ramificações sem excluir esses arquivos?

Você não pode fazer isso sem fazer com que os arquivos desapareçam de alguma forma. Você pode renomear publicpara my_publicou algo assim por enquanto.

se eu voltasse a esse ramo depois tudo estaria perfeito até o meu último commit?

Se você confirmar suas alterações, o Git não as perderá. Se você não confirmar suas alterações, o Git tentará realmente não substituir o trabalho que você fez. É sobre isso que o Git está avisando em primeira instância aqui (quando você tentou alternar ramificações).


Obrigada pelo esclarecimento. Fiz uma cópia de segurança dos arquivos, troquei de ramificação e mesclei-os e substituí os arquivos na pasta pública. Isso funcionou.
Marcamillion

1
Como eu comentei na resposta do @ Arrowmaster. Esta é a resposta certa para a mensagem de erro. Pode não ser a resposta certa para esse questionador em particular, pois ele parece ser o seu principal causador de problemas reais.
studgeek

38

Isso funcionou para mim.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

5
Por favor, adicione explicações sobre sua solução. consulte stackoverflow.com/help/how-to-answer
user7294900

Aqui está a minha opinião. Sua cópia local da ramificação remota realmente tem todos os arquivos não rastreados, de alguma forma. Você está verificando isso para restaurar os arquivos não rastreados sobre os quais se queixou originalmente. Agora você pode mudar para outros ramos
ahnbizcad

2
Por alguma razão, esta é a única solução funcional para mim. Obrigado companheiro.
Kiwad

Resolveu o meu problema. Obrigado
Devashis Kant 29/03/19

Muito obrigado, tão simples! git reset --soft origin / develop. Como eu odeio esses conflitos de mesclagem de edição. Este comando é tão agradável e simples.
Nine9five

22

Existe um comando para esta tarefa delicada (excluir permanentemente arquivos não rastreados)

git clean -i

Então git pullvai fazer.


13

Para aqueles que precisam de algo menos abrangente do que a resposta de Scott Schafer ,

git clean -f

provavelmente funcionará. I altamente sugerir executando

git clean --dry-run

primeiro. Esse comando produzirá uma lista de arquivos que o Git removerá se você executar git clean -f, e poderá economizar o esforço de remover inadvertidamente algo que você não deseja.

Consulte esta resposta do Stack Oveflow ou os documentos para obter mais informações git clean.


12

Infelizmente nem git rm --cachedou git clean -d -fx ""fez isso por mim.

Minha solução acabou sendo levar minha ramificação para controle remoto, clonando um novo repositório e fazendo a mesclagem no novo repositório. Outras pessoas que acessaram o repositório tiveram que fazer o mesmo.

Moral da história: use um .gitignorearquivo desde o início.


10

Se você deseja resolver rapidamente esta questão, pode usar este comando:

git checkout -f dev

Isso me ajudou quando meu problema não estava relacionado ao .gitignoreafaik.
Nakilon

error: pathspec 'dev' não corresponde a nenhum arquivo conhecido pelo git.
Preto

@Black 'dev' é o nome da filial, coloque sua filial
Vinit Solanki

8

Eu tive o mesmo problema ao fazer check-out de uma ramificação com base em uma confirmação anterior. O Git recusou o check-out por causa de arquivos não rastreados.

Encontrei uma solução e espero que também o ajude.

Adicionar os diretórios afetados .gitignoree emitir $ git rm -r --cachedneles aparentemente não é suficiente.

Suponha que você queira criar uma ramificação baseada em um commit anterior K para testar algumas coisas e voltar à versão atual. Eu faria isso nas seguintes etapas:

  1. Configure os arquivos não rastreados: edite .gitignoree aplique $ git rm -r --cachednos arquivos e diretórios que você deseja que o git ignore. Adicione também o .gitignorepróprio arquivo .gitignoree não esqueça de emitir $ git rm -r --cached .gitignore. Isso garantirá que o comportamento ignorar do git deixe o mesmo nos commits anteriores.

  2. Confirme as alterações que você acabou de fazer:

    $ git add -A
    $ git commit

  3. Salve o log atual, caso contrário, poderá haver problemas para voltar à versão atual

    $ git log > ../git.log

  4. Reinicialização total para o commit K

    $ git reset --hard version_k

  5. Crie uma ramificação baseada no commit K

    $ git branch commit_k_branch

  6. Fazer check-out nesse ramo

    $ git checkout commit_k_branch

  7. Faça suas coisas e cometa

  8. Checkout de volta ao master novamente

    $ git checkout master

  9. Redefinir para a versão atual novamente

    $ git reset current_version ou $ git reset ORIG_HEAD

  10. Agora você pode redefinir com força o HEAD

    git reset --hard HEAD

NOTA! Não pule a penúltima etapa (como por exemplo $ git reset --hard ORIG_HEAD ), caso contrário, os arquivos não rastreados que o git se queixou acima serão perdidos.

Também verifiquei se os arquivos que o git se queixava não eram excluídos. Copiei-os para um arquivo de texto e emiti o comando$ for i in $(cat ../test.txt); do ls -ahl $i; done

Se você fizer o checkout da filial mencionada acima novamente, não se esqueça de emitir $ git statuspara garantir que nenhuma alteração indesejada apareça.


8

Isso aconteceu comigo em um sistema Windows 8 , usando o Git no prompt de comando. O resto da minha equipe usa o TFS , e eu uso o git-tf da Microsoft para enviar / receber entre o TFS e meu repositório Git local.

O problema surgiu devido a alguns arquivos que foram renomeados apenas para mudar de caso . O que parece ter acontecido foi o seguinte:

  • Os arquivos foram verificados com letras maiúsculas e minúsculas em seus nomes.
  • Em uma consolidação posterior, os nomes dos arquivos foram alterados para minúsculas.
  • O git-tf inicialmente obteve os arquivos em maiúsculas e minúsculas.
  • Quando os arquivos foram renomeados para letras minúsculas, o git-tf não os obteve porque, no Windows 8, esses nomes de arquivos são equivalentes.
  • Como o Git diferencia maiúsculas de minúsculas, ele reclamou que eu tinha os arquivos de maiúsculas e minúsculas que não estavam no controle de origem. Mas git status, usando , não pude ver nenhuma alteração, pois no prompt de comando do Windows esses nomes de arquivo são equivalentes.

A solução mais simples para mim foi:

  • git checkoutuma versão anterior do projeto, muito antes de esses arquivos serem adicionados .
  • Em seguida, git checkouta versão mais recente do projeto, com a caixa de arquivo correta.

+1 Pude usar o git log na ramificação e ramificação atuais para me refazer para ver quando ocorreu a confirmação que mudou o caso; então eu cortado em torno dele ...
sage

4

Essas duas funções (git rm --cached, git checkout -f another-branch) NÃO funcionaram para mim.

Em vez disso, eu removi fisicamente o arquivo (no eclipse) como o que o Git diz para você fazer; Mova ou remova-os antes de poder trocar de ramificação.

e então adiciono / comprometi.

e então eu puxei e funcionou!


4

No meu caso, o problema estava com os submódulos. masterfoi mesclado com outro ramo que adicionou um novo submódulo ao projeto. O ramo que eu estava tentando fazer check-out não tinha, por isso o git estava reclamando de arquivos não rastreados e nenhuma das outras soluções sugeridas funcionou para mim. Forcei o checkout para minha nova filial e puxei o mestre.

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

3

No meu caso git rm --cachednão funcionou. Mas eu entendi com umgit rebase


3

Eu também estava enfrentando um problema semelhante e tentei todas as soluções postadas acima, mas não funcionou

O problema foi causado quando eu mudei o nomeonMusicUpdateListener.java para OnMusicUpdateListener.javano developramo.

Agora mastertinha onMusicUpdateListener.java e developtinha o mesmo arquivo queOnMusicUpdateListener.java

Agora, sempre que eu mudei para mestre, isso me dava um erro

The following untracked working tree files would be overwritten by checkout

e então aborted.

Para resolver isso, forço checked out masterramificadamente e renomei meu nome onMusicUpdateListener.javapara OnMusicUpdateListener.java, committedit e então mergedcom developbranch.

Então atualizei meu developramo por mergingele mastere agora tudo voltou ao normal e o problema foi resolvido.


Eu já tive problemas semelhantes antes. Para meu entendimento, o problema de distinção entre maiúsculas e minúsculas parece ser um problema apenas no Windows. Eu acho que você está desenvolvendo no Windows?
Ji_in_coding 13/06/19

2

Isso pode ser um problema de permissão,

mude a propriedade,

sudo chown -v -R usr-name:group-name folder-name

Eu também tive o mesmo problema que Won. Adicionei um .gitignore a uma pasta que já estava sendo rastreada. Excluí o arquivo e, em seguida, consegui fazer um checkout do git.
cbloss793

2

2 arquivos com o mesmo nome, mas caso diferente pode ser o problema.

Você pode excluir um desses arquivos ou renomeá-lo. Ex:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

Mover arquivos, em vez de excluir

Uma maneira de evitar a exclusão de arquivos é movê-los. Por exemplo:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

1

Se você renomeou um arquivo localmente e, em seguida, execute a pull, ele exibirá essa mensagem de erro.


Como superar esse erro nesse caso? Esta mensagem também aparece ao alternar ramificações após alterar o caso em um nome de arquivo (MyFile => myfile).
Bernhard Döbler 22/11

1

fácil de resolver, o git está dizendo que você tem os mesmos arquivos nos dois ramos; portanto, você deve excluir os arquivos específicos do ramo mestre e poderá mesclar:

git mesclar "sua filial"

Espero que funcione para você, acabei de resolver meu erro. meu erro foi:

erro: Os seguintes arquivos da árvore de trabalho não rastreados seriam substituídos por mesclagem: .vs / slnx.sqlite Mova ou remova-os antes de mesclar. Interrompendo

Agora está funcionando! No meu caso .vs / slnx.sqlite foi gerado pelo visual studio, eu precisava fechá-lo antes de excluí-lo.


0

No meu caso, eu estava vendo esse erro porque estava usando um CMS de código aberto popular e o diretório que estava causando problemas era o diretório de uploads no qual o CMS grava.

Então, o que estava dizendo é que existem arquivos que você não possui, mas que não pode ser obtido com o controle de versão.

Estou pegando todos os arquivos do site ativo para o meu local, depois verifico isso no repositório, na esperança de que isso resolva o problema.


0

Exclua o arquivo .gitignore do appname / gen / para resolver esse problema.


0

Eu apenas fui ao sistema de arquivos e excluí o arquivo diretamente, depois continuei com o git checkout e funcionou.

Eu já tive o problema várias vezes e pode estar relacionado a desenvolvedores que excluem, pressionam, adicionam novamente, pressionam ou algo do tipo.


0

A maioria das respostas considera excluir ou remover os arquivos, que é a maneira mais fácil. Mas às vezes você não quer se livrar dos arquivos locais. Mas junte-se a uma estratégia, para que o git também tenha uma solução para isso;

git merge --strategy=ours master 

0

Basta excluir os arquivos ou renomeá-los.

por exemplo

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

Eu tive que renomear / excluir ajax / product.php e ajax / produtoPrice.php .

Não se preocupe, o git pull os trará de volta. Sugiro que você os renomeie em vez de excluí-los, pois poderá perder algumas alterações.

Se isso não ajudar, é necessário excluir todo o ramo e criá-lo novamente. git pull origin remotebranch


0

Para salvar os arquivos modificados e usar o conteúdo modificado posteriormente. Encontrei esse erro enquanto tento verificar uma ramificação e ao tentar fazer uma nova recuperação. Experimente o Git stash

git stash


0

Verifique se algum nome de pasta com '/' ou qualquer símbolo especial, renomeie essas pastas. Então você apenas clona o repositório para outro local.


0

Uma solução simples pode ser: Apenas verifique se você está no diretório de trabalho correto em GitBash. Essa mensagem ocorre quase sempre, se um usuário tentar mesclar um diretório muito alto na hierarquia de pastas.

Exemplo:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Cenário: O repositório clonado pelo usuário git-foldercriou um novo projeto Java no Eclipse, importou o repositório clonado. O Eclipse definiu myProjectSourceFolder como Pasta de Origem em seu Projeto local. portanto, o usuário entrou no git bash e pressionou, puxou e comprometeu seu projeto a partir daí. Portanto, o git sincroniza myProjectSourceFolder- mas não possui registro em seu histórico para myBashSourceFolder. Portanto, um push / pull / merge de myBashSourceFolder produzirá a saída especificada, se o Usuário tentar sincronizar a partir da próxima vez, em vez da pasta em que ele trabalhou anteriormente.

Solução: Digite a pasta correta e tente novamente. Em quase todas as vezes que encontrei, essa solução funcionou bem :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.