Доступен выпуск распределенной системы управления версиями Git 2.13.0.
Важное оповещение безопасности
Устранена уязвимость, которая позволяла запустить внешние команды при подключении к репозиторию через SSH в режиме git-shell
. В частности, при выполнении git upload-pack --help
запускается интерактивный интерфейс для постраничного просмотра подсказки, из которого можно вызвать произвольные программы на стороне удалённой системы. Подробнее об этом можно прочитать в этом анонсе. Конфигурации, не использующие git-shell
(например, GitHub и GitHub Enterprise) или использующие git-shell
вместе с Gitolite, проблеме не подвержены.
Теперь перейдём к нововведениям.
Распознавание коллизий SHA-1
Добавлен код для выявления в Git-репозиториях известных коллизий в хешах SHA-1, который поможет защититься от возможных атак через подмену репозитория. В дальнейшем планируется избавиться от жёсткой привязки Git от SHA-1 и добавить опциональную поддержку SHA3-256, которая сможет применяться параллельно с SHA-1.
Таким образом, переведённый на SHA3-256 локальный репозиторий сможет взаимодействовать с Git-серверами (как минимум на уровне push
/fetch
), поддерживающими только SHA-1, а пользователи смогут одновременно использовать идентификаторы объектов SHA-1 и SHA3-256.
Новый метод для распознавания коллизий включён по умолчанию и не будет сильно влиять на производительность.
Более удобные шаблоны файловых путей
Расширены возможности по использованию шаблонов файловых путей в командах git. В частности, добавлен сокращённый оператор для исключения путей ^
, который может использоваться вместо выражения :(exclude)
и вместо ранее применяемого сокращения !
, которое требовало экранирования блока кавычками. Например, если раньше для выполнения выборки файлов с расширениями, отличными от .c
, требовалось выполнить:
$ git grep this.is.a src
src/foo.c:this is a C file
src/foo.rb:this is a ruby file
$ git grep this.is.a -- src ':(exclude)*.c'
src/foo.rb:this is a ruby file
или
$ git grep this.is.a -- src ':!*.c'
src/foo.rb:this is a ruby file
то сейчас можно упростить конструкцию до
$ git grep this.is.a -- src :^*.c
src/foo.rb:this is a ruby file
Кроме того, в новой версии представлен оператор :(attr)
, который позволяет выбрать файлы, соответствующие заданному списку атрибутов. Например, для вывода файлов, хранимых в LFS (хранилище больших бинарных данных) можно выполнить:
$ git ls-files
.gitattributes
README
video.mp4
$ git ls-files ':(attr:filter=lfs)'
video.mp4
При желании можно определить и привязать свои атрибуты и комбинировать attr
с другими операторами:
$ echo 'libfoo/ vendored' >>.gitattributes
$ echo 'imported-tool/ vendored' >>.gitattributes
$ git grep -i license -- ':(attr:vendored)'
$ git grep foobar -- ':(exclude,attr:vendored)'
Условная конфигурация
В файлах конфигурации появилась возможность применения условных операторов, через которые можно организовать применение разных опций для разных групп репозиториев путём включения дополнительных блоков конфигурации при наличии определённых файловых путей. Например, можно указать в настройках один email для внутренних рабочих проектов и другой для использования при работе со сторонним открытым кодом, что позволит избежать казусов в случае, если новый репозиторий не был настроен должным образом.
[includeIf "gitdir:~/work/"]
path = .gitconfig-work
[includeIf "gitdir:~/play/"]
path = .gitconfig-play
$ cat ~/.gitconfig-work
[user]
name = Serious Q. Programmer
email = serious.programmer@business.example.com
$ cat ~/.gitconfig-play
[user]
name = Random J. Hacker
email = rmsfan1979@example.com
Прочие изменения в Git 2.13
- В команде
git log
опция--decorate=auto
включена по умолчанию. Теперь коммиты, указывающие непосредственно на ветку или тег, выделяются и выводятся c именем ветки. - Код организации вывода в
git branch
переведён на системуref-filter
, также используемуюgit for-each-ref
иgit tag
. Это позволяет использоватьgit branch --format=
. - В
git branch
,git tag
, иgit for-each-ref
добавлена опция--no-contains
, которая дополняет опцию--contains
. Теперь можно запросить теги или ветки, в которых отсутствует определённая ошибка или исправление. git stash
теперь может работать с сокращёнными файловыми путями.- Специальные названия веток
@{upstream}
,@{u}
, and@{push}
теперь нечувствительны к регистру (часто после ввода@
и{
первая буква команды вводилась как заглавная).
Конечно, это не все изменения в Git 2.13 — всего было приняно более 700 коммитов. С полным списком можно ознакомиться в примечании к выпуску.
Что такое Git?
Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям задним числом используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.
Источник: блог GitHub