2011-02-19 42 views
11

¿Cómo lidian las personas con diferentes shebangs entre locales y remotos?Git: cómo lidiar con diferentes shebang

Por ejemplo, mi python local es/usr/bin/python, mientras que mi servidor web es un python especialmente diseñado en ~/local/bin/python. Un desarrollador principal puede tener ruby ​​en/usr/bin/ruby, mientras que el mío es/usr/local/bin/ruby.

Edito manualmente el shebang, pero luego lo marca como un cambio. Idealmente, me gustaría que git ignore la primera línea del archivo, o que ignore una coincidencia de expresiones regulares dentro del archivo.

Me parece que este debe ser un problema muy común, pero no puedo encontrar ninguna mención al mismo.

Uso git, pero yo no me llamaría un experto de ninguna manera.

+5

¿No es eso para lo que es '#!/Usr/bin/env python'? – coreyward

+0

@coreyward: Ver [esta pregunta] (http://unix.stackexchange.com/q/29608/10454) y [mi respuesta] (http://unix.stackexchange.com/a/29620/10454) para un discusión de las ventajas y desventajas del hack '#!/usr/bin/env'. –

Respuesta

18

cambiarlo a

#!/usr/bin/env python 

o

#!/usr/bin/env ruby 

Entonces que debería funcionar en todos los sistemas, siempre que disponga de Python y Ruby en su variable de entorno PATH.

+0

La RUTA es el problema. Tengo un pitón personalizado en ~/local/bin/python en mi servidor web. No puedo cambiar la RUTA para el servidor web ya que no tengo root. Es un poco molesto tener que cambiar el shebang cada vez que hago un tirón o un empujón. –

+0

[continuado ...] Creo que mi verdadera pregunta fue "se puede hacer atómico a nivel de línea" y la respuesta es "no, es atómico a nivel de archivo". –

+0

Probablemente no necesites root. ¿Cómo estás ejecutando el script? ¿Línea de comando? A través de una página web? ¿Via Cron? – Mikel

0

Esto pertenece en los comentarios, pero aún no tengo suficiente reputación ... Usted podría simplemente eliminar el hash bang y ejecutarlo siempre con python cuando lo ejecuta desde la línea de comandos ... tal vez ...

3

La solución a su problema es la regla de filtro de manchas/limpieza de git. Esto le permite configurar filtros que modificarán los archivos en el proceso de pago y deshará esos cambios al registrarse. He aquí un gráfico agradable:

enter image description here

Primero configure una los filtros que pueden hacer el cambio en ambas direcciones, añadiendo algo así como lo siguiente para que .git/config. El filtro de manchas transforma el archivo en el repositorio en la copia de trabajo, el filtro limpio lo deshace. Es importante que la ejecución de la mancha -> clean produzca exactamente el archivo original. Los filtros que se dan aquí sustituirá a la primera línea con #!~/local/bin/python en la copia de trabajo si es #!/usr/bin/env python en el repositorio

[filter "pyshebang"] 
    smudge = sed '1s?^#!/usr/bin/env python$?#!~/local/bin/python?' 
    clean = sed '1s?^#!~/local/bin/python$?#!/usr/bin/env python?' 

Ahora activar este filtro añadiendo una línea como esta en .git/detalles/atributos (crear ese archivo si no existe):

*.py filter=pyshebang 

Si los archivos de pitón no terminan en .py, simplemente configurar el filtro en los archivos correctos/a/carpeta completa de todos los archivos. Si configura el filtro correctamente, solo cambiará los archivos con un shebang python.

Yo recomendaría leer en smudge filters, para entender los detalles de lo que está pasando.

+0

¿Por qué el voto a favor? – Chronial

Cuestiones relacionadas