Надежный путь разработки в git с подписями

Я хотел бы построить надежный путь для разработки программного обеспечения. Это означает, что каждое изменение кода должно быть подписано автором и одним рецензентом, прежде чем оно будет принято. Эти подписи для изменений должны быть проверены во время выпуска, или должны быть какие-то другие средства, чтобы убедиться, что репозиторий не был подделан, или должны быть добавлены дополнительные изменения.

Система контроля версий, которую я собираюсь использовать для этого, - это git, но возможны и другие варианты. Подписание может осуществляться через сертификаты GnuPG или SSL.

Я думаю, что рабочий процесс будет примерно таким:

  1. Текущая проверенная магистраль разветвлена
  2. Изменения вносятся в ветку одним или несколькими разработчиками.
  3. Один или несколько разработчиков подписывают изменения, внесенные веткой
  4. Рецензент просматривает и тестирует изменения
  5. Рецензент подписывает изменения, внесенные веткой
  6. Филиал «объединен» с текущим проверенным стволом

Слияние не должно быть надежным, например, непроверенные изменения должны быть не объединяемыми в ствол - просто перед выпуском должен быть способ проверить, есть ли какие-либо непроверенные (неподписанные) изменения в стволе. И вообще, вмешательство не нужно предотвращать, а только обнаруживать.

Я хотел бы получить краткое руководство о том, как это настроить и как выполняется каждая операция. Как только я получу несколько указателей, я сам смогу разобраться в деталях.

Кроме того, я уже знаю о git tag -s технически, но не знаю, как применить его к этой конкретной проблеме.


person Nakedible    schedule 11.03.2010    source источник
comment
Пока не было никаких конкретных ответов, раскрывающих всю историю, поэтому я оставляю ее открытой. Я сам пробую некоторые возможности, и если у меня будет конкретный вариант, я опубликую здесь ответ.   -  person Nakedible    schedule 12.03.2010


Ответы (3)


Изменения не будут подписаны, пока вы не отметите их. Все, что до этого момента, может быть проверено автором или другим внеполосным механизмом, но не из git.

git может проверить правильность наследия изменения, но только подписанный тег может проверить правильность самого изменения.

Что касается вашего рабочего процесса, вы можете просто заметить, что много тегов.

person Dustin    schedule 11.03.2010
comment
Конкретное решение, видимо, придется искать самому. - person Nakedible; 04.09.2010
comment
@Nakedible Обратите внимание, что с Git 1.7.9 отдельные коммиты могут быть подписаны с помощью -S. А подписи можно просмотреть с помощью параметра --show-signature в git log. - person Petr; 31.01.2013
comment
Спасибо за информацию. Однако может показаться, что -S работает только при выполнении фиксации, и фиксации не могут быть подписаны позже. Однако я надеюсь, что ошибаюсь в этом. - person Nakedible; 08.02.2013
comment
вы можете подписать после этого, но вам нужно перебазировать затем поверх этого коммита, так как подписание изменяет хэш коммита, и его необходимо распространить для всех следующих коммитов. это неудобно для старых коммитов, так как вы, вероятно, уже куда-то их отправили, поэтому вам нужно заменить их на пультах дистанционного управления. однако это также означает, что подпись действительна для всех будущих коммитов, вы можете отслеживать целостность репо, имея одну подпись для разных ветвей разработки. - person Cyryl Płotnicki; 17.11.2013

Вы можете подписать свой тег с помощью ключа GPG с параметром -s в теге git tag -s v0.1.0:

-s

   Make a GPG-signed tag, using the default e-mail address's key

Но вы не можете подписать коммит.

person shingara    schedule 11.03.2010
comment
Как я уже сказал в своем первоначальном вопросе, я уже знаю параметр -s в теге git, но это не решает всей проблемы. - person Nakedible; 11.03.2010
comment
добавление этого комментария также сюда; на самом деле, начиная с git v1.7.9, можно подписать GPG любой коммит, который вы хотите. используйте git commit -S для этого - person Cyryl Płotnicki; 17.11.2013

Git - хороший кандидат, поскольку:

  • каждый коммит уже подписан
  • ключа SHA1 для каждой фиксации достаточно, чтобы быть уверенным, что репо all не было изменено
  • git tag -s можно использовать для подписания фиксации, которую кто-то не делал (_ 1_ более откровенно)

So:

  1. Current verified trunk is branched
    git checkout -b tag_for_last_verified_trunk_content test # branch test
  2. Changes are developed in the branch by one or more developers
    [work...] git commit -s -m "dev1 comment" ...
  3. Один или несколько разработчиков подписывают изменения, внесенные веткой

    Они уже сделали свои коммиты, добавив строку с подписью в конце сообщения о фиксации: см. объяснение процесса подписки.

    Signed-off-by: user name 
  4. Рецензент просматривает и тестирует изменения

     git tag -m "testing" testing # refer to current commit, 
                                    allowing dev to go on with further changes
  5. Reviewer signs the changes made by the branch
    git tag -m "tested" tested testing # put a tag on the same SHA1 than 
                                         the "testing" tag
  6. Branch is "merged" in to current verified trunk
    git checkout trunk & git merge tested

Кирилл Плотницки-Чудык упоминает в комментариях, что, начиная с git 1.7.9 (январь 2012 года, почти через 2 года после этого ответа), вы можете подписать GPG любой коммит, который вы хотите, используя git commit -S.
(См. commit ba3c69a9, уточнено подробнее недавно в совершить df45cb3)

person VonC    schedule 11.03.2010
comment
Я не понимаю вашего объяснения. Как каждый коммит уже подписан? Конечно, фиксация содержит SHA1 для всего репо, но ничто не говорит о том, что фиксация была сделана автором, указанным в фиксации. Мне неизвестны какие-либо цифровые подписи для фиксации? - person Nakedible; 11.03.2010
comment
@Nakedible: извините, я забыл опцию -s в коммите. Помните, что это очень легкий процесс подписания (см. Ссылку, которую я добавил в своем ответе, на этом этапе цифровые подписи не используются, в отличие от tag -s) - person VonC; 11.03.2010
comment
Эй, на самом деле, начиная с git v1.7.9, можно подписать GPG любой коммит, какой захотите. используйте git commit -S для этого - person Cyryl Płotnicki; 17.11.2013
comment
@ CyrylPłotnicki-Chudyk Хорошее замечание. Я включил это в ответ вместе с некоторой ссылкой на коммиты git, которые представили эту функцию. - person VonC; 17.11.2013