Pregunta

Tengo dos depósitos, uno es el repositorio principal de una biblioteca, y el otro es un proyecto utilizando esa biblioteca.

Si hago una solución a la subordinada en el proyecto, me gustaría una manera fácil de aplicar ese parche de vuelta en sentido ascendente.

La ubicación del archivo es diferente en cada repositorio.

  • repo principal: www.playdar.org/static/playdar.js
  • Proyecto: playlick.com/lib/playdar.js

He intentado utilizar git format-patch -- lib/playdar.js en el proyecto playlick, y luego git am en la principal repo Playdar, pero las ubicaciones de archivos diferentes en el archivo de parche produce un error.

¿Hay una manera fácil de aplicar el parche a partir de un determinado cometer en un determinado archivo a otro archivo arbitrario en otro lugar?

Para obtener puntos de bonificación, lo que si el archivo que desea aplicar el parche no está en un repositorio git?

¿Fue útil?

Solución

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 (disponibles en git apply, git format-patch y patch GNU).

  1. -p<n> elimina n líder directorios de los caminos en el parche.

  2. Después de procesar -p, antepone --directory=<root> root a cada uno de los caminos en el parche antes de aplicar.

Ejemplo

Así que, por su ejemplo, para tomar un parche que estaba originalmente en static/playdar.js y aplicarlo a lib/playdar.js, debe ejecutar:

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'

Otros consejos

El parche producido por git format-patch es simplemente un texto file-- puede editar las cabeceras de los diff para que modifica un camino diferente.

Así, por ejemplo, habría producido algo como esto:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

Todo lo que tiene que hacer es cambiar lib/playdar.js a static/playdar.js y luego ejecutar el parche a través git am"

El parche debe ser legible por la utilidad estándar de parche GNU para las personas que no tienen git --- pero no ejecutar format-patch con el -M, etc. -C opciones para producir cambiar el nombre de los parches en ese caso, ya que el apoyo para ellos no es universal.

Suponiendo que ambos proyectos son proyectos Git, suena como que submódulos sería el ajuste perfecto para usted. Esto permite que un proyecto Git enlazar dinámicamente a otro proyecto Git, hornear esencialmente un repositorio git derecha dentro de otro repositorio git, ambos con sus propias vidas distintas.

En otras palabras, añadir "repo principal" como un submódulo de "proyecto". Cuando confirma / push cosas nuevas en "repo principal", que acaba de ellos git pull de nuevo en "proyecto".

Para completar Henrik responder, y para ir a por el punto de bonificación

  

¿y si el archivo que desea aplicar el parche no está en un repositorio git?

Si usted tiene acceso a los directorios del candidato archivo para un parche que viene de un repositorio git, se puede transformar en primer lugar que el árbol de directorios / archivos en un mismo repositorio git! ( 'git init': un repositorio Git es sólo un .git dentro de un directorio raíz después de todo)
. A continuación, se debe establecer que la cesión temporal como un submódulo para su proyecto principal.

Puede agregar un nuevo mando a distancia y tire de ella. artículo con los detalles.

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA

Creo subárbol es la mejor solución para su problema

Tutorial 1

Tuorial 2

Usted puede simplemente eliminar (renombrar) temporalmente el repositorio principal.

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git

El uso de la opción --relative a format-patch puede mejorar la abstracción (ocultar detalles irrelevantes sobre el repositorio desde el que se generó el parche).

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

He encontrado la opción --3way que se requiere cuando se aplica el parche (para evitar errores does not exist in index) - su experiencia puede variar. Usando --directory=(...) es probable que sólo es necesario si su ruta de destino no es la raíz del repositorio.

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)

  • format-patch creará un archivo de revisión por comprometerse con la rama actual ya 'base'.

  • La documentación para la opción --relative parece ser faltante en algunos casos , pero parece funcionar de todos modos (como de la versión 2.7.4).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top