tag - tipos de etiquetas en git
¿Cómo se organizan múltiples repositorios de git, para que todos estén respaldados juntos? (6)
¿Qué hay de usar mr para gestionar sus múltiples repositorios Git a la vez?
El comando mr (1) puede verificar, actualizar o realizar otras acciones en un conjunto de repositorios como si fueran un repositorio combinado. Admite cualquier combinación de repositorios de subversión, git, cvs, mercurial, bzr, darcs, cvs, vcsh, fósiles y de veracidad, y se puede agregar fácilmente el soporte para otros sistemas de control de revisiones. [...]
Es extremadamente configurable a través de scripts simples. Algunos ejemplos de cosas que puede hacer incluyen:
[...]
- Al actualizar un repositorio de git, extraiga de dos fuentes ascendentes diferentes y combine las dos.
- Ejecute varias actualizaciones de repositorio en paralelo, acelerando enormemente el proceso de actualización.
- Recuerde las acciones que fallaron debido a que una computadora portátil está fuera de línea, por lo que pueden volver a intentarse cuando vuelva a estar en línea.
Con SVN, tenía un gran repositorio que guardaba en un servidor, y lo revisé en algunas máquinas. Este fue un sistema de respaldo bastante bueno, y me permitió trabajar fácilmente en cualquiera de las máquinas. Pude consultar un proyecto específico, comprometerlo y actualizar el proyecto ''maestro'', o podía verificarlo todo.
Ahora, tengo un montón de repositorios git, para varios proyectos, varios de los cuales están en github. También tengo el repositorio SVN que mencioné, importado a través del comando git-svn.
Básicamente, me gusta tener todo mi código (no solo proyectos, sino fragmentos aleatorios y scripts, algunas cosas como mi CV, artículos que he escrito, sitios web que he creado, etc.) en un gran repositorio que puedo clonar fácilmente en un control remoto máquinas, o memory-sticks / harddrives como respaldo.
El problema es que, dado que es un repositorio privado, y git no permite consultar una carpeta específica (que podría enviar a github como un proyecto separado, pero que los cambios aparezcan tanto en el repositorio maestro como en el subconjunto). repos)
Podría usar el sistema de submódulos git, pero no actúa como yo quiero (los submódulos son punteros a otros repositorios, y realmente no contienen el código real, por lo que es inútil para la copia de seguridad)
Actualmente tengo una carpeta de git-repos (por ejemplo, ~ / code_projects / proj1 / .git / ~ / code_projects / proj2 / .git /), y después de hacer cambios en proj1 hago git push github
, luego copio los archivos en ~ / Documents / code / python / projects / proj1 / y realice un único compromiso (en lugar de los numerosos en los repositorios individuales). Luego haz git push backupdrive1
, git push mymemorystick
etc.
Entonces, la pregunta: ¿Cómo funciona su código personal y proyectos con repositorios git, y mantenerlos sincronizados y respaldados?
Aún no he intentado anidar repositorios de git porque no me he encontrado en una situación en la que sea necesario. Como he leído en el canal #git git parece confundirse anidando los repositorios, es decir, estás tratando de iniciar git dentro de un repositorio de git. La única forma de administrar una estructura de git anidada es usar git-submodule
o la utilidad de repo
de Android.
En cuanto a la responsabilidad de la copia de seguridad que describes, digo delegarla ... Para mí, suelo colocar el repositorio de "origen" para cada proyecto en una unidad de red en el trabajo que los técnicos de TI hacen una copia de seguridad de forma periódica mediante su estrategia de copia de seguridad elección. Es simple y no tengo que preocuparme por eso. ;)
Hay otro método para tener repositorios git anidados, pero no resuelve el problema que está buscando. Aún así, para otros que están buscando la solución, yo era:
En el repositorio de Git de nivel superior simplemente oculta la carpeta en .gitignore que contiene el repositorio git anidado. Esto hace que sea fácil tener dos repositorios git separados (¡pero anidados!).
Quiero agregar a la respuesta de Damien donde recomienda:
$ for remote in origin github memorystick; do git push $remote; done
Puede configurar un control remoto especial para enviar a todos los controles remotos reales individuales con 1 comando; Lo encontré en http://marc.info/?l=git&m=116231242118202&w=2 :
Entonces, para "git push" (donde tiene sentido presionar las mismas ramas varias veces), puedes hacer lo que hago:
.git / config contiene:
[remote "all"] url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 url = login.osdl.org:linux-2.6.git
y ahora
git push all master
empujará la rama "master" a ambos
de esos repositorios remotos.
También puede guardarse escribiendo las URL dos veces usando la construcción:
[url "<actual url base>"] insteadOf = <other url base>
Recomiendo encarecidamente no poner datos no relacionados en un repositorio de Git determinado. La sobrecarga de crear nuevos repositorios es bastante baja, y esa es una característica que hace posible mantener distintos linajes completamente separados.
Combatir esa idea significa terminar con una historia innecesariamente enredada, lo que hace que la administración sea más difícil y, lo que es más importante, las herramientas de "arqueología" sean menos útiles debido a la dilución resultante. Además, como mencionaste, Git supone que la "unidad de clonación" es el repositorio, y prácticamente tiene que hacerlo debido a su naturaleza distribuida.
Una solución es mantener cada proyecto / paquete / etc. como su propio repositorio desnudo (es decir, sin árbol de trabajo) bajo una bendita jerarquía, como:
/repos/a.git
/repos/b.git
/repos/c.git
Una vez que se han establecido algunas convenciones, resulta trivial aplicar operaciones administrativas (copia de seguridad, empaquetado, publicación web) a la jerarquía completa, que cumple una función no del todo diferente de los repositorios SVN "monolíticos". Trabajar con estos repositorios también se convierte en algo similar a los flujos de trabajo SVN, con la adición de que uno puede usar encriptaciones y ramas locales:
svn checkout --> git clone
svn update --> git pull
svn commit --> git push
Puede tener múltiples controles remotos en cada clon de trabajo, para facilitar la sincronización entre las múltiples partes:
$ cd ~/dev
$ git clone /repos/foo.git # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...
Luego puede obtener / extraer de cada una de las "fuentes", trabajar y realizar localmente, y luego presionar ("hacer una copia de seguridad") para cada uno de estos controles remotos cuando esté listo con algo similar (observe cómo eso empuja los mismos commits y el historial a ¡cada uno de los mandos a distancia!):
$ for remote in origin github memorystick; do git push $remote; done
La forma más sencilla de convertir un repositorio de trabajo existente ~/dev/foo
en un repositorio vacío es probablemente:
$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git
que es principalmente equivalente a una svn import
pero no descarta el historial "local" existente.
Nota: los submódulos son un mecanismo para incluir linajes relacionados compartidos, por lo que, de hecho, no los consideraría una herramienta adecuada para el problema que está tratando de resolver.
También tengo curiosidad acerca de las formas sugeridas de manejar esto y describiré la configuración actual que uso (con SVN). Básicamente, he creado un repositorio que contiene una jerarquía de mini sistema de archivos que incluye su propio bin y lib dir. Hay un script en la raíz de este árbol que configurará su entorno para agregar estos bin, lib, etc ... otros directorios a las variables de entorno adecuadas. Por lo tanto, el directorio raíz esencialmente se ve así:
./bin/ # prepended to $PATH
./lib/ # prepended to $LD_LIBRARY_PATH
./lib/python/ # prepended to $PYTHONPATH
./setup_env.bash # sets up the environment
Ahora dentro de / bin y / lib están los múltiples proyectos y sus bibliotecas correspondientes. Sé que este no es un proyecto estándar, pero es muy fácil para alguien más en mi grupo pagar el repositorio, ejecutar el script ''setup_env.bash'' y tener las versiones más actualizadas de todos los proyectos localmente en su revisa. No tienen que preocuparse por la instalación / actualización / usr / bin o / usr / lib y lo hace simple tener varias cajas y un entorno muy localizado por pago. Alguien también puede registrar todo el repositorio y no preocuparse por la desinstalación de ningún programa.
Esto está funcionando bien para nosotros, y no estoy seguro si lo cambiaremos. El problema con esto es que hay muchos proyectos en este gran repositorio. ¿Hay una forma estándar de git / Hg / bzr de crear un entorno como este y dividir los proyectos en sus propios repositorios?