¿Cómo usar git-bundle para mantener el desarrollo sincronizado?
(2)
Necesito mantener mis árboles de desarrollo sincronizados en diferentes computadoras, sin conexión de red entre ellos.
Tenemos un repositorio git central, y normalmente trabajo en mi propio clon en mi computadora de oficina. A veces necesito desarrollar algo en otra computadora, que nunca está conectada a la red de la oficina. Ninguna de las computadoras está conectada a Internet. El desarrollo se puede realizar en ambas computadoras entre sincronizaciones.
He leído las páginas de ayuda para git-bundle , que parece ser la mejor herramienta, pero no estoy muy seguro de cómo se puede configurar un buen flujo de trabajo.
¿Me puede dar algunos consejos o sugerencias?
¡Manojos!
El flujo de trabajo con paquete git será esencialmente el mismo que cualquier otro flujo de trabajo. Esto puede no parecer un consejo terriblemente útil, pero aquí está: use cualquier flujo de trabajo que normalmente usaría, y reemplace "empujar / tirar" con "llevar un paquete aquí y allá en una unidad de memoria flash, luego tire".
La página de manual realmente tiene un buen tutorial para seguir adelante con esto, aunque es más un ejemplo de una sola vía. En aras de la exhaustividad, aquí hay una versión ligeramente modificada, que muestra cómo mover la información de ambas formas:
# on hostA, the initial home of the repo
hostA$ git bundle create hostA.bundle --branches --tags
# transfer the bundle to hostB, and continue:
hostB$ git clone /path/to/hostA.bundle my-repo
# you now have a clone, complete with remote branches and tags
# just to make it a little more obvious, rename the remote:
hostB$ git remote rename origin hostA
# make some commits on hostB; time to transfer back to hostA
# use the known master branch of hostA as a basis
hostB$ git bundle create hostB.bundle ^hostA/master --branches --tags
# copy the bundle back over to hostA and continue:
hostA$ git remote add hostB /path/to/hostB.bundle
# fetch all the refs from the remote (creating remote branches like hostB/master)
hostA$ git fetch hostB
# pull from hostB''s master, for example
hostA$ git pull
# make some commits on hostA; time to transfer to hostB
# again, use the known master branch as a basis
hostA$ git bundle create hostA.bundle ^hostB/master --branches --tags
# copy the bundle to hostB, **replacing** the original bundle
# update all the refs
hostB$ git fetch hostA
# and so on and so on
La clave a tener en cuenta es que puede agregar un paquete como control remoto e interactuar con él como lo haría con cualquier otro control remoto. Para actualizar ese control remoto, simplemente inserte un nuevo paquete, reemplazando el anterior.
También tomé un enfoque ligeramente diferente para elegir una base. La página man usa etiquetas, siempre actualizadas con los últimos refs que se transfirieron al otro host. Simplemente utilicé las ramas remotas, que se referirán a los últimos refs transferidos desde el otro host. Es un poco ineficiente; terminará empacando más de lo que necesita, ya que está un paso atrás. Pero las unidades flash son grandes, los paquetes son pequeños, y usar los refs que ya tienes en lugar de tener que dar un paso adicional y tener cuidado con las etiquetas ahorra mucho esfuerzo.
La única cosa que hace que los paquetes sean un poco problemáticos es que no puedes presionarlos, y no puedes "rebasarlos". Si desea que el paquete se base en una base nueva, debe recrearlo. Si quieres nuevas confirmaciones, debes volver a crearlas. Esta molestia da lugar a mi próxima sugerencia ...
Repo en una memoria USB
Honestamente, a menos que su repositorio sea realmente grande, esto podría ser igual de fácil. Ponga un clon desnudo en una memoria USB, y puede empujar y sacar desde ambas computadoras. Trátelo como su conexión de red. ¿Necesita transferir al repositorio central? ¡Conéctalo!
La respuesta de @Jefromi fue genial: 10 veces mejor que los documentos de Git, que tratan extensamente sobre requisitos y acciones incomprensibles.
Todavía es un poco complicado, así que aquí está el caso más simple de sincronización una vez (en mi caso: DESDE: una computadora portátil sin conexión con la tarjeta WiFi rota, A: una computadora de escritorio con acceso a la red). Basado en la respuesta de @ Jefromi, esto parece funcionar bien:
AHEAD = máquina que está adelantada por cierto número de commits. BEHIND = máquina en la que desea copiar los commits a
1. AHEAD: git-bundle create myBundleName.bundle --branches --tags
AMBOS: copie myBundleName.bundle (usando correo electrónico, USB, lo que sea)
DETRÁS: (coloque el archivo myBundName.bundle en cualquier lugar que desee fuera de la carpeta del proyecto)
2. BEHIND: cd [the project folder]
3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master
Siempre que incluya el nombre de la rama al final (de forma predeterminada, si no está utilizando ramas, "maestro"), esto parece funcionar bien, y no reemplaza ninguna de las referencias internas en DETRÁS, por lo que todavía puede sincronizarse hacia / desde el maestro de origen.
es decir, si BEHIND tiene acceso a Internet, es seguro hacerlo:
(OPTIONAL) 4. BEHIND: git push
... y actualizará el repositorio principal, como si sus cambios se hubieran hecho localmente, como de costumbre, en DETRÁS.