remove - git tag best practices
Repositorio Git en un repositorio git (6)
He usado esa estructura durante bastante tiempo, con los directorios de sub-repo especificados en .gitignore en el repositorio externo.
Confunde la herramienta git en mi editor (PhpStorm), que siempre quiere comprometerse con el repositorio externo, pero de lo contrario funciona bien. Cargué todo el repositorio externo (que incluye todos los repositorios innner) como un único proyecto en el editor. Eso me permite buscar y examinar fácilmente el código en el repositorio externo mientras trabajo en uno interno.
Hago todas las operaciones de Git de Git bash en cualquier repositorio en el que esté trabajando.
Los submódulos pueden ser un mejor enfoque. No he tenido tiempo de investigar si funcionarían mejor con PhpStorm.
Tengo un repositorio git que incluye un repositorio git.
repo1/
.git/
files
repo2/
.git/
files
files
¿Es posible trabajar con esta arquitectura?
Lo que está tratando de lograr se llama "submódulo", consulte este enlace: http://git-scm.com/book/en/v2/Git-Tools-Submodules para averiguar cómo está funcionando.
Me sorprende que nadie en este hilo haya mencionado las soluciones de administración de paquetes.
Es cierto que los submódulos de Git te permitirían desarrollar con la arquitectura que describes, los subárboles de Git proporcionan una solución similar que muchas personas prefieren.
En mi opinión, el software de gestión de paquetes es una parte integral de cualquier proyecto complejo. Me gusta el compositor debido a los flujos de trabajo intuitivos que admite: https://getcomposer.org/
Desafortunadamente, los submódulos de git no son compatibles con PHPstorm: http://youtrack.jetbrains.com/issue/IDEA-64024
Puede tener repositorios git anidados:
El repositorio padre simplemente ignorar el repositorio anidado .
jleedev comenta e ilustra con esta secuencia de comandos jleedev que el repositorio principal haría un seguimiento del estado de repos repo mediante un gitlink .
(gitlink = SHA-1 del objeto que hace referencia a un commit en otro repositorio. Los enlaces Git solo pueden ser especificados por SHA o mediante una marca de confirmación.
Un gitlink tiene un modo especial '' 160000
'', usado para submódulos, pero también presente para repositorios simples anidados).
Sin embargo, los comandos habituales no reconocerían el repositorio anidado: add
o commit
se aplicaría solo en un repositorio, no en el otro.
El submódulo git permitiría hacer referencia al repositorio anidado desde el repositorio padre y mantener una referencia exacta del repositorio hijo.
Otra alternativa podría implicar:
- dos repositorios Git separados (no anidados)
- un enlace simbólico de uno a una parte específica del otro (tanto Unix, como Windows Vista + tienen enlaces simbólicos)
Sí, puedes usar este patrón. Lo he usado en el pasado para traer SVN externos a un clon git-svn. Los submódulos pueden manejar esto mejor ahora, pero no se ajustaba a mis necesidades en ese momento.
Deberá agregar lo siguiente a repo1 / .git / info / exclude para asegurarse de que los cambios en repo2 no se mezclen con repo1:
repo2
También estoy de acuerdo con Ronald Williams arriba. El objetivo principal de git-submódulos es actualizar el código tomado del mundo exterior sin necesidad de realizar cambios si ese código fue modificado por la actualización. Lo mismo hace el sistema de gestión de paquetes del compositor. En realidad , tampoco recomiendan comprometer esos cambios e ignorar la carpeta del proveedor en .gitignore en la raíz del proyecto. Es una pesadilla si intentas comprometer esta carpeta porque algunos de los proveedores / some_repo pueden ser de la versión dev, en consecuencia tienen una carpeta .git que da como resultado que todos esos paquetes se conviertan en submódulos incluso si no los agregas con git submodule add
. Podría ver algo como esto si modifica algún_archivo en un repositorio .git anidado:
~/project_root $ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
# (commit or discard the untracked or modified content in submodules)
#
# modified: vendor/nested_repo (modified content)
Tenga en cuenta el contenido modificado en la entrada de los submódulos y que no ve un nombre de archivo en el resultado. En su lugar, se ve un aviso (contenido modificado) porque root_project .git ve al proveedor / nested_repo como un submódulo y no rastrea los archivos individuales en esa carpeta.
Si ejecuta git add, no obtendrá ningún resultado hasta que confirme cambios en vendor / nested_repo y solo después de eso podrá confirmar los cambios en el repositorio raíz.
No hagas esto En cambio, si desea mantener su proyecto como un repositorio .git completo (cualquiera, no solo el repositorio creado por el compositor), lo cual es muy conveniente a veces, agregue esta entrada al .gitignore raíz ANTES de la confirmación inicial:
.git
!/.git
Desafortunadamente, para que toda la receta funcione, debe ejecutar el comando git add
para cada uno de los git add
anidados que luego quiera modificar individualmente. Tenga en cuenta que la barra inclinada final en las rutas de los repos es IMPRESCINDIBLE .
~/project_root $ git add vendor/some_repo/ vendor/another_repo/
Luego modifique some_file en el proveedor / some_repo y vea la diferencia:
~/project_root $ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: vendor/some_repo/some_file
De esta forma, puede ejecutar git add --all
y luego git commit "Changes ..."
en la raíz_proyecto como de costumbre.