¿Puede git cambiar automáticamente entre espacios y pestañas?

196

Utilizo pestañas para sangrar en mis programas de Python, pero me gustaría colaborar (usando git) con personas que usan espacios en su lugar.

¿Hay alguna manera para que git convierta automáticamente entre espacios y pestañas (por ejemplo, 4 espacios = 1 pestaña) al presionar / recuperar? (similar a la conversión CR / LF)

Olivier Verdier
fuente
33
PEP8 es precisamente mi problema. Todo el mundo lo sigue y estoy atascado con mis pestañas. Creo que una sangría = una pestaña es lo correcto (¿por qué espacios? ¿Por qué 4 espacios? PEP8 no explica eso ...). De todos modos, con este truco git, puedo usar pestañas en mi computadora y compartir mi código con todos los seguidores de PEP8.
Olivier Verdier
77
Oh! Yo uso TextMate, y puedo convertir entre espacios en pestañas. La cuestión es que, cuando llego a la pestaña, me gusta que mi editor escriba ... pestaña. Entonces, si reviso un proyecto de Python con espacios, insertaré todo tipo de pestañas. Debo convertir manualmente a pestañas, pero cuando me registro, parece que hay 1000 eliminaciones, 1000 adiciones, y mis colaboradores no estarán contentos. :-)
Olivier Verdier
66
La razón por la que PEP8 especifica espacios en lugar de pestañas se debe a las reglas de sangría de continuación. Hay dos formas de continuar una línea demasiado larga dentro de un paréntesis. Si comienza una nueva línea inmediatamente después de un paréntesis, simplemente sangra una. Si, en cambio, coloca parte del contenido del paréntesis en la primera línea, debe continuar entre paréntesis en la línea siguiente en el nivel de sangría del paréntesis de apertura. Si usa pestañas, eso no funciona.
John Christopher Jones
2
@JohnChristopherJones para esa situación, uno podría usar pestañas para hacer coincidir la sangría con la línea anterior y luego espacios para hacer coincidir una posición en la línea anterior. Esto se puede convertir en espacios fácilmente. Desafortunadamente, lo contrario no es cierto, porque combina información de sangría con información de alineación.
Patrick Parker el

Respuestas:

195

Aquí está la solución completa:

En su repositorio, agregue un archivo .git/info/attributesque contenga:

*.py  filter=tabspace

Linux / Unix

Ahora ejecuta los comandos:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

Primero instale coreutils con brew:

brew install coreutils

Ahora ejecuta los comandos:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

Todos los sistemas

Ahora puede consultar todos los archivos de su proyecto. Puedes hacer eso con:

git checkout HEAD -- **

y todos los archivos de python ahora tendrán pestañas en lugar de espacios.

Editar : cambió el comando de pago forzado. Debes comprometer tu trabajo primero, por supuesto.

Olivier Verdier
fuente
1
El filtro limpio no funciona para mí. Cuando hago git add. Recibo un error que dice "error: filtro externo expandir --tabs = 4 - error inicial". Estoy en Windows Eso hace una diferencia?
Jeremy Hicks
2
@ Jeremy: expand / unspand son comandos unix. Tendrá que buscar puertos / equivalentes de Windows o usar algo como Cygwin
Tim
1
He encontrado la versión de trabajo de bast sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik
3
@ Marc-André Buen punto. De hecho, uso las versiones coreutils. (Instalar homebrewy luego ejecutar brew install coreutils).
Olivier Verdier
2
Parece que esto ya no funciona, los filtros no hacen nada por mí. Después del pago, los archivos aún tienen espacios. ¿Algún avance en esto?
Philipp Ludwig
141

Sí, una posible solución es usar un controlador de filtro de atributos git (consulte también el libro GitPro ), para definir un mecanismo de borrón / limpieza.

texto alternativo

De esa manera:

  • cada vez que revisa algunos archivos de su repositorio, los espacios se pueden convertir en pestañas,
  • pero cuando realiza el check-in (y empuja y publica), esos mismos archivos se almacenan nuevamente usando solo espacios.

Puede declarar este controlador de filtro (denominado aquí ' tabspace') en .git/info/attributes(para un filtro aplicado a todos los archivos dentro del repositorio de Git), con el siguiente contenido:

*.py  filter=tabspace

Ahora ejecuta los comandos:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

Vea la respuesta de Olivier para un ejemplo de trabajo concreto de un conjunto de instrucciones tan difuminado / limpio.

VonC
fuente
Desafortunadamente, simplemente no funciona. Seguí todas las instrucciones, pero git no aplica el fiter. :-( Cuando finalizo la compra, el filtro de manchas no se aplica, y cuando realizo el check-in, tampoco sucede nada ... git es tan frustrante a veces ...
Olivier Verdier
@Olivier: Extraño, nunca tuve ningún problema con eso, siempre que limite cuidadosamente el alcance del filtro de atributos (a un subárbol específico, solo para un tipo específico de archivos) para no ralentizar el pago / verificación en proceso. Ver por ejemplo stackoverflow.com/questions/62264/…
VonC
¡Gracias! Ahora funciona. Vea la solución completa: stackoverflow.com/questions/2316677/…
Olivier Verdier
@Vonc: tal vez uno debería quitar la --globalbandera, ya que esto implicaría que debe enviar espacios a cada proyecto de colaboración ...
Willem Van Onsem
@CommuSoft solo para los proyectos que tienen derecho .gitattributes. Pero sí, es más fácil de entender si la configuración se mantiene local para el repositorio. He editado la respuesta.
VonC
39

Información muy útil para todos los que usan GitHub (u otro servicio similar)

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

Entonces tengo dos archivos: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

y attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

Trabajando en proyectos personales

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

De esa manera, cuando finalmente empuje su trabajo en github, no se verá tonto en la vista de código, 8 space tabsque es el comportamiento predeterminado en todos los navegadores.

Contribuyendo a otros proyectos

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin [email protected]:some/repo.git
git pull origin branch

De esa manera puede trabajar con pestañas normales en 2 space indentedproyectos.

Por supuesto, puede escribir una solución similar para la conversión, 4 space to 2 spaceque es el caso si desea contribuir a proyectos publicados por mí y tiende a usar 2 espacios durante el desarrollo.

simo
fuente
2
Relacionado: Almacenar git config como parte del repositorio ; También tenga en cuenta que puede usar (y confirmar) un .gitattributesarchivo en su repositorio
Tobias Kienzler
1

Si está en Windows, tiene algunos pasos adicionales para que la solución de @Olivier Verdier funcione.

  1. Descargar CoreUtils para Windows
  2. Después de la instalación, coloque la ubicación de instalación en su RUTA ( Cómo agregar una variable de ruta )
  3. Cambié el nombre de expand.exe a gexpand.exe ya que ya hay una utilidad de expansión de Windows.
Odyth
fuente