Может ли git автоматически переключаться между пробелами и табуляцией?

196

Я использую вкладки для отступов в моих программах на Python, но я бы хотел сотрудничать (используя git) с людьми, которые вместо этого используют пробелы.

Есть ли способ для git автоматически конвертировать между пробелами и табуляциями (скажем, 4 пробела = 1 табуляция) при нажатии / извлечении? (аналогично преобразованию CR / LF)

Оливье Вердиер
источник
33
PEP8 - это как раз моя проблема. Все следуют за этим, и я застрял с моими вкладками. Мне кажется, что один отступ = одна вкладка - это то, что нужно (почему пробелы? Почему 4 пробела? PEP8 этого не объясняет ...). В любом случае, с помощью этого трюка, я могу с радостью использовать вкладки на своем компьютере и делиться своим кодом со всеми последователями PEP8.
Оливье Вердиер
7
Ой! Я использую TextMate, и я могу конвертировать между пробелами во вкладки. Дело в том, что когда я нажимаю на вкладку, мне нравится, когда мой редактор пишет ... tab. Так что, если я извлечу проект с пробелами на Python, я вставлю все виды вкладок. Я должен вручную преобразовать в закладки, но когда я регистрируюсь, это выглядит как 1000 удалений, 1000 добавлений, и мои соавторы не будут счастливы. :-)
Оливье Вердиер
6
Причина, по которой PEP8 определяет пробелы вместо вкладок, связана с правилами отступа продолжения. Есть два способа продолжения слишком длинной строки в скобках. Если вы начинаете новую строку сразу после скобки, вы просто делаете отступ. Если вместо этого вы поместите часть содержимого круглой скобки в первую строку, вам придется продолжить круглую скобку в следующей строке на уровне отступа открывающей круглой скобки. Если вы используете вкладки, которые не работают.
Джон Кристофер Джонс
2
@JohnChristopherJones для этой ситуации можно использовать вкладки для сопоставления отступа с предыдущей строкой, а затем пробелы для сопоставления с позицией в предыдущей строке. Это может быть легко преобразовано в пространство. К сожалению, обратное неверно, поскольку оно объединяет информацию об отступах с информацией о выравнивании.
Патрик Паркер

Ответы:

195

Вот полное решение:

В вашем хранилище добавьте файл, .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'

OS X

Сначала установите coreutils с помощью brew:

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
Чистый фильтр не работает для меня. Когда я делаю мерзавец добавить. Я получаю сообщение об ошибке «ошибка: расширение внешнего фильтра --tabs = 4 --ininial failed». Я на Windows. Это имеет значение?
Джереми Хикс
2
@Jeremy: раскрыть / развернуть - это команды Unix. Вам придется либо найти порты / эквиваленты для Windows, либо использовать что-то вроде Cygwin
Тим
1
Я нашел
лучшую
3
@ Марк-Андре Хороший вопрос. Я на самом деле использую версии coreutils. (Установить homebrew, а затем запустить brew install coreutils).
Оливье Вердиер
2
Кажется, это больше не работает, фильтры ничего не делают для меня. После оформления в файлах остаются пробелы. Любое обновление по этому поводу?
Филипп Людвиг
141

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

альтернативный текст

Туда:

  • каждый раз, когда вы извлекаете какие-либо файлы вашего репо, пробелы можно конвертировать во вкладки,
  • но когда вы регистрируетесь (и нажимаете и публикуете), те же самые файлы сохраняются с использованием только пробелов.

Вы можете объявить этот драйвер фильтра (названный здесь ' tabspace') в .git/info/attributes(для фильтра, применяемого ко всем файлам в репозитории Git) со следующим содержимым:

*.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'

См Оливье «s ответ на рабочий пример конкретного такого размазать / чистый набор инструкций.

VonC
источник
К сожалению, это просто не работает. Я следовал всем инструкциям, но мерзавец не применяет установщик. :-( Когда я проверяю, фильтр пятен не применяется, и когда я проверяю, ничего не происходит ... мерзавец иногда так расстраивает ...
Оливье Вердиер
@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 config как часть репозитория ; Также обратите внимание, что вы можете использовать (и зафиксировать) .gitattributesфайл в своем
репозитории
1

Если вы работаете в Windows, у вас есть несколько дополнительных шагов, чтобы заставить работать решение @Olivier Verdier .

  1. Скачать CoreUtils для Windows
  2. После установки поместите место установки в ваш путь ( как добавить переменную пути )
  3. Я переименовал expand.exe в gexpand.exe, так как уже есть утилита расширения Windows.
odyth
источник