¿Cuál es la mejor práctica para poner múltiples proyectos en un repository git?

Como alguna razón, solo tengo un repository para usar. Pero tengo varios proyectos que incluyen proyectos Java, scripts php y aplicaciones de Android. Ahora mi problema es que tengo que ponerlos en diferentes subcarpetas para cada proyecto; y para proyectos de php y proyectos de Java, uso IDE diferente. Ya sabes, cada IDE puede tener un espacio de trabajo en sí mismo.

¿Quién puede decirme una mejor práctica para resolver el problema?

Si bien la mayoría de la gente te dirá que simplemente uses repositorys múltiples, creo que vale la pena mencionar que hay otras soluciones.

Solución 1

Un único repository puede contener múltiples twigs independientes , llamadas twigs huérfanas . Las twigs huérfanas están completamente separadas unas de otras; ellos no comparten historias

git checkout --orphan BRANCHNAME 

Esto crea una nueva twig, sin relación con su twig actual. Cada proyecto debe estar en su propia sucursal huérfana.

Ahora, por la razón que sea, git necesita un poco de limpieza después de un pago huérfano.

 rm .git/index rm -r * 

Asegúrese de que todo esté comprometido antes de eliminar

Una vez que la twig huérfana está limpia, puede usarla normalmente.

Solución 2

Evite toda la molestia de las twigs huérfanas. Cree dos repositorys independientes y empújelos al mismo control remoto. Simplemente use diferentes nombres de twigs para cada repository.

 # repo 1 git push origin master:master-1 # repo 2 git push origin master:master-2 

Solución 3

Esto es para usar un solo directory para múltiples proyectos. Utilizo esta técnica para algunos proyectos estrechamente relacionados en los que a menudo necesito realizar cambios de un proyecto a otro. Es similar a la idea de las sucursales huérfanas, pero las sucursales no necesitan ser huérfanas. Simplemente inicie todos los proyectos desde el mismo estado de directory vacío.

Comience todos los proyectos desde un directory vacío comprometido

No esperes maravillas de esta solución. Según lo veo, siempre tendrás molestias con los files sin seguimiento. Git realmente no tiene ni idea de qué hacer con ellos, por lo que si hay files intermedios generados por un comstackdor e ignorados por su file .gitignore, es probable que se dejen colgando algunas veces si intenta cambiar rápidamente entre, por ejemplo, su proyecto de software y un proyecto de tesis de doctorado.

Sin embargo, aquí está el plan. Comienza como deberías comenzar cualquier proyecto de git, comprometiendo el repository vacío, y luego inicia todos tus proyectos desde el mismo estado de directory vacío. De esta forma, está seguro de que los dos lotes de files son bastante independientes. Además, déle a sus twigs un nombre propio y no use el "maestro" por pereza. Tus proyectos deben estar separados, así que dales nombres apropiados.

Git commits (y por lo tanto tags y branches) básicamente almacenan el estado de un directory y sus subdirectorys y Git no tiene idea de si estos son parte del mismo o diferentes proyectos, así que realmente no hay problema para que git almacene diferentes proyectos en el mismo repository. El problema está entonces en limpiar los files sin seguimiento de un proyecto cuando se usa otro, o separar los proyectos más adelante.

Crea un repository vacío

 cd some_empty_directory git init touch .gitignore git add .gitignore git commit -m empty git tag EMPTY 

Comience sus proyectos desde el vacío.

Trabaja en un proyecto.

 git branch software EMPTY git checkout software echo "array board[8,8] of piece" > chess.prog git add chess.prog git commit -m "chess program" 

Comience otro proyecto

cuando tu quieras.

 git branch thesis EMPTY git checkout thesis echo "the meaning of meaning" > philosophy_doctorate.txt git add philosophy_doctorate.txt git commit -m "Ph.D" 

Cambiar de ida y vuelta

Retrocede y avanza entre proyectos cuando quieras. Este ejemplo se remonta al proyecto de software de ajedrez.

 git checkout software echo "while not end_of_game do make_move()" >> chess.prog git add chess.prog git commit -m "improved chess program" 

Los files sin seguimiento son molestos

Sin embargo, le molestarán los files no rastreados al intercambiar entre proyectos / twigs.

 touch untracked_software_file.prog git checkout thesis ls philosophy_doctorate.txt untracked_software_file.prog 

No es un problema insuperable

Más o less por definición, git realmente no sabe qué hacer con los files sin seguimiento y depende de usted tratar con ellos. Puede detener que los files sin seguimiento se transporten de una twig a otra de la siguiente manera.

 git checkout EMPTY ls untracked_software_file.prog rm -r * (direcory is now really empty, apart from the repository stuff!) git checkout thesis ls philosophy_doctorate.txt 

Al asegurarnos de que el directory estaba vacío antes de revisar nuestro nuevo proyecto, nos aseguramos de que no hubiera files colgados sin seguimiento de otro proyecto.

Un refinamiento

 $ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty 

Si la date se especifica al confirmar el repository vacío, las confirmaciones pueden tener el mismo código SHA1. Esto permite que se creen dos repositorys de forma independiente y luego se fusionen en un solo tree con una raíz común en un repository más adelante.

Ejemplo

 mkdir single_repo_for_thesis_and_chess cd single_repo_for_thesis_and_chess git init touch .gitignore git add .gitignore GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty git tag EMPTY echo "the meaning of meaning" > thesis.txt git add thesis.txt git commit -m "Wrote my PH.D" git branch -m master thesis git remote add chess ../chessrepository/.git git fetch chess chess:chess 

Resultado

Diagrama de repositorios combinados

Use subdirectorys por proyecto?

También puede ser útil si mantiene sus proyectos en subdirectorys siempre que sea posible, por ejemplo, en lugar de tener files

 chess.prog philosophy_doctorate.txt 

tener

 chess/chess.prog thesis/philosophy_doctorate.txt 

En este caso, su file de software sin seguimiento será chess/untracked_software_file.prog . Cuando trabaje en el directory de thesis , los files del progtwig de ajedrez sin seguimiento no le molestarán, y puede encontrar ocasiones en las que puede trabajar felizmente sin borrar files sin seguimiento de otros proyectos.

Además, si desea eliminar files sin seguimiento de otros proyectos, será más rápido (y less propenso a error) volcar un directory no deseado que eliminar los files no deseados al seleccionar cada uno de ellos.

Yo usaría los git submodules .

echar un vistazo aquí repository de Git en un repository git