¿Cuál es la mejor práctica para poner múltiples proyectos en un repositorio git? [cerrado]

188

Por alguna razón, solo tengo un repositorio para usar.
Pero tengo varios proyectos, incluidos javaproyectos php scriptsy Androidproyectos de aplicaciones.

Ahora mi problema es que tengo que ponerlos en diferentes subcarpetas dentro del repositorio
. Uso diferentes IDEs. Ya sabes, cada IDE puede tener un espacio de trabajo en sí mismo.

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

Pedregoso
fuente
1
Una posible solución podría ser stackoverflow.com/questions/5514739/… o stackoverflow.com/a/7931825/828197
Ragnarokkr
2
No estás solo. Tengo un caso similar con mis repositorios que uso con fines de aprendizaje (ejemplo: github.com/hopbit/java-sandbox ). No quiero crear un nuevo repositorio para probar ejemplos para cada nuevo libro / tutorial que empiezo a leer ...
Łukasz Siwiński
Una razón por la que querría hacer esto es si tiene un proyecto que es el código del producto que implementa en entornos de tiempo de ejecución como prueba o producción. El segundo proyecto es una aplicación que prueba el sistema (BDD, por ejemplo) del primer proyecto. Existe una estrecha relación entre estos dos proyectos y ahora puede mantener / referirse a la totalidad utilizando una URL de repositorio.
Lance Kind
Resumen como se muestra a continuación "Git no tiene idea de si son partes de proyectos iguales o diferentes"
ahmednabil88

Respuestas:

198

Si bien la mayoría de la gente le dirá que solo use múltiples repositorios, creo que vale la pena mencionar que hay otras soluciones.

Solución 1

Un único repositorio puede contener múltiples ramas independientes , llamadas ramas huérfanas . Las ramas huérfanas están completamente separadas unas de otras; No comparten historias.

git checkout --orphan BRANCHNAME

Esto crea una nueva rama, no relacionada con su rama actual. Cada proyecto debe estar en su propia rama huérfana.

Ahora, por alguna razón, 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 rama huérfana esté limpia, puede usarla normalmente.

Solución 2

Evite toda la molestia de las ramas huérfanas. Cree dos repositorios independientes y empújelos al mismo control remoto. Simplemente use diferentes nombres de sucursal para cada repositorio.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Jacob Groundwater
fuente
Muchas gracias, eso debería ser capaz de resolver mi problema. En realidad, las dos soluciones usan sucursales para mantener diferentes proyectos.
Stony
66
No estoy seguro de entender la solución 2. ¿Estás diciendo que confirmas todos los archivos .git en un repositorio maestro de git? ¿Qué diferencia hay entre usar múltiples ramas huérfanas y usar múltiples ramas?
Nate
14
@Nate Lo que está diciendo es esto: haga dos repositorios locales separados , luego empuje ambos al mismo repositorio remoto en GitHub.
The Guy with The Hat
1
Gracias @TheGuywithTheElfHat. Ahora que lo veo de nuevo (9 meses después) me parece claro. La solución 2 todavía está creando ramas huérfanas, pero puedo ver cómo este método es más fácil de manejar.
Nate
21
La solución 2 necesita más explicación
eC Droid
19

Solución 3

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

Inicie todos los proyectos desde un directorio vacío comprometido

No esperes maravillas de esta solución. Tal como lo veo, siempre tendrás molestias con los archivos no rastreados. Git realmente no tiene ni idea de qué hacer con ellos, por lo que si hay archivos intermedios generados por un compilador e ignorados por su archivo .gitignore, es probable que se queden colgando parte del tiempo 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. Comience como debería comenzar cualquier proyecto git, confirmando el repositorio vacío, y luego inicie todos sus proyectos desde el mismo estado de directorio vacío. De esa manera, está seguro de que los dos lotes de archivos son bastante independientes. Además, asigne a sus sucursales un nombre propio y no use perezosamente "master". Sus proyectos deben estar separados, así que deles nombres apropiados.

Las confirmaciones de Git (y, por lo tanto, las etiquetas y las ramas) básicamente almacenan el estado de un directorio y sus subdirectorios, y Git no tiene idea de si se trata de partes de proyectos iguales o diferentes, por lo que realmente no hay problema para que git almacene diferentes proyectos en el mismo repositorio. Entonces, el problema es que usted borra los archivos no rastreados de un proyecto cuando usa otro, o separa los proyectos más tarde.

Crea un repositorio 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

Retroceda y avance entre proyectos cuando lo desee. 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 archivos sin seguimiento son molestos

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

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

No es un problema insuperable.

Por definición, git realmente no sabe qué hacer con los archivos no rastreados y depende de usted lidiar con ellos. Puede evitar que los archivos no rastreados se transporten de una rama a otra de la siguiente manera.

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

Al asegurarnos de que el directorio estaba vacío antes de revisar nuestro nuevo proyecto, nos aseguramos de que no hubiera archivos sin seguimiento colgantes 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 se especifican las mismas fechas cada vez que se confirma un repositorio vacío, las confirmaciones de repositorio vacías creadas independientemente pueden tener el mismo código SHA1. Esto permite crear dos repositorios de forma independiente y luego fusionarlos en un solo árbol con una raíz común en un repositorio más adelante.

Ejemplo

# Create thesis repository. 
# Merge existing chess repository branch into it

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

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Resultado

Diagrama de repositorios fusionados

¿Usar subdirectorios por proyecto?

También puede ayudar si mantiene sus proyectos en subdirectorios cuando sea posible, por ejemplo, en lugar de tener archivos

chess.prog
philosophy_doctorate.txt 

tener

chess/chess.prog
thesis/philosophy_doctorate.txt 

En este caso, su archivo de software sin seguimiento será chess/untracked_software_file.prog. Cuando trabaje en el thesisdirectorio, los archivos de programas de ajedrez no rastreados no le molestarán, y puede encontrar ocasiones en las que puede trabajar felizmente sin eliminar archivos no rastreados de otros proyectos.

Además, si desea eliminar archivos no rastreados de otros proyectos, será más rápido (y menos propenso a errores) volcar un directorio no deseado que eliminar archivos no deseados seleccionando cada uno de ellos.

Los nombres de las ramas pueden incluir caracteres '/'

Por lo tanto, es posible que desee nombrar a sus ramas algo así como

project1/master
project1/featureABC
project2/master
project2/featureXYZ
Ivan
fuente