На данный момент (начало апреля 2015) «официальная» версия Git для Windows — 1.9.5, в то время как для всех остальных платформ уже доступна версия 2.3.5. Отсюда и естественный интерес к обновлению Git for Windows до актуальной версии или замене его на альтернативный дистрибутив.

После небольшого исследования были обнаружены следующие способы (дистрибутивы) использования 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)


  1. xGromMx
    10.04.2015 11:04
    +1

    Скачать можно еще тут msys2.github.io. Пользуюсь msys2 с настроенным zshell и ohmyzh и очень доволен.


  1. SerJook
    10.04.2015 12:01
    +11

    Не понимаю, почему многие опен-сурс разработчики намеренно игнорируют самую популярную ОС.


    1. iborzenkov
      10.04.2015 12:06
      -16

      потому что тот-же git домохозяйки не используют


      1. OnYourLips
        10.04.2015 12:14
        +4

        Но большинство разработчиков тоже используют самую популярную ОС ;)

        Теперь по теме: перечисленные выше способы не работают вместе с графическими оболочками, которые очень сильно упрощают работу.
        Попробуйте какой-нибудь Atlassian SourceTree или простую комбинацию двух кнопок в продуктах JetBrains.

        Если эта интеграция нужна, то придется использовать официальный git ~1.9.
        Если не нужна, то я бы использовал git на среде исполнения кода.

        Правда у меня возникает вопрос: почему Microsoft вкладывает миллионы долларов в поддержку PHP или Node.js на винде, но не хочет нанять кого-то дорабатывать git? Или может быть все проще, и эту помощь не хотят принимать?


        1. iborzenkov
          10.04.2015 12:22
          -13

          среди разработчиков расклад совсем другой, под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты, если идут крупные проекты, то там уже виртуализация, ну или как минимум unix система.

          Пробовал графические, вернулся к консольному клиенту — удобнее.

          Ой, вот только не надо чтобы майкрософт в git лезла, они там такого говна понаделают


          1. SerJook
            10.04.2015 12:33
            -2

            Скажу честно, пользовался WAMP, проблем не было, и модулей множество ставил, и Mongo юзал, до тех пор пока не пришлось столкнуться с тормознутым Symfony2, из-за него пришлось перейти на Linux, под виндой оно работало ну ООЧЕНЬ медленно. Но это не проблема винды, а проблема PHP (хотя Symfony2 и под линуксом сливает по скорости всем фреймворкам), т.е. опять же возвращаемся к моему же вопросу.


            1. iborzenkov
              10.04.2015 12:45
              -6

              Так и запишем, под виндой тормозит :) Хотя я это и так знал, все время у виндовых разработчиков наблюдались эпичные тормоза.

              Возвращаясь к вашему вопросу — потому что разработчикам она оказалась нафиг не нужна. Те разработчики которые могут портировать уже давно на linux сидят и на кой им портировать что-то на win?


            1. AmdY
              10.04.2015 16:27
              +1

              Забавный факт, что если на винду поставить виртуальную машину с linux, то несмотря на оверхед виртуализации всё работает гораздо быстрее. Правда этот кейс работал пару лет назад под W7, не знаю как дела обстоят сейчас.


              1. SerJook
                10.04.2015 16:48
                -1

                Я тоже так пробовал, но мне хотелось бы чтобы IDE была запущена в винде (из соображений производительности, да и шрифты в PHPStorm на линуксе ужасны, если не использовать OpenJDK), а сервер в виртуалке, однако через Shared Folders виртуалбокса это тоже тормозило :(


                1. kalbas
                  10.04.2015 18:58
                  +3

                  Юзаю винду как хост-систему и линукс в виртуалке. Pycharm запущен в винде и по сейву файла автоматически кидает этот файл на виртуалку просто по сети. Звучит костыльно, но особых проблем не имею.


          1. synchrone
            10.04.2015 12:48
            +6

            Как вам сказать… вы несколько опоздали :)

            MS вот уже пару лет как активно контрибьютит libgit2


            1. iborzenkov
              10.04.2015 12:51
              -9

              похоже та-же фигня как с их патчими на линукс — костыли для их поделок, впрочем что еще ожидать


          1. iroln
            10.04.2015 13:24
            +2

            Разработка — это не только сайты. Под Windows работают тысячи разработчиков, которые пишут системное и прикладное ПО под эту платформу для своих клиентов, и этим клиентам не нужен Linux. Такие разработчики зачастую используют корпоративный GitHub или GitLab. Почему они выбрали git — другой вопрос.

            Если Git позиционирует себя как самую популярную распределённую СКВ, значит у него должна быть полноценная поддержка всех популярных платформ. От этого все только выиграют.


          1. Mephistophele
            10.04.2015 13:30
            +3

            под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты


            Ох блин, я .Net разработчик работающий на проекте в 250 человеко-лет и не знал… что у нас мелкий сайтец… Печаль-то какая…


          1. OnYourLips
            10.04.2015 14:57
            -2

            > среди разработчиков расклад совсем другой, под виндой и какой-то сборкой XAMP или подобного клепают мелкие сайты, если идут крупные проекты, то там уже виртуализация, ну или как минимум unix система.
            Давайте говорить про профессиональных программистов. Естественно код исполняется на правильной ОС с использованием систем виртуализации.
            Разрабатывать, выполняя под одной ОС, чтобы потом это работало под дрогой — дилетантство.

            > Пробовал графические, вернулся к консольному клиенту — удобнее.
            Простейшие операции (застейжить, закомитить, проверить дифф, запушить, смержить в другую ветвь) в консоли делаются в 5-10 строк, а в GUI парой кликов мыши.

            SerJook
            > Скажу честно, пользовался WAMP, проблем не было
            И проектов хотя бы среднего размера тоже не было, где уже используются возможности некоторых ОС, которых нет на других.

            > с тормознутым Symfony2, из-за него пришлось перейти на Linux, под виндой оно работало ну ООЧЕНЬ медленно. Но это не проблема винды
            Проблема с вашей стороны однозначно была.


        1. DmitrySokolov Автор
          10.04.2015 12:27
          +1

          А что именно у Вас не работает вместе с графическими оболочками?

          Сам использую TortoiseGit + MSYS2 Git. Также все ok в QtCreator + MSYS2 Git.


    1. kekekeks
      10.04.2015 12:06
      +3

      С наличием нормального терминала в этой ОС проблемы. И с POSIX-совместимостью.


    1. Eklykti
      10.04.2015 12:25
      -3

      Купи каждому разработчику по лицензии на «самую популярную ОС» — и, может быть, они рассмотрят возможность её официальной поддержки.


    1. vsb
      10.04.2015 12:28
      +2

      Можно перефразировать — почему многие Windows-разработчики игнорируют опен-сурс :) Никто же не мешает помогать в портировании опен-сурс проектов на Windows. Вот с OS X почему-то проблем никаких нет. Всё работает и прекрасно портировано. По крайней мере я не сталкивался.


      1. Goodkat
        10.04.2015 12:33
        +3

        OS X — это, всё же, UNIX, портировать на него с GNU/Linux немного проще, чем на Windows.


      1. Eklykti
        10.04.2015 12:33

        С OS X проще, ибо это UNIX и внутри у неё почти такие же POSIX-интерфейсы, как и в линуксе и в других UNIX-подобных ОС.


    1. bushart
      10.04.2015 12:48

      Я не уверен, но думаю, что если провести статистический анализ популярности ОС только среди целевой аудитории Git-а, то Windows покажет совсем другие результаты. Ну и разумееться разработчики GIT ориентируются на свою целивую аудиторию.


    1. vlivyur
      17.04.2015 05:49
      -1

      Не понимаю, почему многие разработчики с самой популярной ОС игнорируют самые популярные опен-сурс программы. Тут ведь как: если что-то тебе надо — напиши. А у них и так всё работает.


  1. easyman
    10.04.2015 12:21
    +4

    Ну вот Git 2.3.0 для Windows
    www.wandisco.com/wandisco-certified-git-binaries

    Непонятно о чем речь, чего автору не хватает.
    Если не нравится shell — есть замечательный babun с кучей утилит babun.github.io


    1. DmitrySokolov Автор
      10.04.2015 12:47

      Не смог скачать. При переходе по ссылке что они присылают на email, после предоставления своих данных, выдается HTTP 301, потом 302.


      1. easyman
        10.04.2015 12:52

        У меня все норм, нажимаю в письме save as и все работает. Пруф сейчас в личку кину.


        1. DmitrySokolov Автор
          10.04.2015 13:33
          +1

          В общем, посмотрел.
          Это тот же самый Git for Windows, только с обновленными файлами Git. Проблемы с устаревшими GNU утилитами никуда не делись. В частности, этот дистрибутив использует старый OpenSSH 4.6, у которого есть проблема со скоростью передачи файлов.


    1. Corpsee
      10.04.2015 13:20
      +2

      За Babun огромное спасибо.


    1. easyman
      10.04.2015 13:55

      Файлы wandisco сейчас подписаны без таймстампа, я их проинформировал.
      Ответили что они исправят это.


  1. OrdJONY
    10.04.2015 12:56

    А какие новые фичи\исправления есть в версии начиная с 1.9.5?


    1. DmitrySokolov Автор
      10.04.2015 13:14
      +1

      На хабре обзоры были:
      v2.3
      v2.0


      1. OrdJONY
        10.04.2015 14:05

        А расскажите что из этого вы используете или планируете использовать?
        Я просто обычно пользуюсь GUI Git Extensions и мне его функционала хватает, а с ним как раз и поставляется 1.9.5. В командную строку я практически никогда не использовал


        1. DmitrySokolov Автор
          10.04.2015 14:14

          Я, в основном использую командную строку, GUI — только для просмотра лога/дерева коммитов.

          Из фич, то что вспомнил:
          clone --reference
          push.default
          GIT_SSH_COMMAND

          Ну и кроме фич уже внесено большое количество фиксов. В основном из-за них.


        1. solver
          10.04.2015 15:13
          +1

          А вы обновляете софт исключительно ради новых функций?
          Исправление багов и улучшение работы уже существующих функций совсем не интересует?


  1. dannk
    10.04.2015 21:53
    +1

    Стоило бы наверное упомянуть, что msys2 (и babun) фактически используют cygwin. А то частенько в сравнительных статьях выглядит так, будто cygwin — это какой-то вымирающий динозавр…


  1. Pilat
    11.04.2015 12:22

    Добавление. В smartgit для windows входит git 1.9.5 ming. И можно заменить его на любой другой. Хотя именно в Windows есть некоторый шанс нарваться на несовместимость русскоязычных имён файлов с некоторыми версиями Git.