2011-06-18 28 views
5

Estoy seguro de que esto se puede hacer, no estoy seguro de la forma correcta.Can Git clonar un repositorio desnudo en otro repositorio vacío

Mi situación es tener una unidad USB, un disco duro local y una unidad de red, todos conectados a mi PC en este momento. El disco duro local contendrá el repositorio activo local para mi trabajo local. La unidad de red (¡con una ruta UNC larga!) Contendría el repositorio desnudo principal que actúa como copia de referencia ascendente (2 o 3 colaboradores en la oficina), mientras que la unidad USB actúa como mi copia móvil para sneakernetting a algunas PC externas (mis otros colaboradores tienen sus propios discos, que pueden afectar las respuestas). (esto está en Windows msysgit).

Es la puesta en marcha de la unidad USB que es la preocupación, y asegurarse de que estoy dirigiendo el flujo de trabajo en la dirección correcta (ver using-git-on-usb-stick-for-travelling-code.

  • ¿Debo estar clonando mi repo local o clonar el repositorio de red?
  • ¿Cuáles son las banderas especiales para asegurarse de que los desmonta la unidad USB correctamente? (-nohardlinks?)
  • etc.
+0

No puede tener enlaces duros de un disco (lógico) a otro. – svick

Respuesta

0

puede clonar desde cualquiera. Tan pronto como finalice el disco USB, puede eliminarlo. Se puede revisar la integridad después con

git fsck --full 
+0

¿Alguna idea sobre qué repos debe ser clonado? Inicialmente pensé en clonar el repositorio desnudo de la red ascendente, pero ahora estoy pensando que debería clonar mi repositorio local (de trabajo). –

+0

"integridad de doble comprobación": definitivamente un paso que vale la pena ;-) –

8

se puede crear un clon-desnuda a desnudo de la cesión temporal con la larga ruta de acceso UNC a la memoria USB con

cd /e/src 
git clone --bare //server/path/to/your/network/repo.git

pero dudo que le compra mucho para hacerlo en un solo paso.

Dado que usted estará trabajando en tu repositorio local activo, que crearía un acuerdo de recompra desnuda en la memoria USB

cd git init --bare /e/src/myproject.git

crear un control remoto en tu repositorio local activa

git remote add usb file:///e/src/myproject.git

y luego presiona hacia ella según sea necesario.

git push usb philip/cool-new-feature

Los comandos anteriores suponen que su dispositivo USB es E: y que su directorio de trabajo se encuentra dentro de su repositorio activo local.

Según entiendo su pregunta, tiene al menos dos conjuntos de colaboradores disjuntos, dependiendo de si sus otros colaboradores comparten un repositorio central común o si están trabajando en máquinas aisladas. Esto significa que el repositorio en su memoria USB es el repositorio al que todos (eventualmente) tienen acceso, por lo que sus compañeros de equipo pasan la mayor parte de su tiempo "en un avión" con respecto a él.

sugerencias para el diseño de su proceso de desarrollo:

  1. evitar la situación en que usted u otra persona se convierte en la Fusión designado. En su lugar, desea que todos los miembros del equipo se integren con la mayor frecuencia posible para mantener el potencial de cambios conflictivos pequeños y manejables.
  2. Tener colaboradores disjuntos aumenta el riesgo de que alguien rompa una función de la que depende otra persona, ya sea mediante cambios aparentemente inocuos o resolviendo conflictos de combinación incorrectos. Debe tener un método rápido y de un solo botón para determinar si alguna regresión o nuevos errores se han colado en su código.
  3. Cada grupo de colaboradores, es decir,, aquellos que tienen un acceso más frecuente a los repositorios de los demás o un repositorio compartido que a su dispositivo USB, deben practicar la integración continua entre ellos. Cuando hay disponibles nuevos commits desde la memoria USB, la integración de lo que tienen con el nuevo código del resto del equipo debería ser una prioridad.

Una forma en que puede hacer esto es hacer que todos mantengan un maestro limpio y realicen cambios solo en otras ramas. posesión física de la memoria USB es un token integración natural, así que cuando un colaborador dado cuenta que, la secuencia va

git checkout master 
git pull usb master  # should always be a fast-forward 
git merge feature1 
make test    # or whatever, and repeat until no breakage 
git commit 
git push usb master 
git push shared master # if appropriate 
git merge feature2  # if necessary 
...
+0

Tengo la suerte de que colaboramos bastante bien. Parte del problema es el intercambio entre máquinas (y el ajuste debajo de un sistema corporativo ;-) –

3

recomiendo crear un clon espejo de tu repositorio principal de la red:

cd /path/to/usb/drive 
git clone --mirror url://to/main/network/repo/project.git 

Un mirror clone es un repositorio simple con todas las mismas ramas, etiquetas, etc. que el repositorio original.

No se preocupe por pasar --no-hardlinks porque no es posible establecer un enlace permanente entre los sistemas de archivos.

Cada vez que desee actualizar su espejo USB, simplemente montarlo y ejecute el siguiente:

cd /path/to/usb/drive/project.git 
git remote update -p 

Si alguna vez empuja al espejo unidad USB, la mejor manera de conseguir esos commit en el principal repo red es a través de su repositorio de disco duro local:

# initial setup 
cd /path/to/local/project 
git remote add usb /path/to/usb/drive/project.git 

# grab the commits from the usb drive 
git remote update -p 

# merge the usb drive commits into your local master branch 
git merge usb/master 

# push the result up to the main network repo 
git push 
+0

Probablemente no use la "recomendación de crear un duplicado duplicado del repositorio de red principal" para este (mi actual) flujo de trabajo, principalmente porque cada uno de nosotros está desarrollando nuevos bits de código y no los empujará hacia el repositorio principal (de red) hasta que estemos listos, sino que intentaremos completar el proceso en la máquina fuera de red (de ahí la transferencia USB). Puedo ver flujos de trabajo si fuera lo correcto. –

Cuestiones relacionadas