После небольшого исследования были обнаружены следующие способы (дистрибутивы) использования Git на платформе Windows.
Git for Windows.
Дистрибутив, предлагаемый на официальном сайте git-scm, основан на проекте MSYS. То есть фактически это портированный на Windows Git плюс некоторое подмножество утилит GNU, необходимое для работы Git.
Из недостатков можно отметить устаревшую версию Git и других GNU утилит. В багтрекере несколько лет висят запросы на обновление утилит (perl, ssh, ...).
Отсутствуют необходимые мне утилиты (rsync, ...). Их приходится заимствовать из проекта MSYS, что не всегда срабатывает (разные версии, иногда несовместимые друг с другом).
В настоящий момент проект переходит на другую базу — MinGW-w64 + MSYS2. Разработчики выложили Developer's Preview версию, но на момент проверки в ней отсутствовала утилита ssh, да и проблема с добавлением других утилит, похоже, останется. Но GNU утилиты обновились до актуальных, особенно perl.
Подборка утилит от проекта MinGW-builds
Эта сборка была обнаружена практически случайно, в процессе поиска более свежей версии GCC. Содержит все необходимые мне утилиты. Но, к сожалению, уже давно не обновляется.
MSYS2
Узнал, что существует независимый проект MSYS2 из сообщений на багтрекере проекта git-for-windows. Из плюсов:
- независимый от MSYS проект,
- использует MinGW-w64,
- использует портированный с Arch Linux менеджер пакетов Pacman (более стабильный и функциональный, в отличие от поделки mingw-get),
- свежие версии утилит,
- присутствует git в пакетах,
- есть 64-битная версия.
Из минусов, наверное, больший размер при установке по-умолчанию, по сравнению с Git for Windows. Но лишние пакеты можно удалить.
EGit/JGit
Реализация Git от Eclipse (на Java). Есть возможность вызывать из командной строки, но требуется MSYS shell, и это скорее proof-of-concept, чем нормальный способ работы.
SmartGit/Hg
Это тоже собственная реализация Git на Java. Нет нормальной возможности работать в командной строке. А так, отличный инструмент, есть Open Source License.
libgit2
Очень многообещающий проект. Делается изначально портируемым, реализация на чистом С. Но пока нет проектов, реализовавших всю функциональность Git (GUI + command line) с помощью только этой библиотеки.
Проекты:
- Git-GUI — альфа версия, нет командной строки.
- Github for windows — использует Git for Windows для командной строки.
Здесь можно также отметить проект posh-git, но, как я понял, он тоже требует, чтобы Git уже был доступен из командной строки.
Cygwin
В отличие от MSYS, реализует (или пытается) полный слой POSIX для приложений. Мне больше импонирует MSYS подход. При использовании он мне показался более тяжеловесным, по сравнению с MSYS.
Итого
Остановился на MSYS2. Понравилось то, что Git сделан в виде пакета (с зависимостями и пр.), а так же наличие свежих GNU утилит, которые легко установить из пакетов.
Далее будут описаны: замечания, появившиеся в процессе эксплуатации, возможные затруднения и пути их решения.
Установка
1. Скачать 32-bit или 64-bit MSYS2. Да, теперь есть и 64-битный Git, замечания о нём ниже.
В имени папки для установки (и пути) не должно пробелов, и должны быть только ASCII символы (ASCII, no accents, spaces nor symlinks, short path). В дальнейшем я буду ссылаться на эту папку как %MSYS2_DIR%.
После окончания установки запустите MSYS2 Shell (Пуск > Все программы > MSYS2).
2. Установить и обновить пакеты MSYS2 (более детально описано здесь, или здесь с картинками):
pacman -Sy
pacman --needed -S bash pacman pacman-mirrors msys2-runtime
Перезапустить MSYS2 Shell и запустить %MSYS2_DIR%\autorebase.bat для 32-битной версии. Далее
pacman -Su
3. Настроить HOME
По умолчанию папка HOME создаётся в %MSYS2_DIR%\home\%USERNAME%, и в неё копируются файлы %MSYS2_DIR%\etc\skel, как описано в %MSYS2_DIR%\etc\post-install\05-home-dir.post. Есть возможность настроить папку HOME = %USERPROFILE%. Для этого переместите все файлы из %MSYS2_DIR%\home\%USERNAME% в %USERPROFILE% и исправьте в файле %MSYS2_DIR%\etc\nsswitch.conf строку «db_home: cygwin desc» на «db_home: windows desc»
perl -pi.orig -e "s/db_home:\s+cygwin\s+desc/db_home: windows desc/" nsswitch.conf
Если переменная HOME уже есть, то файлы из %MSYS2_DIR%\etc\skel никуда копироваться не будут. При необходимости, скопируйте их вручную, и/или обновите .bashrc и др. файлы.
4. Установить Git
pacman -S git
Настройка
1. Для добавления автодополнения (по Tab) команд Git и дополнительной информации в command prompt cкопируйте файлы:
%MSYS2_DIR%\usr\share\git\completion\git-completion.bash -> %HOME%\.git-completion.bash
%MSYS2_DIR%\usr\share\git\completion\git-prompt.sh -> %HOME%\.git-prompt.sh
В файл %HOME%\.bashrc добавьте строки
. ~/.git-completion.bash
. ~/.git-prompt.sh
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
PS1="$PS1"'\n' # new line
PS1="$PS1"'\[\033[32m\]' # change color to green
PS1="$PS1"'\u@\h ' # user@host<space>
PS1="$PS1"'\[\033[33m\]' # change color to yellow
PS1="$PS1"'\w' # current working directory
if test -z "$WINELOADERNOEXEC" ; then
PS1="$PS1"'$(__git_ps1)' # bash function
fi
PS1="$PS1"'\[\033[0m\]' # change color to normal
PS1="$PS1"$'\n' # new line
PS1="$PS1"'$ ' # prompt: always $
Настройка git-prompt (переменная PS1) взята из предыдущих версий Git for Windows.
Обратите внимание на PS1="$PS1"$'\n'. Выражение $'\n' используется для исправления бага
It seems like $() style command substitution for some reason always fails in MSYS2 if a newline is present after it.
2. Документация
Manpages будут установлены пакетом git. Для просмотра понадобится пакет man-db:
pacman -S man-db
И далее, как обычно
man git-add
Документация в формате Html пока отсутствует
git help add
fatal: '/usr/share/doc/git/html': not a documentation directory.
Соответственно, можно попытаться самостоятельно построить её, либо извлечь её из PortableGit архива и скопировать в %MSYS2_DIR%/usr/share/doc/git/html.
Git 32bit vs. 64bit
В процессе эксплуатации 64bit Git обнаружилось повышенное потребление памяти для некоторых команд. Например, git-fast-import при конвертации большого репозитория (порядка 5GiB) легко съедал всю доступную RAM (при отключенном файле подкачки это проявляется в виде системного сообщения о том, что приложению не хватает памяти и предлагается закрыть программу). Для этого же (уже сконвертированного) репозитория TortoiseGit Log не мог отобразить дерево коммитов, а запущенный субпроцесс git опять съедал всю оперативную память.
Для 32bit Git такого не наблюдалось, и все команды, в том числе в связке с различными GUI и IDE работали отлично.
Решил пока использовать Git 32bit.
Комментарии (36)
SerJook
10.04.2015 12:01+11Не понимаю, почему многие опен-сурс разработчики намеренно игнорируют самую популярную ОС.
iborzenkov
10.04.2015 12:06-16потому что тот-же git домохозяйки не используют
OnYourLips
10.04.2015 12:14+4Но большинство разработчиков тоже используют самую популярную ОС ;)
Теперь по теме: перечисленные выше способы не работают вместе с графическими оболочками, которые очень сильно упрощают работу.
Попробуйте какой-нибудь Atlassian SourceTree или простую комбинацию двух кнопок в продуктах JetBrains.
Если эта интеграция нужна, то придется использовать официальный git ~1.9.
Если не нужна, то я бы использовал git на среде исполнения кода.
Правда у меня возникает вопрос: почему Microsoft вкладывает миллионы долларов в поддержку PHP или Node.js на винде, но не хочет нанять кого-то дорабатывать git? Или может быть все проще, и эту помощь не хотят принимать?iborzenkov
10.04.2015 12:22-13среди разработчиков расклад совсем другой, под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты, если идут крупные проекты, то там уже виртуализация, ну или как минимум unix система.
Пробовал графические, вернулся к консольному клиенту — удобнее.
Ой, вот только не надо чтобы майкрософт в git лезла, они там такого говна понаделаютSerJook
10.04.2015 12:33-2Скажу честно, пользовался WAMP, проблем не было, и модулей множество ставил, и Mongo юзал, до тех пор пока не пришлось столкнуться с тормознутым Symfony2, из-за него пришлось перейти на Linux, под виндой оно работало ну ООЧЕНЬ медленно. Но это не проблема винды, а проблема PHP (хотя Symfony2 и под линуксом сливает по скорости всем фреймворкам), т.е. опять же возвращаемся к моему же вопросу.
iborzenkov
10.04.2015 12:45-6Так и запишем, под виндой тормозит :) Хотя я это и так знал, все время у виндовых разработчиков наблюдались эпичные тормоза.
Возвращаясь к вашему вопросу — потому что разработчикам она оказалась нафиг не нужна. Те разработчики которые могут портировать уже давно на linux сидят и на кой им портировать что-то на win?
AmdY
10.04.2015 16:27+1Забавный факт, что если на винду поставить виртуальную машину с linux, то несмотря на оверхед виртуализации всё работает гораздо быстрее. Правда этот кейс работал пару лет назад под W7, не знаю как дела обстоят сейчас.
SerJook
10.04.2015 16:48-1Я тоже так пробовал, но мне хотелось бы чтобы IDE была запущена в винде (из соображений производительности, да и шрифты в PHPStorm на линуксе ужасны, если не использовать OpenJDK), а сервер в виртуалке, однако через Shared Folders виртуалбокса это тоже тормозило :(
kalbas
10.04.2015 18:58+3Юзаю винду как хост-систему и линукс в виртуалке. Pycharm запущен в винде и по сейву файла автоматически кидает этот файл на виртуалку просто по сети. Звучит костыльно, но особых проблем не имею.
synchrone
10.04.2015 12:48+6Как вам сказать… вы несколько опоздали :)
MS вот уже пару лет как активно контрибьютит libgit2iborzenkov
10.04.2015 12:51-9похоже та-же фигня как с их патчими на линукс — костыли для их поделок, впрочем что еще ожидать
iroln
10.04.2015 13:24+2Разработка — это не только сайты. Под Windows работают тысячи разработчиков, которые пишут системное и прикладное ПО под эту платформу для своих клиентов, и этим клиентам не нужен Linux. Такие разработчики зачастую используют корпоративный GitHub или GitLab. Почему они выбрали git — другой вопрос.
Если Git позиционирует себя как самую популярную распределённую СКВ, значит у него должна быть полноценная поддержка всех популярных платформ. От этого все только выиграют.
Mephistophele
10.04.2015 13:30+3под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты
Ох блин, я .Net разработчик работающий на проекте в 250 человеко-лет и не знал… что у нас мелкий сайтец… Печаль-то какая…
OnYourLips
10.04.2015 14:57-2> среди разработчиков расклад совсем другой, под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты, если идут крупные проекты, то там уже виртуализация, ну или как минимум unix система.
Давайте говорить про профессиональных программистов. Естественно код исполняется на правильной ОС с использованием систем виртуализации.
Разрабатывать, выполняя под одной ОС, чтобы потом это работало под дрогой — дилетантство.
> Пробовал графические, вернулся к консольному клиенту — удобнее.
Простейшие операции (застейжить, закомитить, проверить дифф, запушить, смержить в другую ветвь) в консоли делаются в 5-10 строк, а в GUI парой кликов мыши.
SerJook
> Скажу честно, пользовался WAMP, проблем не было
И проектов хотя бы среднего размера тоже не было, где уже используются возможности некоторых ОС, которых нет на других.
> с тормознутым Symfony2, из-за него пришлось перейти на Linux, под виндой оно работало ну ООЧЕНЬ медленно. Но это не проблема винды
Проблема с вашей стороны однозначно была.
DmitrySokolov Автор
10.04.2015 12:27+1А что именно у Вас не работает вместе с графическими оболочками?
Сам использую TortoiseGit + MSYS2 Git. Также все ok в QtCreator + MSYS2 Git.
kekekeks
10.04.2015 12:06+3С наличием нормального терминала в этой ОС проблемы. И с POSIX-совместимостью.
Eklykti
10.04.2015 12:25-3Купи каждому разработчику по лицензии на «самую популярную ОС» — и, может быть, они рассмотрят возможность её официальной поддержки.
vsb
10.04.2015 12:28+2Можно перефразировать — почему многие Windows-разработчики игнорируют опен-сурс :) Никто же не мешает помогать в портировании опен-сурс проектов на Windows. Вот с OS X почему-то проблем никаких нет. Всё работает и прекрасно портировано. По крайней мере я не сталкивался.
Goodkat
10.04.2015 12:33+3OS X — это, всё же, UNIX, портировать на него с GNU/Linux немного проще, чем на Windows.
Eklykti
10.04.2015 12:33С OS X проще, ибо это UNIX и внутри у неё почти такие же POSIX-интерфейсы, как и в линуксе и в других UNIX-подобных ОС.
bushart
10.04.2015 12:48Я не уверен, но думаю, что если провести статистический анализ популярности ОС только среди целевой аудитории Git-а, то Windows покажет совсем другие результаты. Ну и разумееться разработчики GIT ориентируются на свою целивую аудиторию.
vlivyur
17.04.2015 05:49-1Не понимаю, почему многие разработчики с самой популярной ОС игнорируют самые популярные опен-сурс программы. Тут ведь как: если что-то тебе надо — напиши. А у них и так всё работает.
easyman
10.04.2015 12:21+4Ну вот Git 2.3.0 для Windows
www.wandisco.com/wandisco-certified-git-binaries
Непонятно о чем речь, чего автору не хватает.
Если не нравится shell — есть замечательный babun с кучей утилит babun.github.ioDmitrySokolov Автор
10.04.2015 12:47Не смог скачать. При переходе по ссылке что они присылают на email, после предоставления своих данных, выдается HTTP 301, потом 302.
easyman
10.04.2015 12:52У меня все норм, нажимаю в письме save as и все работает. Пруф сейчас в личку кину.
DmitrySokolov Автор
10.04.2015 13:33+1В общем, посмотрел.
Это тот же самый Git for Windows, только с обновленными файлами Git. Проблемы с устаревшими GNU утилитами никуда не делись. В частности, этот дистрибутив использует старый OpenSSH 4.6, у которого есть проблема со скоростью передачи файлов.
easyman
10.04.2015 13:55Файлы wandisco сейчас подписаны без таймстампа, я их проинформировал.
Ответили что они исправят это.
OrdJONY
10.04.2015 12:56А какие новые фичи\исправления есть в версии начиная с 1.9.5?
DmitrySokolov Автор
10.04.2015 13:14+1OrdJONY
10.04.2015 14:05А расскажите что из этого вы используете или планируете использовать?
Я просто обычно пользуюсь GUI Git Extensions и мне его функционала хватает, а с ним как раз и поставляется 1.9.5. В командную строку я практически никогда не использовалDmitrySokolov Автор
10.04.2015 14:14Я, в основном использую командную строку, GUI — только для просмотра лога/дерева коммитов.
Из фич, то что вспомнил:
clone --reference
push.default
GIT_SSH_COMMAND
Ну и кроме фич уже внесено большое количество фиксов. В основном из-за них.
solver
10.04.2015 15:13+1А вы обновляете софт исключительно ради новых функций?
Исправление багов и улучшение работы уже существующих функций совсем не интересует?
dannk
10.04.2015 21:53+1Стоило бы наверное упомянуть, что msys2 (и babun) фактически используют cygwin. А то частенько в сравнительных статьях выглядит так, будто cygwin — это какой-то вымирающий динозавр…
Pilat
11.04.2015 12:22Добавление. В smartgit для windows входит git 1.9.5 ming. И можно заменить его на любой другой. Хотя именно в Windows есть некоторый шанс нарваться на несовместимость русскоязычных имён файлов с некоторыми версиями Git.
xGromMx
Скачать можно еще тут msys2.github.io. Пользуюсь msys2 с настроенным zshell и ohmyzh и очень доволен.