Может ли git автоматически переключаться между пробелами и табуляцией? - PullRequest
186 голосов
/ 23 февраля 2010

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

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

Ответы [ 4 ]

189 голосов
/ 23 февраля 2010

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

Добавьте в свой репозиторий файл .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 теперь будут иметь табуляции вместо пробелов.

Редактировать : изменена команда принудительной проверки. Конечно, вы должны сначала выполнить свою работу.

129 голосов
/ 23 февраля 2010

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

alt text

Таким образом:

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

Вы можете объявить этот драйвер фильтра (названный здесь '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'

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

37 голосов
/ 07 февраля 2013

Очень полезная информация для всех, кто пользуется 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 пробела при разработке.

1 голос
/ 19 мая 2018

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

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