2010-02-23 19 views
28

Parece que un repositorio de git dentro de un repositorio principal no se incluye en una confirmación en el elemento primario a menos que esté configurado como un submódulo. ¿Es posible anular este comportamiento y tratar el repositorio git anidado como cualquier otro directorio? No quiero depender de dependencias externas a través de submódulos, pero quiero usar git para administrar estas dependencias dentro del proyecto.repositorios git anidados sin submódulos?

+0

No estoy seguro de si este es el camino correcto a "dependencias de la sarna", pero propongo dos formas de lograr lo que quiere, además de algunas precisiones sobre la naturaleza de submódulos de Git . – VonC

+1

Parece que lo que realmente quieres es una combinación de subárbol. Eso te dejará con un único repositorio y un solo historial. –

+0

¿Estás seguro de que ** un repositorio git dentro de un repositorio padre no está incluido en una confirmación en el padre a menos que esté configurado como un submódulo **? Porque eso es lo que quiero, y si tienes razón, entonces Git tiene ese out-of-the-box. –

Respuesta

7

1/Se podría anular que a través de:

  • o bien un git config configuración: establecer la variable de entorno $GIT_DIR
    definir el directorio de .git del árbol de trabajo Git anidado como un externa.git (externo a tanto el repositorio anidado como el repositorio principal)
  • o configurando su repositorio anidado 'N' fuera de el repositorio principal, pero finalice la operación de ese repo 'N' en el interior el repositorio principal:
core.worktree

establecer la ruta a la raíz del árbol de trabajo. Esto puede ser anulado por la variable GIT_WORK_TREE medio ambiente y la opción de línea de comandos --work-tree

En ambos casos, la idea es tener un worktree anidada sin ningún .git subdirectorio en él.

2/Con los submódulos, el repositorio de git anidado no se incluye realmente en el repositorio padre.
A special entry se crea en el árbol padre para grabar el Git SHA1 externo.

new file mode 160000 
index 0000000..4c4c5a2 

Véase también "nature of Git submodules" (tercera parte de la respuesta)

+0

Sus métodos 1a y 1b son perfectos para mí, gracias. Estoy seguro de que este no es el enfoque recomendado, pero realmente necesito esta flexibilidad. Gracias por la respuesta completa! – stevo

+3

¿No hay otra opción para hacer que git trate los directorios .git anidados como directorios simples? –

+1

@Mr_and_Mrs_D no sé de – VonC

2

Ver también Are git submodules the only safe way to have working copies within working copies?.

En realidad, cuando me encontré con la discusión actual, me preocupaba un problema diferente al resuelto aquí: usar git como una especie de herramienta de archivo que podría archivar un árbol del sistema de archivos que ya tiene algunos directorios de trabajo git. . Quizás la otra pregunta esté más cerca de mi problema.

+0

Aquí hay una herramienta dirigida a mi problema: http://webcache.googleusercontent.com/search?q=cache:Ffr9y2l0jh4J:eigenclass.org/hiki/gibak-backup-system-introduction+ anidado + git y cd = 2 & hl = en & ct = clnk & gl = ru Probablemente haya otras herramientas similares. –

+1

oops - enlace roto en el comentario (que probablemente debería eliminar y agregar a su respuesta) –

0

Esta no es la solución más elegante, pero vale la pena mencionarla.

Si cierra la carpeta que contiene el repositorio, puede verificarlo en el repositorio externo.

Esto puede ser útil porque tendrá el estado completo completo, incluido git reflog.

+0

Parece que esta es la única opción real, para mal agrega pasos adicionales (manuales) ... – nus

4

me encontré con otro método que parece funcionar para mí

Si git add somefolder/ < - asegúrese de que tiene la / en el extremo, entonces añadir todos los archivos en lugar de tratarla como un submódulo.

más se menciona aquí: http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

+0

Esto es lo que estaba buscando , pero recibo un mensaje de error si intento agregar el propio .git anidado: 'error: Ruta inválida 'prueba/datos/accesorios/limpiar/.git/COMMIT_EDITMSG' error: no se pueden agregar pruebas/datos/dispositivos/clean/.git/COMMIT_EDITMSG al índice fatal: no se pudieron agregar archivos' Parece que funciona con los archivos reales, gracias, es un comienzo – nus

+0

He visto cómo las personas cambian el nombre de una carpeta anidada '.git' a' .checkout_git 'https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/ Y cambie el nombre de nuevo según sea necesario –

Cuestiones relacionadas