tag - git-apply falla misteriosamente, ¿cómo soluciono/resuelvo problemas?
git tag best practices (2)
Actualmente estoy intentando realizar una comprobación de estilo de código en los RP de un repositorio (github), y quiero entregar parches a los remitentes con los que pueden corregir fácilmente el estilo de código. Con este fin, estoy desplegando sus relaciones públicas, ejecutando nuestro script no incrustado para corregir cualquier error de estilo, y quiero crear un archivo .patch que puedan aplicar fácilmente. Sin embargo, se rompe constantemente en algunos archivos.
Lo hago (git versión 1.7.10.4 con core.autocrlf=input
, core.filemode=false
):
$ git checkout pr-branch
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean)
$ <run the code styler script, which modifies some files>
$ git diff > ../style.patch (so the patch file lands outside the repo)
$ git reset --hard HEAD (to simulate the situation at the submitter''s end)
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean, so we are where we started)
$ git apply ../style.patch
error: patch failed: somefile.cpp:195
error: somefile.cpp: patch does not apply (same output using the --check option)
Esto solo se aplica a algunos archivos, no a todos. No sé cómo solucionar este problema, es decir, cómo conseguir que git me diga exactamente dónde está mal, solo me dice un trozo cuando cavo, pero todavía es bastante grande.
Lo que he probado hasta ahora (sin éxito):
-
apply --reverse
,apply --whitespace=nowarn
-
diff HEAD
lugar dediff
solo - haga una confirmación ficticia (¡la confirmación funciona sin problema!), use
format-patch
, elimine la confirmación ficticia, aplique el parche congit-am
con o sin-3
, o aplique congit-apply
- Tenga el archivo de parche en el directorio local en lugar de uno arriba (agarrando a popotes, aquí)
- Revisa las páginas de manual de git-diff, -apply, -format-patch, -am para algo útil
- parche con el comando
patch
linux - ....
No sé qué podría estar mal con el diff. Las cosas en el espacio en blanco solo deberían advertir, ¿verdad? En cualquier caso, no querré ignorarlos, ya que es una corrección de estilo que obviamente implica espacios en blanco.
¿Cómo puedo solucionar / diagnosticar esto o incluso averiguar dónde se puede descargar exactamente? ¿Ayudaría si publico el diff de uno de los archivos culpables? Lo que me desconcierta también es que el compromiso funciona sin problemas, pero el parche creado a partir del compromiso no?
Después de luchar con esto por varias horas estoy al final de mi conocimiento ...
Intente verificar su archivo de parche, por ejemplo:
git apply --reject mypatch.patch
esto te mostrará las diferencias, si las hay, aquí hay un ejemplo de cómo podría verse:
error: patch failed: <filename>:<linenumber>
error: while searching for :
cout << "}" << endl; // example of a line in your patch
Actualizar:
Puede usar git apply -v
para ver información más detallada sobre lo que está sucediendo, git apply --check
para solo verificar la operación, o git apply --index
para reconstruir el archivo de índice local.
Según su comentario, parece que su índice local se corrompió, y así el index
resolvió.
Dejaré mi respuesta original y los comentarios principalmente para dar a las personas un contexto de lo que estaba sucediendo, ya que sospecho que otras personas saltarían a las mismas conclusiones iniciales que había basado en la descripción del problema.
------
Lo más probable es que no haya nada de malo en la diferencia. En su lugar, mira el repositorio de git de destino. Mientras está haciendo git reset --hard HEAD
, nada le garantiza que la HEAD
en ese otro repositorio sea igual a la HEAD
en su.
Haz git log
en el repositorio de destino y mira la confirmación en la parte superior. ¿Es el mismo que el que produjo la diferencia? Lo más probable es que no lo sea. Mire hacia abajo en el historial y verifique si existe el compromiso que necesita. Si es así, entonces el repositorio objetivo está por delante del tuyo, y debes retroceder, hacer git pull
(o git rebase
) y producir un nuevo diff. Si no lo está, entonces el repositorio objetivo está detrás del tuyo, y necesitas hacer git pull
(o git rebase
) en el repositorio objetivo para ponerlo al día.
Tenga en cuenta que si tiene otras personas que se comprometen con su repositorio "maestro" (del que botan los suyos y los repositorios de destino), es posible que tenga que ir a git pull
ambos repositorios para lograr un compromiso común razonablemente reciente.