Comencé un proyecto hace algunos meses y guardé todo en un directorio principal. En mi directorio principal "Proyecto" hay varios subdirectorios que contienen diferentes cosas: Proyecto / papel contiene un documento escrito en LaTeX Proyecto / código fuente / RailsApp contiene mi aplicación rails.
"Proyecto" está GITified y ha habido muchas confirmaciones tanto en el directorio "papel" como en el directorio "RailsApp". Ahora, como me gustaría usar cruisecontrol.rb para mi "RailsApp", me pregunto si hay una manera de hacer un submódulo de "RailsApp" sin perder el historial.
git
git-submodules
Cœur
fuente
fuente
Respuestas:
Hoy en día hay una manera mucho más fácil de hacerlo que usando git filter-branch manualmente: git subtree
Instalación
NOTA
git-subtree
ahora es parte degit
(si instala contrib) a partir de 1.7.11, por lo que es posible que ya lo tenga instalado. Puede verificar ejecutandogit subtree
.Para instalar git-subtree desde la fuente (para versiones anteriores de git):
O si quieres las páginas man y todo
Uso
Divida una más grande en trozos más pequeños:
Para obtener documentación detallada (página de manual), lea
git-subtree.txt
.fuente
git rm -rf ./foo
eliminafoo
a partirHEAD
, pero no lo hace de filtromy-project
's historia completa. Entonces,git submodule add [email protected]:my-user/new-project.git foo
solo hacefoo
un submódulo a partir deHEAD
. En ese sentido, la secuencia de comandosfilter-branch
es superior, ya que permite lograr "hacer como si subdir fuera un submódulo desde el principio"Verifique git filter-branch .
La
Examples
sección de la página de manual muestra cómo extraer un subdirectorio en su propio proyecto mientras se mantiene todo su historial y se descarta el historial de otros archivos / directorios (justo lo que está buscando).fuente
Una forma de hacerlo es a la inversa: elimine todo menos el archivo que desea conservar.
Básicamente, haga una copia del repositorio, luego use
git filter-branch
para eliminar todo menos los archivos / carpetas que desea conservar.Por ejemplo, tengo un proyecto del que deseo extraer el archivo
tvnamer.py
a un nuevo repositorio:Eso suele
git filter-branch --tree-filter
pasar por cada confirmación, ejecutar el comando y volver a comprometer el contenido de los directorios resultantes. Esto es extremadamente destructivo (¡por lo que solo debe hacer esto en una copia de su repositorio!), Y puede tomar un tiempo (aproximadamente 1 minuto en un repositorio con 300 confirmaciones y aproximadamente 20 archivos)El comando anterior solo ejecuta el siguiente script de shell en cada revisión, que tendría que modificar, por supuesto (para que excluya su subdirectorio en lugar de
tvnamer.py
):El mayor problema obvio es que deja todos los mensajes de confirmación, incluso si no están relacionados con el archivo restante. El script git-remove-empty-commits corrige esto ...
Debe usar el
-f
argumento de fuerza para ejecutarfilter-branch
nuevamente con cualquier cosa enrefs/original/
(que básicamente es una copia de seguridad)Por supuesto, esto nunca será perfecto, por ejemplo, si sus mensajes de confirmación mencionan otros archivos, pero es lo más cercano que permite una corriente de git (que yo sepa de todos modos).
Nuevamente, ¡solo ejecute esto en una copia de su repositorio! - pero en resumen, para eliminar todos los archivos excepto "thisismyfilename.txt":
fuente
git filter-branch
tiene (¿hoy en día?) una opción incorporada para eliminar confirmaciones vacías, a saber--prune-empty
. Una mejor guíagit filter-branch
está en las respuestas a esta pregunta: stackoverflow.com/questions/359424/…Las respuestas de CoolAJ86 y apenwarr son muy similares. Fui y retrocedí entre los dos tratando de entender los bits que faltaban en cualquiera de ellos. A continuación se muestra una combinación de ellos.
Primero navegue Git Bash a la raíz del repositorio de git que se dividirá. En mi ejemplo aquí es
~/Documents/OriginalRepo (master)
A continuación se muestra una copia de lo anterior con los nombres que se pueden personalizar reemplazados y usando https en su lugar. La carpeta raíz es ahora
~/Documents/_Shawn/UnityProjects/SoProject (master)
fuente
Si desea transferir algún subconjunto de archivos a un nuevo repositorio pero conservar el historial, básicamente terminará con un historial completamente nuevo. La forma en que esto funcionaría es básicamente la siguiente:
Debería ser algo sencillo automatizar esto si no le importa escribir un guión pequeño pero complicado. Sencillo, sí, pero también doloroso. La gente ha reescrito la historia en Git en el pasado, puedes hacer una búsqueda para eso.
Alternativamente: clone el repositorio y elimine el papel en el clon, elimine la aplicación en el original. Esto tomaría un minuto, está garantizado que funcionará y puede volver a cosas más importantes que tratar de purificar su historial de git. Y no se preocupe por el espacio en el disco duro que ocupan las copias redundantes del historial.
fuente