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

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

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

Ответ 1

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

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

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

Ответ 2

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

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'

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

Ответ 3

Очень полезная информация для всех, кто использует 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 [email protected]:some/repo.git
git pull origin branch

Таким образом, вы можете работать с обычными вкладками в проектах 2 space indented.

Конечно, вы можете написать аналогичное решение для преобразования из 4 space to 2 space, которое имеет место, если вы хотите внести свой вклад в проекты, опубликованные мной, и вы, как правило, используете 2 пространства при разработке.