Cómo incorporar cambios desde el sub-repository esqueleto al super-repository de producción

Estoy usando el esqueleto de Aurelia que contiene varias configuraciones de proyectos para diferentes propósitos, pero es más una cuestión general de cómo harías algo con git como se describe a continuación.

Me gustaría poder combinar las actualizaciones publicadas en el repository esqueleto de GitHub con el proyecto en el que estoy trabajando. ¿Cómo lo harías tú?

Por el momento, recién inicié un nuevo repository local en el proyecto skeleton-typescript (que estoy usando) y lo conecté a un repository remoto privado para impulsar mis cambios. Pero con esta configuration, estoy contaminando el repository principal (el señalamiento remoto de aurelia-skeleton en Github) con mis cambios específicos del proyecto.

Sería perfecto tener algún tipo de seguimiento unidireccional ya que el repository remoto esqueleto aurelia normalmente solo se usa para generar cambios.

Como segundo paso, sería interesante cómo podría crear una request de extracción con dicha configuration. En este caso, me gustaría usar los cambios que hice en el sub-repository para fusionarlos en la bifurcación de la aurelia remota …

Mi flujo de trabajo habitual es crear una twig dedicada desde la cual seguir el proyecto ascendente. Puede elegir lo que desee en esa twig y crear una request de extracción sin ennetworkingar la plantilla con los detalles de su proyecto.


Primero, siga adelante con fork aurelia/skeleton-navigation para que pueda emitir fácilmente una request de extracción a través de la GUI de Github.

Clona tu fork del proyecto con el nombre remoto upstream en una nueva carpeta llamada skeleton-typescript

 git clone -o upstream [email protected]:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript cd skeleton-typescript 

Cambiar el nombre de la twig principal.

 git branch -m asmaster 

Crear un nuevo repository para skeleton-typescript

Consejo: Puedes hacer esto directamente desde la línea de command usando la API de Github con algo como curl

 curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos 

Agrega el control remoto.

 git remote add origin [email protected]:YOUR_GITHUB_USERNAME/skeleton-typescript.git 

Divida el repository en un subtree ( consulte el código fuente de la página man ) que contendrá un nuevo tree con todo el historial de compilation de files en el directory de prefix .

 git subtree split --prefix=skeleton-typescript 

Esto imprimirá una única identificación de compromiso que es la HEAD del subtree.

539d913a8cf9b34b644273b5cdb480359553247c

Crea tu twig principal a partir de esa confirmación.

 git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c 

Presione y rastree su nuevo repository.

 git push -u origin master 

Backporting

Cometer algún trabajo en skeleton-typescript

 echo "notable contribution" >> file.txt git add . git commit -m "backport test commit" git push origin master 

Verifique la sucursal de superproyectos en sentido ascendente, y select las confirmaciones del subtree.

 git checkout asmaster git cherry-pick -x --strategy=subtree master git push upstream asmaster:master 

Ahora puede emitir una request de extracción desde la horquilla ascendente YOUR_GITHUB_USERNAME/skeleton-navigation:master twig YOUR_GITHUB_USERNAME/skeleton-navigation:master a su aurelia/skeleton-navigation:master twig aurelia/skeleton-navigation:master .

Actualizando

Ahora habrá actualizaciones sin duda para su upstream 's upstream ( aurelia/skeleton-navigation:master ) que includeá actualizaciones en la carpeta skeleton-typescript su subtree.

Agregue otro control remoto para seguir el proyecto original.

 git remote add upupstream [email protected]:aurelia/skeleton-navigation.git 

Tenga en count que ahora tiene 3 controles remotos en su repository local.

 git remote -v 
 origin [email protected]:YOUR_GITHUB_USERNAME/skeleton-typescript.git (fetch) origin [email protected]:YOUR_GITHUB_USERNAME/skeleton-typescript.git (push) upstream [email protected]:YOUR_GITHUB_USERNAME/skeleton-navigation.git (fetch) upstream [email protected]:YOUR_GITHUB_USERNAME/skeleton-navigation.git (push) upupstream [email protected]:aurelia/skeleton-navigation.git (fetch) upupstream [email protected]:aurelia/skeleton-navigation.git (push) 

Despliega las actualizaciones.

 git checkout asmaster git pull upupstream master 

Separar el subtree de nuevo y agarrar el compromiso HEAD.

 git subtree split --prefix=skeleton-typescript 

095c0c9f7ed06726e9413030eca4050a969ad0af

Vuelve al subproyecto.

 git checkout master 

Si nunca ha respaldado los cambios, entonces un atributo notable de la git subtree split de git subtree split es que tendrá exactamente el mismo historial de confirmación de hash, por lo que puede avanzar rápidamente en las fusiones sin reescribir el historial. De los documentos :

Se garantiza que las divisiones repetidas de exactamente el mismo historial sean idénticas (es decir, que produzcan los mismos identificadores de confirmación). Debido a esto, si agrega nuevas confirmaciones y luego vuelve a dividirlas, las nuevas confirmaciones se adjuntarán como confirmaciones sobre el historial que generó la última vez, por lo que git merge y friends funcionarán como se espera.

 git merge 095c0c9f7ed06726e9413030eca4050a969ad0af 

Sin embargo, si ya ha realizado copys de security de las actualizaciones seleccionadas, o cualquier otro cambio en el historial del subtree, querrá volver a establecer las bases de cambios, de lo contrario, tendrá confirmaciones duplicadas.

 git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af