tipos tag remove practices etiquetas crear best git patch

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):

  1. apply --reverse , apply --whitespace=nowarn
  2. diff HEAD lugar de diff solo
  3. haga una confirmación ficticia (¡la confirmación funciona sin problema!), use format-patch , elimine la confirmación ficticia, aplique el parche con git-am con o sin -3 , o aplique con git-apply
  4. Tenga el archivo de parche en el directorio local en lugar de uno arriba (agarrando a popotes, aquí)
  5. Revisa las páginas de manual de git-diff, -apply, -format-patch, -am para algo útil
  6. parche con el comando patch linux
  7. ....

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.