2010-09-03 12 views
63

Necesito mantener mis árboles de desarrollo sincronizados en diferentes computadoras, sin conexión de red entre ellos.¿Cómo usar git-bundle para mantener el desarrollo sincronizado?

Tenemos un repositorio central de git, 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 seguro de cómo se puede configurar un buen flujo de trabajo.

¿Me puede dar algunos consejos o sugerencias?

+1

Si están conectados a internet, puede usarlos con DopBox: vea http://stackoverflow.com/questions/3632723/git-with-dropbox/3633346#3633346 – VonC

+1

Disculpe, ninguno de ellos estará conectado a Internet. Agregó eso a la pregunta. – matli

Respuesta

105

¡Paquetes!

El flujo de trabajo con paquete git va a 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 del hombre en realidad tiene un tutorial bastante bueno para seguir adelante con esto, aunque es más un ejemplo de una sola vía. En aras de la exhaustividad, aquí es una versión ligeramente modificada del mismo, mostrando cómo mover la información en ambos sentidos:

# 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 notar es que se puede añadir un paquete como un control remoto, e interactuar con él solo como lo harías con cualquier otro control remoto. Para actualizar ese control remoto, simplemente inserte un nuevo paquete, reemplazando el anterior.

También he tomado 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 he usado las ramas remotas, que se referirán a los últimos refs transferidos desde al 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.

Lo único que hace que los paquetes sean un poco problemáticos es que no se puede presionar hacia ellos, y no se puede "volver a establecer la base". Si desea que el paquete se base en una base nueva, debe recrearlo. Si quieres nuevas confirmaciones, debes volver a crearlas. Esto da lugar a problemas de mi siguiente sugerencia ...

Repo en una unidad flash

Honestamente, a menos que su repo es muy grande, esto podría ser tan 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!

+14

+2 si pudiera, repo en una unidad de disco USB es una buena idea – bstpierre

+0

felicitaciones por la unidad de disco del pulgar mencionar también de mí. Podría comenzar a usar eso. – akauppi

+0

El orden correcto de argumentos para 'git remote add' es' name' y solo después de '' url'. – shytikov

8

@Jefromi la respuesta fue excelente: 10 veces mejor que los documentos de Git, que se extienden 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: FROM: una computadora portátil sin conexión con 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 un número de confirmaciones. = ATRÁS máquina que desea copiar los compromete a

1. AHEAD: git-bundle create myBundleName.bundle --branches --tags 

TANTO: copiar myBundleName.bundle (utilizando el correo electrónico, USB, lo que sea)

atrás: (coloque el archivo myBundName.bundle cualquier lugar que desee fuera la carpeta del proyecto)

2. BEHIND: cd [the project folder] 
3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master 

Así siempre y cuando incluya el nombre-sucursal en el extremo (por defecto, si no se está usando ramas, "maestro"), esto parece funcionar bien, y doesn' t reemplazar cualquiera de las referencias internas en BEHIND - por lo que aún puede sincronizar desde/hacia el maestro de origen.

es decir, si detrás de tiene acceso a Internet, aún así es seguro hacerlo:

(OPTIONAL) 4. BEHIND: git push 

... y va a actualizar el repositorio principal, como si los cambios se han hecho a nivel local, como de costumbre, detrás de .

Cuestiones relacionadas