Cosa probabilmente hai fatto per causare questo:
Questo genere di cose succede quando vai a sbattere fuori un piccolo programma. Stai per cambiare qualcosa che stava già funzionando, quindi lanci il tuo incantesimo di livello 3 di perenne annullabilità:
machine1:~/proj1> git init
e inizi ad aggiungere / impegnare. Ma poi , il progetto inizia a essere più coinvolto e vuoi lavorarci da un altro computer (come il tuo PC o laptop di casa), quindi fai qualcosa di simile
machine2:~> git clone ssh://machine1/~/proj1
e clona e tutto sembra a posto, quindi lavori sul tuo codice da machine2.
Quindi ... provi a inviare i tuoi commit da machine2 e ricevi il messaggio di avviso nel titolo.
Il motivo di questo messaggio è dovuto al fatto che il repository git da cui è stato estratto era in qualche modo destinato a essere utilizzato solo per quella cartella su machine1. Puoi clonarlo bene, ma spingere può causare problemi. Il modo "corretto" di gestire il codice in due posizioni diverse è con un repository "nudo", come è stato suggerito. Un repository nudo non è progettato per essere svolto in esso, ma intende coordinare i commit da più fonti. Questo è il motivo per cui la risposta più votata suggerisce di eliminare tutti i file / cartelle diversi dalla cartella .git dopo di te git config --bool core.bare true
.
Chiarire la risposta più votata: molti dei commenti a quella risposta dicono qualcosa del tipo "Non ho cancellato i file non .git dalla macchina1 ed ero ancora in grado di eseguire il commit dalla macchina2". Giusto. Tuttavia, questi altri file sono completamente "divorziati" dal repository git, ora. Vai a provare git status
lì e dovresti vedere qualcosa di simile a "fatale: questa operazione deve essere eseguita in un albero di lavoro". Pertanto, il suggerimento di eliminare i file non è in modo che il commit da machine2 funzioni ; è così che non ti confondi e pensi che git stia ancora monitorando quei file. Ma eliminare i file è un problema se vuoi ancora lavorare sui file su machine1, non è vero?
Quindi, cosa dovresti davvero fare?
Dipende da quanto pensi di lavorare ancora su machine1 e machine2 ...
Se hai finito di sviluppare da machine1 e hai spostato tutto il tuo sviluppo su machine2 ... fai solo quello che suggerisce la risposta più votata: git config --bool core.bare true
e, facoltativamente, elimina tutti i file / cartelle diversi da .git da quella cartella, poiché non sono tracciati e possono causare confusione.
Se il tuo lavoro su machine2 era solo una volta e non hai bisogno di continuare lo sviluppo lì ... allora non preoccuparti di fare un repository nudo; solo ftp / rsync / scp / etc. i file dalla macchina * 2 * sopra i file sulla macchina * 1 *, esegui il commit / push dalla macchina * 1 *, quindi elimina i file dalla macchina * 2 *. Altri hanno suggerito di creare un ramo, ma penso che sia un po 'disordinato se vuoi solo unire lo sviluppo che hai fatto su una volta da un'altra macchina.
Se hai bisogno di continuare lo sviluppo su machine1 e machine2 ... allora devi impostare le cose correttamente. Devi convertire il tuo repository in un nudo, quindi devi crearne uno clone su machine1 per poter lavorare . Probabilmente il modo più veloce per farlo è fare
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
Molto importante: poiché hai spostato la posizione del repository da proj1 a proj1.git, devi aggiornarlo nel file .git / config su machine2 . Successivamente, puoi eseguire il commit delle modifiche da machine2. Infine, provo a mantenere i miei repository nudi in una posizione centrale, lontano dai miei alberi di lavoro (cioè non metto "proj1.git" nella stessa cartella principale di "proj1"). Ti consiglio di fare lo stesso, ma volevo mantenere i passaggi precedenti il più semplice possibile.