Lo que probablemente hiciste para causar esto:
Este tipo de cosas suceden cuando vas a sacar un pequeño programa. Estás a punto de cambiar algo que ya estaba funcionando, por lo que lanzas tu hechizo de nivel 3 de inutilización perpetua:
machine1:~/proj1> git init
y comienzas a agregar / comprometerse. Pero luego , el proyecto comienza a involucrarse más y desea trabajar en él desde otra computadora (como la PC o computadora portátil de su casa), por lo que debe hacer algo como
machine2:~> git clone ssh://machine1/~/proj1
y se clona y todo se ve bien, así que trabajas en tu código desde machine2.
Entonces ... intenta empujar sus confirmaciones de machine2, y recibe el mensaje de advertencia en el título.
La razón de este mensaje es porque el repositorio de git del que sacó estaba destinado a usarse solo para esa carpeta en la máquina1. Puedes clonar bien, pero empujar puede causar problemas. La forma "adecuada" de administrar el código en dos ubicaciones diferentes es con un repositorio "desnudo", como se ha sugerido. Un repositorio simple no está diseñado para que se realice ningún trabajo en él, está destinado a coordinar las confirmaciones de múltiples fuentes. Esta es la razón por la cual la respuesta mejor calificada sugiere eliminar todos los archivos / carpetas que no sean la carpeta .git después de usted git config --bool core.bare true
.
Aclarando la respuesta mejor calificada: muchos de los comentarios a esa respuesta dicen algo así como "No eliminé los archivos que no son .git de la máquina1 y aún podía confirmar desde la máquina2". Así es. Sin embargo, esos otros archivos están completamente "divorciados" del repositorio de git, ahora. Vaya intente git status
allí y debería ver algo como "fatal: esta operación debe ejecutarse en un árbol de trabajo". Por lo tanto, la sugerencia de eliminar los archivos no es para que funcione el commit de machine2 ; es para que no te confundas y pienses que git sigue rastreando esos archivos. Pero, eliminar los archivos es un problema si aún desea trabajar en los archivos de la máquina1, ¿no es así?
Entonces, ¿qué deberías hacer realmente?
Depende de cuánto planee seguir trabajando en machine1 y machine2 ...
Si ha terminado de desarrollar desde machine1 y ha movido todo su desarrollo a machine2 ... simplemente haga lo que sugiere la respuesta mejor calificada: git config --bool core.bare true
y luego, opcionalmente, elimine todos los archivos / carpetas que no sean .git de esa carpeta, ya que No se realiza un seguimiento y es probable que cause confusión.
Si su trabajo en machine2 fue solo una vez, y no necesita continuar el desarrollo allí ... entonces no se moleste en hacer un repositorio simple; solo ftp / rsync / scp / etc. sus archivos de la máquina * 2 * encima de los archivos de la máquina * 1 *, confirme / envíe desde la máquina * 1 * y luego elimine los archivos de la máquina * 2 *. Otros han sugerido crear una rama, pero creo que es un poco desordenado si solo desea fusionar un desarrollo que hizo una vez desde otra máquina.
Si necesita continuar con el desarrollo tanto en la máquina1 como en la máquina2 ... entonces necesita configurar las cosas correctamente. Necesitas convertir tu repositorio en un simple, luego debes hacer un clon de eso en la máquina1 para que puedas trabajar . Probablemente la forma más rápida de hacerlo es hacerlo
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
Muy importante: debido a que movió la ubicación del repositorio de proj1 a proj1.git, debe actualizar esto en el archivo .git / config en machine2 . Después de eso, puede confirmar sus cambios desde machine2. Por último, trato de mantener mis repositorios desnudos en una ubicación central, lejos de mis árboles de trabajo (es decir, no coloque 'proj1.git' en la misma carpeta principal que 'proj1'). Le aconsejo que haga lo mismo, pero quería que los pasos anteriores fueran lo más simples posible.