Альтернативы Git for Windows

в 7:55, , рубрики: DVCS, Git, scm, системное администрирование, системы управление версиями, Системы управления версиями, метки:

На данный момент (начало апреля 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%etcskel, как описано в %MSYS2_DIR%etcpost-install5-home-dir.post. Есть возможность настроить папку HOME = %USERPROFILE%. Для этого переместите все файлы из %MSYS2_DIR%home%USERNAME% в %USERPROFILE% и исправьте в файле %MSYS2_DIR%etcnsswitch.conf строку «db_home: cygwin desc» на «db_home: windows desc»

perl -pi.orig -e "s/db_home:s+cygwins+desc/db_home: windows desc/" nsswitch.conf

Если переменная HOME уже есть, то файлы из %MSYS2_DIR%etcskel никуда копироваться не будут. При необходимости, скопируйте их вручную, и/или обновите .bashrc и др. файлы.

4. Установить Git

pacman -S git

Настройка

1. Для добавления автодополнения (по Tab) команд Git и дополнительной информации в command prompt cкопируйте файлы:

%MSYS2_DIR%usrsharegitcompletiongit-completion.bash  -> %HOME%.git-completion.bash
%MSYS2_DIR%usrsharegitcompletiongit-prompt.sh        -> %HOME%.git-prompt.sh

В файл %HOME%.bashrc добавьте строки

. ~/.git-completion.bash
. ~/.git-prompt.sh

PS1='[33]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}07]'    # set window title
PS1="$PS1"'n'                                          # new line
PS1="$PS1"'[33[32m]'                                # change color to green
PS1="$PS1"'u@h '                                      # user@host<space>
PS1="$PS1"'[33[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"'[33[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.

Автор: DmitrySokolov

Источник

Поделиться новостью

* - обязательные к заполнению поля