Tengo dos repositorios, uno es el repositorio principal de una biblioteca y el otro es un proyecto que usa esa biblioteca.
Si hago una corrección en el proyecto subordinado, me gustaría una manera fácil de aplicar ese parche en sentido ascendente.
La ubicación del archivo es diferente en cada repositorio.
- Repositorio principal:
www.playdar.org/static/playdar.js
- Proyecto:
playlick.com/lib/playdar.js
Intenté usarlo git format-patch -- lib/playdar.js
en el proyecto playlick y luego git am
en el repositorio principal de playdar, pero las diferentes ubicaciones de los archivos en el archivo de parche generaron un error.
¿Existe una manera fácil de aplicar el parche de una confirmación determinada en un archivo dado a otro archivo arbitrario en otro lugar?
Para obtener puntos de bonificación, ¿qué sucede si el archivo al que desea aplicar el parche no está en un repositorio de git?
fuente
Respuestas:
Si la edición manual del archivo de revisión está fuera de la pregunta o no factible, esto se puede hacer con las opciones estándar (disponible en
git apply
,git format-patch
y GNUpatch
).-p<n>
eliminan
los directorios principales de las rutas del parche.Después del procesamiento
-p
,--directory=<root>
anteponeroot
a cada una de las rutas en el parche antes de aplicar.Ejemplo
Entonces, para su ejemplo, para tomar un parche que estaba originalmente encendido
static/playdar.js
y aplicarlolib/playdar.js
, ejecutaría:fuente
--directory
: stackoverflow.com/questions/24121709/…El parche producido por
git format-patch
es simplemente un archivo de texto; puede editar los encabezados de diferencias para que modifique una ruta diferente.Entonces, por ejemplo, habría producido algo como esto:
Todo lo que tiene que hacer es cambiar
lib/playdar.js
astatic/playdar.js
continuación, ejecute el parche a travésgit am"
El parche debe ser legible por la utilidad de parche GNU estándar para las personas que no tienen
git
--- pero no ejecutanformat-patch
las opciones-M
,-C
etc. para producir parches de cambio de nombre en ese caso, porque el soporte para ellos no es universal.fuente
Suponiendo que ambos proyectos son proyectos de git, parece que los submódulos serían perfectos para ti. Esto permite que un proyecto de git se vincule dinámicamente a otro proyecto de git, esencialmente creando un repositorio de git dentro de otro repositorio de git, ambos con sus propias vidas distintas.
En otras palabras, agregue "repositorio principal" como un submódulo en "proyecto". Siempre que confirme / inserte cosas nuevas en el "repositorio principal", simplemente
git pull
las devuelve al "proyecto".fuente
playdar.js
archivo y luego incluirlo en los otros dos proyectos (no quiero todo lo demáswww.playdar.org
en elplaylick.com
proyecto). Podría recurrir a editar manualmente los archivos de parche por ahora para ser honesto . O continúe copiando y pegando entre los dos. Salud.Para completar la respuesta de Henrik e ir por el punto de bonificación
Si tiene acceso a los directorios del archivo candidato para un parche proveniente de un repositorio de git, ¡primero podría transformar ese árbol de directorios / archivos en un repositorio de git! ('
git init
': un repositorio de git es solo un .git dentro de un directorio raíz después de todo).Luego, establecería ese repositorio como un submódulo para su proyecto principal.
fuente
El uso de la
--relative
opción paraformat-patch
puede mejorar la abstracción (ocultar detalles irrelevantes sobre el repositorio desde el que se generó el parche).He descubierto que la
--3way
opción es necesaria al aplicar el parche (para evitardoes not exist in index
errores); su kilometraje puede variar. El uso--directory=(...)
es probable que sólo es necesario si su ruta de destino no es la raíz del repositorio.format-patch
creará un archivo de parche por confirmación en la rama actual desde 'base'.La documentación para la
--relative
opción parece faltar en algunos casos , pero parece funcionar de todos modos (a partir de la versión 2.7.4).fuente
Puede agregar un nuevo control remoto y extraerlo. Artículo con detalles.
fuente
Puede simplemente eliminar (cambiar el nombre) temporalmente el repositorio principal.
fuente
Creo que el subárbol es la mejor solución para su problema.
Tutorial 1
Tuorial 2
fuente