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:
machine1:~/proj1> git init
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
machine2:~> git clone ssh://machine1/~/proj1
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
machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1
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.