223 votes

Git peut-il basculer automatiquement entre les espaces et les onglets?

J'utilise des tabulations pour l'indentation dans mes programmes python, mais j'aimerais collaborer (en utilisant git) avec des personnes qui utilisent des espaces à la place.

Existe-t-il un moyen pour git de convertir automatiquement entre les espaces et les tabulations (disons, 4 espaces = 1 tabulation) lors de l'extraction / de l'extraction? (similaire à la conversion CR / LF)

212voto

Olivier Verdier Points 12332

Voici la solution:

Dans votre référentiel, ajouter un fichier .git/info/attributes qui contient:

*.py  filter=tabspace

Linux/Unix

Maintenant, exécutez les commandes suivantes:

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

OS X

La première installation de coreutils avec brew:

brew install coreutils

Maintenant, exécutez les commandes suivantes:

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

Tous les systèmes

Vous pouvez maintenant vérifier tous les fichiers de votre projet. Vous pouvez le faire avec:

git checkout HEAD -- **

et tous les fichiers python ont maintenant des onglets à la place des espaces.

Edit: modification de l'forcé commande checkout. Vous devez valider votre travail d'abord, bien sûr.

150voto

VonC Points 414372

Oui, une solution possible est d'utiliser un git attribut pilote de filtre (voir aussi GitPro livre), afin de définir une bavure propre mécanisme.

alt text

De cette façon:

  • chaque fois que vous commander certains fichiers de votre repo, les espaces peuvent être convertis dans des onglets,
  • mais lors de l'enregistrement (et de les pousser et de les publier), ces fichiers sont stockés en arrière en utilisant uniquement des espaces.

Vous pouvez déclarer ce pilote de filtre (nommé ici"tabspace') .git/info/attributes (pour un filtre est appliqué à tous les fichiers dans le repo Git), avec le contenu suivant:

*.py  filter=tabspace

Maintenant, exécutez les commandes suivantes:

git config --global filter.tabspace.smudge 'script_to_make_tabs'
git config --global filter.tabspace.clean 'script_to_make_spaces'

Voir Olivier's réponse pour un béton de travail exemple d'une telle bavure propre jeu d'instructions.

43voto

simo Points 1147

Très des informations utiles pour tous les utilisateurs de GitHub (ou tout autre service similaire)

~/.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

Alors j'ai deux fichiers: attributes

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

et attributes2

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

Travail sur des projets personnels

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

De cette façon, lorsque vous avez enfin pousser votre travail sur github, il ne sera pas l'air stupide, dans la vue de code avec 8 space tabs qui est le comportement par défaut dans tous les navigateurs.

En contribuant à d'autres projets

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

De cette façon, vous pouvez travailler avec la normale pattes 2 space indented des projets.

Vous pouvez bien sûr écrire solution similaire pour la conversion de 4 space to 2 space ce qui est le cas si vous souhaitez contribuer à des projets publiés par moi et vous avez tendance à utiliser 2 espaces en développement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X