Mantener el repositorio de git dentro de otro repositorio de git

125

Esto es lo que me gustaría:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Quiero poder enviar todos los contenidos de REPO-A a REMOTE-A y solo REPO-B a REMOTE-B.

¿Posible?

Adamyonk
fuente

Respuestas:

104

Parece que quieres usar submódulos de Git .

Git aborda este problema mediante submódulos. Los submódulos le permiten mantener un repositorio de Git como subdirectorio de otro repositorio de Git. Esto le permite clonar otro repositorio en su proyecto y mantener sus confirmaciones separadas.

mipadi
fuente
19
No exactamente: no impulsará todo el contenido del repositorioA: solo A más una referencia a B. Pero no critico tu respuesta, me apresuré a escribir casi lo mismo cuando
releí
1
Este es prácticamente el caso de uso de los submódulos. REPO-A y REPO-B se tratan como repositorios de git por derecho propio, con sus propias confirmaciones, orígenes, historia, etc.
Damien Wilson
2
entonces, si estoy leyendo bien, ¿puedo verificar de forma independiente un repositorio de submódulo-d completamente fuera del que lo encuentro? ¿Cómo tomaría un repositorio ya existente y lo referenciaría como un submódulo en otro proyecto?
JohnO
No estaba buscando exactamente la misma solución que OP, y creo que, en promedio, esta es probablemente una respuesta más buscada a una pregunta similar: "colocar git REPO-B dentro de git REPO-A incrusta una referencia o una copia completa de git REPO-B? ".
jaya
64

Siempre he usado enlaces simbólicos para mantener dos repositorios separados y distintos.

JohnO
fuente
8
por lo confusos que parecen ser los submódulos git y el subárbol git, esta es una respuesta válida.
Trevor Hickey
Esto también es muy útil para ensamblar una aplicación desde múltiples repositorios remotos
GeraldScott
22
Para mantener dos repositorios separados y distintos, ¿no estaría bien mantener el repositorio B en el repositorio A y simplemente agregar el repositorio B al repositorio A .gitignore?
Fabien Snauwaert
1
Estaba pensando en hacer lo que sugiere Fabien, ¿hay algún problema con hacerlo de esa manera?
theonlygusti
1
Mantengo los repositorios de git separados y copio los cambios realizados en REPO-B en una copia de REPO-B (sin .git) que está anidada en REPO-A. Hago eso con rsync. Corro rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/después de que haya cambios en REPO-B
Shai
29

Sí, puedes hacer exactamente lo que estás pidiendo con la jerarquía de archivos que dibujaste. Repo-B será independiente y no tendrá conocimiento de Repo-A. Repo-A rastreará todos los cambios en sus propios archivos y archivos de Repo-B.

Sin embargo, no recomendaría hacer esto. Cada vez que cambie archivos y confirme en Repo-B, tendrá que confirmar en Repo-A. La ramificación en Repo-B afectará a Repo-A y la ramificación en Repo-A será inestable (problemas para eliminar carpetas, etc.). Los submódulos son definitivamente el camino a seguir.

kubi
fuente
53
¿No puede simplemente agregar REPO-B a /REPO-A/.gitignore?
mikkelbreum
2
@mikkelbreum Tuve exactamente la misma idea. Actualmente estamos usando subverion para nuestro proyecto principal y usamos un repositorio de git en una de las subcarpetas. Con SVN acabo de agregar la carpeta con el repositorio git a la propiedad svn: ignore y me preguntaba si puedo hacer lo mismo con git.
2ndkauboy
3
Bueno, no puedo ver por qué agregar un repositorio git anidado a la lista de ignorados del repositorio principal no debería funcionar ... Pero al mismo tiempo tengo la sensación de que debe haber alguna trampa en la que no he pensado, ya que este enfoque es rara vez visto sugerido, y muchas personas desalientan los repositorios git anidados.
mikkelbreum
18
Acabo de implementar este escenario exacto. Tengo algunos archivos CSS sin comprimir en una subcarpeta que no quiero que se envíen al repositorio remoto, por lo que está en mi .gitignore. Pero quiero hacer un seguimiento de los cambios en estos archivos localmente. Configuré un repositorio dentro de la carpeta con los archivos sin comprimir y agregué todos los archivos a ese repositorio. Todavía es ignorado por el repositorio principal, pero puedo rastrear los cambios dentro del sub-repositorio. Recomendado o no, esta solución es clave para determinadas situaciones como esta.
BrianVPS
1
Entiendo que cada vez que cambia de rama en un repositorio, el otro verá un montón de cambios, pero ¿por qué "la ramificación en Repo-A será inestable (problemas para eliminar carpetas, etc.)"? ¡Gracias!
user2688151
2

Puede lograr lo que desea (ese repositorio REPO-A contiene todos los archivos, incluidos los de la carpeta REPO-B en lugar de solo una referencia) utilizando "git-subrepo":

https://github.com/ingydotnet/git-subrepo

Todavía funciona si algunos de sus colaboradores no tienen instalado el comando subrepo; verán la estructura de carpetas completa pero no podrán realizar cambios en los subrepos.

pegamento
fuente