Bifurcando un subdirectorio de un repositorio en GitHub y haciéndolo parte de mi propio repositorio
repository git-subtree (1)
Disculpas, soy muy nuevo en Git y GitHub, he leído algunas cosas pero no estoy seguro de que lo que estoy tratando de hacer sea del todo posible.
Básicamente, quiero bifurcar la máscara de confluencia utilizada en XBMC y modificar varios elementos ubicados aquí:
https://github.com/xbmc/xbmc/tree/master/addons/skin.confluence
Sin embargo, no quiero bifurcar todo el repositorio de XBMC, por lo que una simple acción de bifurcación no sirve.
Aquí están mis requisitos generales:
Me gustaría tomar el contenido de la carpeta skin.confluence y ponerlo en un repositorio en mi propia cuenta de GitHub
Necesito poder mantenerlo vinculado dentro del repositorio original de XBMC para recibir confirmaciones en sentido ascendente, ya que mis modificaciones generalmente se basarán en el tema, en lugar de la funcionalidad.
Gracias a la respuesta publicada por tbekolay, he podido hacer una división de subárbol para tomar solo la parte skin.confluence del repo y esencialmente crear una rama, sin embargo, no estoy seguro de cómo mantenerlo vinculado con el repo XBMC original mientras estoy Empujado a mi propio repo con mis modificaciones.
Esto es posible principalmente con git
, aunque no es un caso de uso típico, por lo que puede haber algunos bordes ásperos al hacer esto (especialmente si es nuevo en git
).
La herramienta que usaremos para este trabajo es git subtree
.
Configuración de un repositorio
Comience por clonar todo el repositorio de XBMC.
git clone https://github.com/xbmc/xbmc.git
cd xbmc
Comenzamos en la rama master
por defecto. Queremos hacer nuestra propia rama master
, así que vamos a cambiar el nombre de master
a upstream-master
.
git branch -m upstream-master
Ahora use la git subtree split
para incluir solo la parte que desee. Haremos la parte separada una nueva rama llamada upstream-skin
.
git subtree split --prefix=addons/skin.confluence -b upstream-skin
git checkout upstream-skin
Esto le da una nueva rama de upstream-skin
que solo contiene los contenidos de addons/skin.confluence
, y con un historial filtrado que contiene solo las confirmaciones que modificaron los archivos en addons/skin.confluence
.
Ahora, vamos a configurar nuestros mandos a distancia. Desde que clonó xbmc/xbmc.git
, el control remoto de origin
apuntará allí. Vamos a cambiarle el nombre a upstream
.
git remote rename origin upstream
Haga un repositorio en Github para contener sus modificaciones a addons/skin.confluence
. Como ejemplo, usaré tbekolay / xbmc-skin, pero reemplazarlo con su propio repositorio. Agregue este repositorio como control remoto y empuje su rama hacia upstream-skin
.
git remote add origin https://github.com/tbekolay/xbmc-skin.git
git fetch origin
git push -u origin upstream-skin
Finalmente, haremos una nueva rama llamada master
que contendrá sus cambios.
git checkout -b master
git push -u origin master
Ahora tiene un "fork" del subdirectorio addons/skin.confluence
.
Haciendo cambios a tus repositorios.
Cuando estás tratando con tus propios repositorios locales y remotos, puedes usar los comandos normales de git
. Asegúrate de hacer esto en la rama master
(o en alguna otra rama, si quieres) y no en la rama del upstream-skin
, que solo debe contener los compromisos del proyecto anterior.
git checkout master
echo "My XBMC Skin" > README
git add README
git commit -m "Added README"
git push
Recibiendo confirmaciones en sentido ascendente
Cuando estés tratando con el repositorio anterior, deberás usar una combinación de comandos git
y git subtree
. Para obtener nuevos compromisos filtrados, tenemos que hacerlo en tres etapas.
En la primera etapa, actualizaremos upstream-master
a la versión actual del repositorio XBMC.
git checkout upstream-master
git pull
Esto debería derribar nuevos compromisos, si hay alguno.
A continuación, actualizaremos la versión anterior con la nueva versión filtrada de las confirmaciones. Como el git subtree
garantiza que los hashes de confirmación serán los mismos, este debería ser un proceso limpio. Tenga en cuenta que desea ejecutar estos comandos mientras aún se encuentra en la rama upstream-master
.
git subtree split --prefix=addons/skin.confluence /
--onto upstream-skin -b upstream-skin
Con upstream-skin
ahora actualizado, puedes actualizar tu rama master
como mejor te parezca (ya sea combinando o reabasteciendo).
git checkout master
git rebase upstream-skin
Tenga en cuenta que el repositorio de XBMC es gigantesco, y los comandos del git subtree
tardarán bastante tiempo en filtrar todo ese historial, y como se regenera el subárbol dividido cada vez que interactúa con el repositorio remoto, es bastante caro operación. No estoy seguro si esto puede ser acelerado.
Esta publicación del blog entra en más detalles sobre los comandos anteriores. También vea los documentos de git-subtree
para más detalles.