Чи може git автоматично перемикатися між пробілами та вкладками?


196

Я використовую вкладки для відступу у своїх програмах python, але я хотів би співпрацювати (використовуючи git) з людьми, які замість цього використовують пробіли.

Чи є спосіб git автоматично перетворювати між пробілами та вкладками (скажімо, 4 пробіли = 1 вкладка) під час натискання / отримання? (подібне до перетворення CR / LF)


33
PEP8 - це саме моя проблема. Усі слідкують за цим, і я застряг у своїх вкладках. Я думаю, що один відступ = одна вкладка - це правильно робити (чому пробіли? Чому 4 пробіли? PEP8 цього не пояснює ...). У будь-якому випадку, за допомогою цього git хитрості я можу із задоволенням використовувати вкладки на своєму комп’ютері та ділитися своїм кодом з усіма підписниками PEP8.
Олів'є Верд'є,

7
Ой! Я використовую TextMate і можу конвертувати між пробілами вкладки. Справа в тому, що коли я потрапляю на вкладку, мені подобається, що мій редактор пише ... вкладку. Тож якщо я перевіряю проект python з пробілами, я вставляю всілякі вкладки. Я повинен вручну перетворити на вкладки, але коли я зареєструвався, це виглядає як 1000 видалень, 1000 доповнень, і мої співробітники не будуть задоволені. :-)
Олів'є Верд'є,

6
Причина, що PEP8 визначає пробіли замість вкладок, пов’язана з правилами відступу продовження. Є два способи продовжити надмірну лінію всередині дужки. Якщо ви починаєте новий рядок одразу після дужки, ви просто відступ. Якщо ви замість цього помістите частину змісту в дужках на перший рядок, вам доведеться продовжувати дужку в наступному рядку на рівні відступу відкритої дужки. Якщо ви використовуєте вкладки, які не працюють.
Джон Крістофер Джонс

2
@JohnChristopherJones для цієї ситуації можна використовувати вкладки для узгодження відступу з попереднім рядком, а потім пробіли, щоб відповідати позиції в попередньому рядку. Це можна легко перетворити в простори. На жаль, реверс не відповідає дійсності, оскільки він поєднує інформацію про відступи з інформацією про вирівнювання.
Патрік Паркер

Відповіді:


196

Ось повне рішення:

У своєму сховищі додайте файл, .git/info/attributesякий містить:

*.py  filter=tabspace

Linux / Unix

Тепер запустіть команди:

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

ОС X

Спочатку встановіть coreutils з варитися:

brew install coreutils

Тепер запустіть команди:

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

Усі системи

Тепер ви можете перевірити всі файли вашого проекту. Це можна зробити за допомогою:

git checkout HEAD -- **

і всі файли python тепер матимуть вкладки замість пробілів.

Редагувати : змінила команду примусової перевірки. Спершу слід скористатися своєю роботою.


1
Чистий фільтр не працює для мене. Коли я роблю git add. Я отримую помилку: "помилка: розширення зовнішнього фільтра --tabs = 4 - ініціальна помилка". Я в Windows. Це має значення?
Джеремі Хікс

2
@Jeremy: розширювати / розгортати - це команди Unix. Вам доведеться або знайти порти / еквіваленти Windows або використовувати щось на кшталт Cygwin
Tim

1
Я знайшов робочу версію sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik

3
@ Марк-Андре Добре. Я фактично використовую версії coreutils. (Встановіть homebrewта запустіть brew install coreutils).
Олів'є Верд'є

2
Здається, це вже не працює, фільтри для мене нічого не роблять. Після оформлення замовлення у файлах залишаються пробіли. Будь-яке оновлення щодо цього?
Філіп Людвіг

141

Так, одне потенційне рішення - використовувати драйвер фільтра атрибутів git (див. Також книгу GitPro ), щоб визначити механізм розмиття / очищення.

alt текст

Цей шлях:

  • щоразу, коли ви перевіряєте деякі файли репо, пробіли можуть бути перетворені у вкладки,
  • але при реєстрації (та натисканні та публікації) ці самі файли зберігаються назад, використовуючи лише пробіли.

Ви можете оголосити цей драйвер фільтру (названий тут ' tabspace') у .git/info/attributes(для фільтра, застосованого до всіх файлів у Git repo) із таким вмістом:

*.py  filter=tabspace

Тепер запустіть команди:

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

Див Олів'є «пд.ш. відповідь на робочий приклад конкретного такого розмазати / чистий набір інструкцій.


На жаль, це просто не працює. Я дотримувався всіх інструкцій, але git не застосовує фітнес. :-( Під час оформлення замовлення фільтр мазання не застосовується, а коли я перевіряю, нічого не відбувається ... git іноді так засмучує ...
Олів'є Верд'є,

@Olivier: Дивно, я ніколи не мав жодних проблем з цим, доки я ретельно обмежую сферу застосування фільтра атрибутів (певним піддеревом, лише для певного типу файлів), щоб не уповільнити замовлення / перевірку- В процесі. Дивись, наприклад , stackoverflow.com/questions/62264 / ...
VonC

Дякую! Зараз це працює. Дивіться повне рішення: stackoverflow.com/questions/2316677/…
Олів'є Вердіє,

@Vonc: можливо, слід зняти --globalпрапор, оскільки це означає, що ви надсилаєте пробіли для кожного проекту співпраці ...
Віллем Ван Онсем

@CommuSoft лише до проектів, які мають право .gitattributes. Але так, простіше зрозуміти, чи конфігурація зберігається локально для репо. Я відредагував відповідь.
VonC

39

Дуже корисна інформація для всіх, хто користується GitHub (або іншою подібною послугою)

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

Тоді у мене є два файли: attributes

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

і attributes2

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

Робота над особистими проектами

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

Таким чином, коли ви, нарешті, натисніть свою роботу на github, вона не буде виглядати нерозумно в кодовому вигляді 8 space tabs який є поведінкою за замовчуванням у всіх браузерах.

Сприяння іншим проектам

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

Таким чином ви можете працювати з звичайними вкладками 2 space indented проектами.

Звичайно, ви можете написати подібне рішення для конвертації, з 4 space to 2 spaceякого випадок, якщо ви хочете внести свій внесок у опубліковані мною проекти, і ви, як правило, використовуєте 2 пробіли під час розробки.


2
Пов'язане: Зберігання конфігурації git як частини сховища ; також зауважте, що ви можете використовувати (і фіксувати) .gitattributesфайл у вашому репортажі
репортажі Тобіас Кіенцлер

1

Якщо ви перебуваєте у вікні, то у вас є кілька додаткових кроків, щоб змусити рішення @Olivier Verdier працювати.

  1. Завантажте CoreUtils для Windows
  2. Після встановлення помістіть місце встановлення у ваш PATH ( Як додати змінну шляху )
  3. Я перейменований на extension.exe в gexpand.exe, оскільки вже є утиліта розширення Windows.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.