Доступно обновление Git 2.13

Git 2.13

Доступен выпуск распределенной системы управления версиями 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