Ontem, postei uma pergunta sobre como clonar um repositório Git de uma das minhas máquinas para outra. Como posso 'clonar git' de outra máquina? .
Agora, consigo clonar com êxito um repositório Git da minha fonte (192.168.1.2) para o meu destino (192.168.1.1).
Mas quando eu fiz uma edição em um arquivo, a git commit -a -m "test"
e a git push
, recebo este erro no meu destino (192.168.1.1):
git push
[email protected]'s password:
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error:
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error:
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://[email protected]/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://[email protected]/media/LINUXDATA/working'
Estou usando duas versões diferentes do Git (1.7 no controle remoto e 1.5 na máquina local). Essa é uma razão possível?
git config receive.denyCurrentBranch=updateInstead
Respostas:
Você pode simplesmente converter seu repositório remoto em repositório vazio (não há cópia de trabalho no repositório vazio - a pasta contém apenas os dados reais do repositório).
Execute o seguinte comando na pasta do repositório remoto:
Em seguida, exclua todos os arquivos, exceto
.git
nessa pasta. E então você poderá executargit push
no repositório remoto sem erros.fonte
git config --bool core.bare true
. Existe algum motivo específico para a exclusão de alguns arquivos? Em caso afirmativo, você pode ser mais preciso sobre o que precisa ser excluído?Eu apenas tive o mesmo erro quando comecei a aprender Git . Algumas das outras respostas claramente não são para alguém novo no Git!
(Vou usar termos não técnicos para transmitir a ideia.) De qualquer forma, o que está acontecendo é que você tem dois repositórios, um é o original que você criou primeiro e o outro o trabalho que você acabou de fazer.
No momento, você está no seu repositório de trabalho e está usando o ramo "principal". Mas você também está "logado" no seu repositório original na mesma ramificação "principal". Agora que você está "logado" no original, o Git teme que você estrague tudo, porque pode estar trabalhando no original e estragar tudo. Então você precisa retornar ao repositório original e fazer um "git checkout someotherbranch", e agora você pode enviar sem problemas.
Eu espero que isso ajude.
fonte
git checkout -b tmp
. Em seguida, na fonte de repo:git push
. Depois, de volta ao alvo (opcional):git checkout master; git branch -d tmp
A mensagem de erro descreve o que aconteceu. Versões mais modernas do Git se recusam a atualizar um ramo por meio de um push, se esse ramo estiver com check-out.
A maneira mais fácil de trabalhar entre dois repositórios não-nua é
sempre atualize os repositórios por pull (ou busca e mesclagem) ou, se necessário,
empurrando para uma ramificação separada (uma ramificação de importação) e depois mesclando essa ramificação na ramificação mestre na máquina remota.
O motivo dessa restrição é que a operação push opera apenas no repositório Git remoto, não tem acesso ao índice e à árvore de trabalho. Portanto, se permitido, um push na ramificação de check-out mudaria
HEAD
para ser inconsistente com o índice e a árvore de trabalho no repositório remoto.Isso tornaria muito fácil confirmar acidentalmente uma alteração que desfaz todas as alterações enviadas e também torna muito difícil distinguir entre as alterações locais que não foram confirmadas e as diferenças entre a nova
HEAD
árvore, o índice e a árvore de trabalho que foram causada pelo movimento do impulsoHEAD
.fonte
git remote add box191 <191url>
) ou pode empurrar da caixa 191 para uma ramificação com nome alternativo (por exemplogit push origin master:refs/heads/upload
) e, em seguida, para a caixa 192 e mesclar (por exemplogit merge upload
).git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309 : você não precisa mais da opção 2.Sumário
Você não pode enviar para a ramificação com check-out de um repositório, pois isso interferiria com o usuário desse repositório de uma maneira que provavelmente terminaria com a perda de dados e histórico . Mas você pode enviar para qualquer outra ramificação do mesmo repositório.
Como os repositórios bare nunca têm nenhuma ramificação com check-out, você sempre pode enviar por push para qualquer ramificação de um repositório bare.
Existem várias soluções, dependendo de suas necessidades.
Solução 1: Use um repositório vazio
Como sugerido, se em uma máquina você não precisar do diretório ativo, poderá mudar para um repositório vazio. Para evitar mexer com o repositório, você pode apenas cloná-lo:
Agora você pode enviar tudo o que deseja para o mesmo endereço de antes.
Solução 2: enviar para uma ramificação sem check-out
Mas se você precisar verificar o código no seu controle remoto
<remote>
, poderá usar uma ramificação especial para enviar por push. Digamos que em seu repositório local você tenha chamado seu controle remotoorigin
e esteja no ramo principal. Então você poderia fazerEntão você precisa mesclá-lo quando estiver no
origin
repositório remoto:Autópsia do problema
Quando uma ramificação é retirada, a confirmação adicionará uma nova confirmação com o cabeçalho da ramificação atual como pai e moverá a cabeça da ramificação para esse novo commit.
assim
torna-se
Mas se alguém pudesse passar para o ramo intermediário, o usuário entraria no que o git chama de modo de cabeça desanexada :
Agora, o usuário não está mais no ramo1, sem ter solicitado explicitamente o check-out de outro ramo. Pior, agora o usuário está fora de qualquer ramo e qualquer novo commit estará apenas dangling :
Hipoteticamente, se nesse momento o usuário fizer check-out de outra ramificação, esse commit pendente se tornará um jogo justo para o coletor de lixo do Git .
fonte
HEAD
no repositório enviado por push.HEAD
ainda apontará para a ramificação, e a ramificação, por sua vez, apontará para os novos commits enviados; mas o diretório de trabalho e a área de indexação / preparação não serão modificados. Quem trabalha no repositório enviado agora precisa se esforçar muito para se recuperar dos efeitos do envio: descubra se há alguma alteração a ser salva e, se for o caso, organize-a com cuidado.master
repositório no meu PC local. Adicionei o arquivoremotes
à pasta do servidor e tentei enviar meu repositório para o servidor, para que outro usuário o puxasse / buscasse para trabalhar. Eu recebo o seguinte erro:! [remote rejected] master -> master (branch is currently checked out)
Como posso fazer check-in?Você pode contornar essa "limitação" editando o
.git/config
servidor de destino. Adicione o seguinte para permitir que um repositório git seja enviado por push, mesmo que esteja com check-out:ou
O primeiro permitirá o empurrão enquanto avisa sobre a possibilidade de atrapalhar o galho, enquanto o segundo o permitirá apenas silenciosamente.
Isso pode ser usado para "implantar" o código em um servidor que não se destina à edição. Essa não é a melhor abordagem, mas rápida para implantar código.
fonte
cd .. && git reset --hard
gancho pós-recebimento para implantar. Hackish, mas funciona.git config receive.denyCurrentBranch warn
git config --local receive.denyCurrentBranch updateInstead
https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
Use isso no repositório do servidor e também atualiza a árvore de trabalho se nenhuma substituição não rastreada acontecer.
Foi adicionado no Git 2.3, como mencionado por VonC nos comentários.
Eu compilei o Git 2.3 e tentei. Uso da amostra:
Resultado:
Yay,
b
fui empurrado!fonte
--bare
clone tradicional que eu penso:--force
é necessário empurrar e fará com que você "perca" os commits no controle remoto.Eu gosto da idéia de ainda ter um repositório utilizável na caixa remota, mas em vez de um ramo fictício, eu gosto de usar:
Este parece ser um recurso muito novo do Git - estou usando a versão 1.7.7.4 do git.
fonte
git checkout master
para voltar ao ramo principal. É só então que suas alterações estão sendo aplicadas.Eu tive o mesmo problema. Para mim, eu uso o Git push para mover o código para meus servidores. Eu nunca altero o código no lado do servidor, portanto isso é seguro.
No repositório, você está pressionando para digitar:
Isso permitirá que você altere o repositório enquanto ele é uma cópia de trabalho.
Depois de executar um push do Git, vá para a máquina remota e digite:
Isso fará com que as alterações enviadas sejam refletidas na cópia de trabalho da máquina remota.
Observe que isso nem sempre é seguro se você fizer alterações na cópia de trabalho para a qual está empurrando.
fonte
denyCurrentBranch
e colocargit checkout -f
dentrohooks
da pasta como @ jack-Senechal postado aquiVocê pode recriar o repositório do servidor e enviar do mestre da filial local para o mestre do servidor.
No seu servidor remoto:
OK, na sua filial local:
fonte
O que você provavelmente fez para causar isso:
Esse tipo de coisa acontece quando você inicia um pequeno programa. Você está prestes a mudar algo que já estava funcionando, por isso lança seu feitiço de invalidez perpétua nível 3:
e você começa a adicionar / confirmar. Mas então , o projeto começa a se envolver mais e você deseja trabalhar com ele em outro computador (como o PC ou laptop em casa), para fazer algo como
e ele clona e tudo fica bem, e você trabalha no seu código da machine2.
Então ... você tenta enviar por push as confirmações da máquina2 e recebe a mensagem de aviso no título.
O motivo dessa mensagem é que o repositório git do qual você retirou era destinado a ser usado apenas para essa pasta na máquina1. Você pode clonar muito bem, mas pressionar pode causar problemas. A maneira "adequada" de gerenciar o código em dois locais diferentes é com um repositório "vazio", como foi sugerido. A repo nua não é projetado para ter qualquer trabalho que está sendo feito no -lo, que se destina a coordenar os commits a partir de múltiplas fontes. É por isso que a resposta com a melhor classificação sugere excluir todos os arquivos / pastas que não sejam a pasta .git depois de você
git config --bool core.bare true
.Esclarecendo a resposta mais bem classificada: Muitos dos comentários a essa resposta dizem algo como "Eu não excluí os arquivos não .git da máquina1 e ainda consegui confirmar na máquina2". Está certo. No entanto, esses outros arquivos estão completamente "divorciados" do repositório git, agora. Vá tentar
git status
lá e você verá algo como "fatal: Esta operação deve ser executada em uma árvore de trabalho". Portanto, a sugestão de excluir os arquivos não é para que o commit da máquina2 funcione ; é para que você não fique confuso e pense que o git ainda está rastreando esses arquivos. Mas excluir os arquivos é um problema se você ainda deseja trabalhar nos arquivos da máquina1, não é?Então, o que você realmente deve fazer?
Depende de quanto você planeja continuar trabalhando na máquina1 e na máquina2 ...
Se você terminou de desenvolver a partir da máquina1 e mudou todo o seu desenvolvimento para a máquina2 ... faça o que a resposta mais votada sugere:
git config --bool core.bare true
e, opcionalmente, exclua todos os arquivos / pastas que não sejam .git dessa pasta, pois eles é rastreado e provavelmente causará confusão.Se o seu trabalho no machine2 foi algo único e você não precisa continuar o desenvolvimento por lá ... não se preocupe em fazer um repo; apenas ftp / rsync / scp / etc. seus arquivos da máquina * 2 * sobre os arquivos da máquina * 1 *, confirme / envie da máquina * 1 * e exclua os arquivos da máquina * 2 *. Outros sugeriram a criação de um ramo, mas acho que é um pouco confuso se você apenas deseja mesclar algum desenvolvimento que você fez de uma só vez a partir de outra máquina.
Se você precisar continuar o desenvolvimento na máquina1 e na máquina2 ... precisará configurar as coisas corretamente. Você precisa converter seu repositório para um simples, então você precisa criar um clone disso no machine1 para trabalhar . Provavelmente, a maneira mais rápida de fazer isso é fazer
Muito importante: porque você mudou o local do repositório de proj1 para proj1.git, é necessário atualizá-lo no arquivo .git / config na máquina2 . Depois disso, você pode confirmar suas alterações no machine2. Por fim, tento manter meus repositórios nus em um local central, longe das minhas árvores de trabalho (ou seja, não coloque 'proj1.git' na mesma pasta pai que 'proj1'). Aconselho que você faça o mesmo, mas queria manter os passos acima o mais simples possível.
fonte
Com algumas etapas de configuração, você pode implantar facilmente alterações no seu site usando uma linha como
O que é legal e simples, e você não precisa fazer login no servidor remoto e fazer um puxão ou algo assim. Observe que isso funcionará melhor se você não usar o checkout de produção como um ramo de trabalho! (O OP estava trabalhando em um contexto um pouco diferente, e acho que a solução de @Robert Gould abordou bem isso. Essa solução é mais apropriada para implantação em um servidor remoto.)
Primeiro, você precisa configurar um repositório vazio em algum lugar do seu servidor, fora do seu webroot.
Em seguida, crie o arquivo
hooks/post-receive
:E torne o arquivo executável:
Na sua máquina local,
Tudo pronto! Agora, no futuro, você pode usar
git push production
para implantar suas alterações!O crédito dessa solução está disponível em http://sebduggan.com/blog/deploy-your-website-changes-using-git/ . Procure uma explicação mais detalhada do que está acontecendo.
fonte
bare
, eu sigo isso e me fundo comhooks
(que você sugeriu) e funcionou perfeitamente.Você só deve enviar para um repositório vazio. Um repositório vazio é um repositório que não possui ramificações com check-out. Se você fizesse um cd para um diretório de repositório vazio, veria apenas o conteúdo de um diretório .git.
fonte
Você tem 3 opções
Puxe e empurre novamente:
Empurre para ramo diferente:
e mesclá-lo no controle remoto (por solicitação
git
ou pull )Force-o (não recomendado, a menos que você altere deliberadamente as confirmações via
rebase
):Se ainda recusar, desative
denyCurrentBranch
no repositório remoto:fonte
De fato, definir o controle remoto para uma ramificação sem check-out é suficiente. Depois de fazer o check-out do controle remoto em uma ramificação diferente, você pode pressionar.
fonte
Verifique o seu
.git/config
no projeto de destino:Se
core. bare
for falso, você pode configurá-lo como verdadeiro:e, em seguida, no seu envio local para remoto:
terá sucesso, no remote_repo você pode verificar a versão do git.
e agora você não pode usar o git no seu "espaço de trabalho":
você deve
bare.bare
voltar para false.fonte
Eu tive o mesmo problema ao usar o Git para sincronizar repositórios no meu telefone e laptop Android. A solução para mim foi fazer um pull em vez de um push, como sugeriu @CharlesBailey.
git push origin master
no repositório Android falha para mim com as mesmas mensagens de erro que @ hap497 recebeu por causa de um envio para um checkout não nítido de um repositório + cópia de trabalho.git pull droid master
no repositório do laptop e a cópia de trabalho funciona para mim. Claro, você precisa ter executado algo comogit remote add droid /media/KINGSTON4GB/notes_repo/
.fonte
As versões mais antigas do Git eram usadas para permitir transferências para a ramificação com check-out atualmente de um repositório não-nua.
Acontece que isso era uma coisa terrivelmente confusa para permitir. Então eles adicionaram a mensagem de aviso que você vê, o que também é terrivelmente confuso.
Se o primeiro repositório estiver apenas atuando como servidor, converta-o em um repositório simples, conforme as outras respostas recomendam e pronto.
Se, no entanto, você precisar ter uma ramificação compartilhada entre dois repositórios em uso, poderá obtê-lo com a seguinte configuração
Repo1 - atuará como servidor e também será usado para desenvolvimento
Repo2 - será apenas para desenvolvimento
Configure o Repo1 da seguinte maneira
Crie uma filial para compartilhar o trabalho.
Para estar seguro, você também deve criar um $ (REPO) .git / hooks / update que rejeite qualquer alteração em algo que não seja shared_branch, porque você não quer que as pessoas mexam com suas filiais particulares.
Agora crie uma filial local no repo1 onde você fará seu trabalho real.
(pode ser preciso
git config --global push.default upstream
para quegit push
a obra)Agora você pode criar repo2 com
Nesse ponto, você tem a configuração repo1 e repo2 para trabalhar em ramificações locais que são
shared_branch
enviadas e enviadas no repo1, sem precisar se preocupar com a mensagem de erro ou com o diretório de trabalho fora de sincronia no repo1. Qualquer fluxo de trabalho normal que você usa deve funcionar.fonte
OK, caso você queira um repositório remoto normal, crie uma ramificação extra e confira. Empurre-o em uma ramificação (que não está com check-out) e mescle-a com uma que está ativa no momento mais tarde depois de pressionar localmente.
Por exemplo, em um servidor remoto:
Na configuração local:
No servidor remoto:
fonte
Aqui está um teste que você pode fazer para ver como o
bare
material do servidor funciona:Imagine que você tem uma estação de trabalho e um servidor com site ativo hospedado e deseja atualizá-lo de tempos em tempos (isso também se aplica a uma situação em que dois desenvolvedores estão enviando seu trabalho para frente e para trás através de um intermediário).
Inicialização
Crie um diretório no seu computador local e,
cd
em seguida, execute estes comandos:server
diretório simples (observe o .git no final). Este diretório servirá como um contêiner apenas para os arquivos do repositório.content
diretório recém-criado . Este é o diretório ao vivo / produção que será atendido pelo software do servidor.Fluxo de trabalho
Agora, aqui está o fluxo de trabalho básico:
Entre no
local
diretório, crie alguns arquivos e confirme-os. Por fim, envie-os para o servidor:Agora digite o
content
diretório e atualize o conteúdo do servidor:Repita 1-2. Aqui
content
pode haver outro desenvolvedor que também pode enviar por push para o servidor elocal
como você pode obter dele.fonte
Usar isso para enviá-lo para a filial remota do upstream resolveu esse problema para mim:
O controle remoto não tinha acesso ao repositório upstream, portanto, era uma boa maneira de obter as alterações mais recentes nesse controle remoto.
fonte
git push <remote> master:newbranch
. A idéia é que você envie uma nova ramificação para o controle remoto, que poderá ser mesclada. Dessa forma, evite os problemas de inconsistência mencionados na mensagem de erro.Eu tive que executar novamente
git --init
em um repositório bare existente, e isso criou um.git
diretório dentro da árvore do repositório bare - percebi isso depois de digitargit status
lá. Eu apaguei isso e estava tudo bem novamente :)(Todas essas respostas são ótimas, mas no meu caso, era algo completamente diferente (tanto quanto posso ver), conforme descrito.)
fonte
Tenho certeza de que a maioria das pessoas que visualiza essa pergunta irá parar nas duas primeiras respostas enormes, mas eu ainda gostaria de oferecer minha solução.
Eu tive uma configuração de projeto da web Eclipse + EGit ao encontrar o erro descrito. O que me ajudou foi simplesmente usar o aplicativo GitHub, que parecia resolver magicamente o problema. Embora o EGit sempre recuse o envio, o aplicativo GitHub para desktop encolhe os ombros e pressiona minhas alterações. Talvez ele lide com a situação de login múltiplo mais graciosamente.
fonte
Um artigo que achei útil para outras pessoas é o Git em 5 minutos .
Eu tinha um projeto Xcode sob o controle de versão Git que queria enviar para um VDE ( Virtual Distributed Ethernet ) que tenho em um controlador de domínio . O VDE executa o Centos 5.
Nenhum dos artigos que li sobre o Git falou sobre repositórios vazios. Tudo parecia tão simples até que eu tentei o que achava que deveria ser fácil, vindo de um plano de fundo do SVN .
As sugestões aqui para deixar o repositório remoto funcionando. Ainda melhor para meus requisitos era clonar o projeto Xcode
projectname.git
, copiá-lo para o servidor remoto; então empurra magicamente trabalhado. O próximo passo será fazer o Xcode enviar sem erros sobre confirmações, mas por enquanto estou bem em fazê-lo no Terminal.Assim:
Para enviar alterações do seu projeto do Xcode após a confirmação no Xcode:
Estou certo de que há uma maneira mais suave e sofisticada de fazer o que foi dito acima, mas no mínimo isso funciona. Para que tudo fique claro, aqui estão alguns esclarecimentos:
/xcode-project-directory
é o diretório em que o seu projeto xcode está armazenado. Provavelmente/Users/Your_Name/Documents/Project_Name
. projectname é literalmente o nome do projeto, mas pode ser qualquer coisa que você queira chamar. Git não se importa, você vai.Para usar o scp, você precisa ter uma conta de usuário no servidor remoto que tenha acesso SSH . Qualquer pessoa executando seu próprio servidor terá isso. Se você estiver usando hospedagem compartilhada ou algo semelhante, pode estar sem sorte.
remotehost.com
é o nome do seu host remoto. Você poderia facilmente usar o endereço IP. Apenas para maior clareza, estou usando Gitosis no host remoto com chaves SSH, portanto, não sou solicitado a fornecer senhas quando pressiono. O artigo Hospedando repositórios Git, a maneira fácil (e segura) mostra como configurar tudo isso.fonte
A melhor maneira de fazer isso é:
Isso clonará o repositório, mas não fará nenhuma cópia de trabalho
.../remote
. Se você olhar para o controle remoto, verá um diretório criado, chamadocurrentrepo.git
, que provavelmente é o que você deseja.Em seguida, no seu repositório Git local:
Depois de fazer alterações, você pode:
fonte
Acabei de encontrar este problema com um repositório git de implantação no Heroku .
Não sei por que o Heroku tem um repositório não nu do lado deles, mas como solução alternativa pude redefinir o repositório remoto e recarregar novamente.
Você não deve usar a cópia do Heroku do seu repositório como seu único repositório git para colaboração, mas, para garantir , direi claramente: Não faça isso a menos que tenha certeza de que uma cópia completa do seu repositório está armazenada com segurança em algum lugar que não seja Heroku. A redefinição excluirá o conteúdo do repositório.
Reiniciar:
Instale o plugin heroku-repo se você ainda não o fez.
Faça a redefinição, que exclui o repositório e cria um novo e vazio
Empurre para o controle remoto Heroku como faria normalmente; ele irá reenviar tudo.
fonte
heroku plugins:install https://github.com/heroku/heroku-repo.git
Você precisará alterar o arquivo de configuração no servidor remoto depois de criar o repositório vazio (vazio), por exemplo
aí você vai ver
Você tornará isso nu para falso e verdadeiro e eu removi logallrefupdates = true (não tenho certeza do seu uso!)
para
Você pode testar a seguir
Este ramo HEAD: (desconhecido) será mostrado se você não conseguir empurrar. Portanto, se a ramificação HEAD for desconhecida, você deve mudar nua para true e, depois de enviar com êxito, poderá reutilizar o
e você verá
fonte
Para mim, a solução de trabalho é:
EM REMOTO:
NO LOCAL:
EM REMOTO:
Mas essa não é a solução real, é apenas uma solução alternativa.
fonte
Apenas no caso de alguém achar útil. Para mim, foi um problema de permissões do servidor git. Fiz o check-out do projeto desde o início e enviei um arquivo simples e recebi a mensagem "Push rejeitado: o envio para origem / o mestre foi rejeitado"
fonte
Com o Git, dois repositórios regulares (não bare) não podem enviar / receber arquivos diretamente. Deve haver um repositório intermediário. Aparentemente, é como um casal que tem um filho, e o casal está se divorciando. Os pais não conversam, mas se comunicam através da criança.
Portanto, você tem um repositório, clona-o em um repositório simples e clona-o em um terceiro. O primeiro e o terceiro podem trocar informações através do segundo repositório, o único. Eu acho que isso faz sentido, pois você não gostaria que alguém fosse capaz de verificar coisas no seu repositório sem o seu consentimento, pois isso poderia causar conflitos de mesclagem e coisas do tipo.
Então, aqui está um exemplo:
No PC, no ~ / espaço de trabalho
No laptop, no ~ / espaço de trabalho (não faça git init, etc.)
// Em seguida, faça vários commits e pressione-os:
Depois, de volta ao PC, em ~ / espaço de trabalho
// Em seguida, faça vários commits e pressione-os:
No laptop git pull
e assim por diante..
Aqui está um exemplo concreto absoluto, tudo em uma máquina, copiado diretamente da janela de comando, para que possamos saber que nenhuma etapa foi deixada de fora, que realmente funcionou, etc:
fonte
Minha solução (em uso)
Bingo
fonte