Представлен релиз распределенной системы управления исходными текстами Git 2.4.0. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям задним числом используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Из проектов, разрабатываемых с использованием Git, можно отметить ядро Linux, Android, LibreOffice, Systemd, X.Org, Wayland, Mesa, Gstreamer, Wine, Debian, DragonFly BSD, Perl, Eclipse,GNOME, KDE, Qt, Ruby on Rails, PostgreSQL, VideoLAN, PHP, Xen, Minix.
По сравнению с прошлым выпуском в новую версию принято 426 изменений, подготовленных при участии 76 разработчиков, из которых 25 впервые приняли своё участие в разработке. В новом выпуске представлены в основном исправления ошибок и мелкие улучшения, значительные изменения отсутствуют. Основные изменения:
- Поддержка атомарных операций "git push", применение которых активируется опцией "--atomic". Атомарный push полезен при необходимости отправки сразу нескольких веток на внешний сервер. В обычных условиях часть обновлений может пройти нормально, но некоторые обновления могут не пройти, например, когда другой разработчик отправил в тот же репозиторий свою ветку. В этом случае потребуется откорректировать вносимые изменения в соответствие с кодом, который успел отправить другой разработчик.
Опция "--atomic" даёт возможность отправить несколько веток атомарно как единое целое, так что либо все из перечисленных веток будут приняты, либо все отвергнуты. Например: "git push --atomic origin branch1 branch2". Подобное поведение особенно востребовано в автоматизированных системах непрерывной интеграции - после добавления очередной порции изменений, если проверка прошла успешно, прошедшая тестирование ветка с изменениями переливается в ветку master, создаётся новый тег и примечание к коммиту. Все эти три шага теперь можно выполнить атомарно с гарантией того, что все они будут выполнены: "git push --atomic origin master refs/tags/release-17 refs/notes/test-results".
- Улучшены средства развёртывания кода командой push (Push-to-deploy), которые часто применяются web-разработчиками для размещения новой версии своего проекта на сервере.
- Реализован перехватывающий вызов push-to-checkout, который может быть установлен на сервере для задания собственного поведения в ситуации выполнения операции push для ветки после checked-out. По умолчанию если на сервере в рабочем дереве уже были изменения при выполнении подобной push-операции выводится ошибка. Установка своего обработчика позволяет попытаться выполнить слияние нового содержимого ветки с другими редакциями ветки на стороне сервера или принудительно заменить локальные изменения изначальным содержимым ветки.
- Реализована возможность выполнения Push-to-deploy для только что инициализированного пустого репозитория на сервере, на котором ещё не было коммитов (в обычных условиях операция push в пустой репозиторий не работала корректно).
- Релизация инвертированного поиска по логам. Для фильтрации вывода команды "git log" доступны такие команды, как "--grep", "--author", "--committer", "--grep-reflog", которые позволяют достаточно точно отсеять соответствующие маске записи в логе коммитов. Новая опция "--invert-grep" позволяет вывести только то, то не попало под заданную маску. Например, для вывода записей в которых отсутствует аннотация "Fixes": "git log --all --merges --invert-grep --grep=Fixes";
- В команде "git log" пока нет возможности комбинировании опций выборки по маске в произвольные выражения, например, "соответствует А и Б, но не В". Но благодаря опции "--invert-grep" подобные выражения теперь можно симулировать через конвейерную обработку результатов нескольких команд "git log". Например, если нужно найти не приведшие к слияниям коммиты в ветке master, выполненные Иваном Ивановым, для которых не указаны строки "Signed-off-by":
git rev-list --no-merges --author="Junio C Hamano" master | git log --stdin --no-walk --invert-grep --grep='^Signed-off-by:'
Чтобы дополнительно исключить из вывода отменённые коммиты и посчитать сколько коммитов осталось:
$ git rev-list --no-merges --author="Junio C Hamano" master | git rev-list --stdin --no-walk --invert-grep --grep='^Signed-off-by:' | git rev-list --stdin --no-walk --invert-grep --grep='^Revert ' | wc -l
- В команду "git status" добавлена возможность указания опции "--verbose" дважды. В этой ситуации будут показаны данные не только по коммитам, но и по изменениям, ожидающим коммита;
- Команда "git log --decorate", при которой помимо обычных данных из лога показываются связанные с ними имена веток, теперь выводит информацию не только о текущей ветке HEAD, но о том, на какую ветку она ссылается (HEAD -> master);
- Новый параметр конфигурации push.followTags, включающие по умолчанию применение опции "--follow-tags" в команде "git push";
- В транспорте на базе HTTP при запросах реализована отправка заголовка Accept-Language, что позволяет организовать вывод сообщений сервера на языке, отличном от английского.