web-dev-qa-db-fra.com

Est-ce que git peut basculer automatiquement entre les espaces et les tabulations?

J'utilise des tabulations pour l'indentation dans mes python programmes), mais j'aimerais collaborer (avec git) avec des personnes utilisant plutôt des espaces.

Existe-t-il un moyen pour git de convertir automatiquement entre les espaces et les onglets (par exemple, 4 espaces = 1 onglet) en poussant/récupérant? (similaire à la conversion CR/LF)

191
Olivier Verdier

Voici la solution complète:

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

*.py  filter=tabspace

Linux/Unix

Maintenant, lancez les commandes:

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

OS X

Commencez par installer les coreutils avec le breuvage:

brew install coreutils

Maintenant, lancez les commandes:

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 consulter tous les fichiers de votre projet. Vous pouvez le faire avec:

git checkout HEAD -- **

et tous les fichiers python vont maintenant avoir des onglets au lieu d'espaces.

Edit: modification de la commande d'extraction forcée. Vous devez bien sûr commencer par engager votre travail.

190
Olivier Verdier

Oui, une solution potentielle consiste à utiliser un pilote de filtre d'attribut git (voir aussi livre GitPro ) pour définir un mécanisme de purification/nettoyage.

alt text

De cette façon:

  • chaque fois que vous extrayez des fichiers de votre repo, les espaces peuvent être convertis en onglets,
  • mais lorsque vous vous enregistrez (et publiez), ces mêmes fichiers sont stockés en utilisant uniquement des espaces.

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

*.py  filter=tabspace

Maintenant, lancez les commandes:

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

Voir Olivier 's answer pour obtenir un exemple de travail concret d'un tel ensemble d'instructions très simples.

133
VonC

Information très utile pour tous ceux qui utilisent GitHub (ou un 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

Ensuite, 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

Travailler sur des projets personnels

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

De cette façon, lorsque vous pousserez enfin votre travail sur github, il n’aura pas l’air idiot en mode code avec 8 space tabs _ qui correspond au comportement par défaut de tous les navigateurs.

Contribuer à d'autres projets

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 cette façon, vous pouvez travailler avec des onglets normaux sur 2 space indented projets.

Bien sûr, vous pouvez écrire une solution similaire pour convertir de 4 space to 2 space _ ce qui est le cas si vous souhaitez contribuer aux projets que je publie et que vous avez tendance à utiliser 2 espaces lors de votre développement.

37
simo

Si vous êtes sur Windows, vous avez quelques étapes supplémentaires pour obtenir la solution @ Olivier Verdier .

  1. Télécharger CoreUtils pour Windows
  2. Après l’installation, placez l’emplacement d’installation dans votre PATH ( Comment ajouter une variable de chemin )
  3. J'ai renommé expand.exe en gexpand.exe car il existe déjà un utilitaire Windows expand.
0
odyth