Мы используем SVN на работе, но для моих личных проектов я решил использовать Git. Итак, я установил Git вчера, и мне интересно, что такое эквивалентный номер редакции в Git .
Допустим, мы работаем над версией 3.0.8, и каждое исправление имеет свой номер редакции, который мы можем использовать, когда говорим об этом исправлении. Так что, если я помечу код в Git на 3.0.8, что тогда я могу использовать в качестве номера ревизии или какого-то другого более детального вида идентификации? Я считаю, что хэш не так удобен для людей.
Ответы:
Хорошая или плохая новость для вас, этот хэш - номер редакции. У меня также были проблемы с этим, когда я переключился с SVN на git.
Вы можете использовать «tagging» в git, чтобы пометить определенную ревизию как «release» для конкретной версии, упрощая обращение к этой ревизии. Проверьте это сообщение в блоге .
Главное, что нужно понять, это то, что git не может иметь номера ревизий - подумайте о децентрализованной природе. Если пользователи A и B фиксируют свои локальные репозитории, как git может разумно назначить последовательный номер редакции? A не знает о B, прежде чем они будут толкать / вытягивать изменения друг друга.
Еще одна вещь, на которую стоит обратить внимание, это упрощенное ветвление для веток с исправлениями ошибок:
Начните с релиза: 3.0.8. Затем, после этого выпуска, сделайте это:
Это создаст ветку для исправлений ошибок. Оформить заказ в филиале:
Теперь внесите любые исправления ошибок, которые вы хотите.
Зафиксируйте их и переключитесь обратно в главную ветку:
Затем извлеките эти изменения из другой ветки:
Таким образом, у вас есть отдельная ветка для исправления ошибок, зависящая от выпуска, но вы по-прежнему извлекаете изменения исправления в основной ствол разработчика.
источник
fixed in 547cc3e..c4b2eba
, и у вас есть какая-то другая ревизия, вы не представляете, должен ли ваш код содержать исправление ?! Конечно, у мерзавцев в git-central есть решение для этого?!?!С современным Git (1.8.3.4 в моем случае) и без использования веток вы можете сделать:
источник
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
зависимости от того, когда были сделаны последние изменения.--first-parent
адресует вашу проблему? Я не хотел бы избегать, казалось бы, самого простого решения из-за редкого крайнего случая, если есть столь же простой обходной путь или способ сделать его более надежным.--first-parent
помогает. Пока перебазирование не выполняется и одна и та же ветка всегда используется для создания релизов (и, конечно, для вычисления этого номера релиза), я думаю, что это можно использовать. Хотя я все еще сомневаюсь, что это всегда однозначно идентифицирует коммит, с которого вышел релиз. Есть так много вещей, которые могут пойти не так, как надо ... но в настоящий момент я не могу придумать что-то, что определенно сломало бы это (учитывая мои вышеприведенные высказывания «до тех пор»).git describe
Упоминалось в другом ответе метод является путь. Создайте тег, если вы хотите что-то удобочитаемое человеком.Команда
git describe
создает немного более удобочитаемое имя, которое относится к конкретному коммиту. Например, из документации:Пока вы используете разумно названные теги для маркировки определенных выпусков, это можно считать примерно эквивалентным SVN-номеру «номер редакции».
источник
git
репозиторий уже имеет теги; если это не так, вы можете получить git description терпит неудачу с «роковым: имена не найдены, ничего не может описать». - переполнение стека ; Это означает, что вы должны установить теги самостоятельно.git describe
никогда не потерпеть неудачу, используйтеgit describe --always
опцию.git describe
для поиска исходного коммита? Если не считать ручного подсчета коммитов в журнале, я имею в виду.v1.0.4
) и самый последний идентификатор фиксации (2414721
) уже являются частью вывода git description.Другие постеры правы, «номер ревизии» отсутствует.
Я думаю, что лучший способ - использовать теги для «релизов»!
Но я использовал следующее, чтобы подделать номера ревизий (просто для того, чтобы клиенты могли видеть ревизии и ход выполнения, так как они хотели получить такие же увеличивающиеся ревизии от git, какие они использовали для subversion).
Показать "текущую версию" "HEAD" моделируется с помощью этого:
git rev-list HEAD | wc -l
Но что, если клиент скажет мне, что в «ревизии» 1302 есть ошибка?
Для этого я добавил следующее в раздел [alias] моего ~ / .gitconfig:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
использование
git show-rev-number 1302
затем напечатает хеш для "ревизии" :)Я сделал блог (на немецком языке) об этой "технике" некоторое время назад.
источник
git bisect
(ссылка) является подходящим инструментом для определения того, что и когда изменилось.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git не имеет той же концепции номеров ревизий, что и subversion. Вместо этого каждый данный снимок, сделанный с фиксацией, помечается контрольной суммой SHA1. Зачем? Есть несколько проблем с запуском revno в распределенной системе контроля версий:
Во-первых, поскольку разработка вообще не является линейной, привязка числа является довольно сложной задачей, которую необходимо решить таким образом, чтобы удовлетворить ваши потребности программиста. Попытка исправить это путем добавления номера может быстро стать проблематичной, если номер не работает так, как вы ожидаете.
Во-вторых, номера ревизий могут генерироваться на разных машинах. Это значительно усложняет синхронизацию чисел, особенно потому, что связь односторонняя; у вас может даже не быть доступа ко всем машинам, на которых есть хранилище.
В-третьих, в git, впервые появившемся в ныне несуществующей системе OpenCM, идентичность коммита (что такое коммит) эквивалентна его имени (идентификатор SHA). Эта концепция именования = идентичности очень сильна. Когда вы сидите с именем коммита в руке, оно также идентифицирует коммит не поддающимся обработке способом. Это, в свою очередь, позволяет проверять все ваши коммиты обратно на первый начальный для повреждения с помощью
git fsck
команды.Теперь, поскольку у нас есть DAG (направленный ациклический граф) ревизий, и они составляют текущее дерево, нам нужны некоторые инструменты для решения вашей проблемы: Как мы различаем разные версии. Во-первых, вы можете опустить часть хэша, если данный префикс, скажем, 1516bd , однозначно идентифицирует ваш коммит. Но это тоже довольно надумано. Вместо этого, хитрость заключается в использовании тегов и / или ветвей. Тег или ветвь похожи на «желтую заметку», которую вы прикрепляете к данному SHA1-идентификатору коммита. По сути, теги должны быть неподвижными, в то время как ветвь будет двигаться, когда в ее HEAD будут сделаны новые коммиты. Существуют способы ссылки на коммит вокруг тега или ветви, см. Справочную страницу git-rev-parse.
Обычно, если вам нужно поработать над определенным фрагментом кода, этот фрагмент претерпевает изменения и в качестве такового должен представлять собой ветвь с говорящим названием темы. Создание большого количества веток (20-30 на каждого программиста не является неслыханным, с некоторыми 4-5, опубликованными для других, чтобы работать над ними) - хитрость для эффективного git. Каждая часть работы должна начинаться как отдельная ветвь, а затем объединяться при проверке. Неопубликованные ветви могут быть полностью переписаны, и эта часть разрушающей истории - сила мерзости.
Когда изменение принимается мастером, оно несколько застывает и становится археологическим. В этот момент вы можете пометить его, но чаще всего ссылка на конкретный коммит делается в трекере ошибок или трекере ошибок через сумму sha1. Тэги, как правило, зарезервированы для выпусков версий и точек ветвления для ветвей обслуживания (для старых версий).
источник
Если вам интересно, я управлял номерами версий автоматически из информации git здесь в формате
где build - общее количество коммитов. Вы увидите интересный код в
Makefile
. Вот соответствующая часть для доступа к другой части номера версии:источник
Функция Bash:
выводит что-то вроде
То есть
источник
SHA1 хэш фиксации является эквивалентом номер ревизии Subversion.
источник
Это то, что я сделал в своем make-файле на основе других решений. Обратите внимание, что это не только дает вашему коду номер редакции, но также добавляет хеш, который позволяет вам воссоздать релиз.
источник
git-describe
избежать ошибок - это то,git describe --always --dirty --long --tags
что работает во всех случаях, о которых я могу подумать.Проблема с использованием git-хэша в качестве номера сборки заключается в том, что он не монотонно увеличивается. OSGi предлагает использовать метку времени для номера сборки. Похоже, что число коммитов в ветке могло быть использовано вместо номера подрывной деятельности или выполнения изменения.
источник
Я написал несколько утилит PowerShell для получения информации о версии из Git и упрощения тегов
функции: Get-LastVersion, Get-Revision, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
источник
Каждый коммит имеет уникальный хеш. Кроме этого в git нет номеров ревизий. Вам нужно пометить коммиты самостоятельно, если вы хотите большего удобства для пользователя.
источник
Я просто хотел бы отметить другой возможный подход - это использование
git
git-notes (1) , существующее начиная с версии 1.6.6 ( Примечание к Self-Git ) (я используюgit
версию 1.7.9.5).Обычно я
git svn
клонировал SVN-репозиторий с линейной историей (без стандартного макета, без ветвей, без тегов) и хотел сравнить номера ревизий в клонированномgit
репозитории. Этот git-клон не имеет тегов по умолчанию, поэтому я не могу его использоватьgit describe
. Стратегия здесь, вероятно, будет работать только для линейной истории - не уверен, как это получится с объединениями и т. Д .; но вот основная стратегия:git rev-list
список всей истории коммитовrev-list
как по умолчанию в «обратном хронологическом порядке», мы использовали бы его--reverse
переключатель, чтобы получить список коммитов, отсортированных по самым старым первымbash
оболочку дляgit log
с--notes
, который также выведет заметку коммита, которая в этом случае будет "номером ревизии"git status
)Во-первых, давайте отметим, что у
git
него есть расположение заметок по умолчанию - но вы также можете указатьref
(erence) для заметок - которые будут хранить их в другом каталоге.git
; например, находясь вgit
папке репо, вы можете позвонить,git notes get-ref
чтобы узнать, какой каталог это будет:Следует отметить, что если вы используете
notes add
a--ref
, вы должны впоследствии снова использовать эту ссылку - в противном случае вы можете получить ошибки типа « Нет заметки для объекта XXX ...» ».В этом примере я решил назвать
ref
заметки «linrev» (для линейного пересмотра) - это также означает, что маловероятно, что процедура будет мешать уже существующим заметкам. Я также использую--git-dir
переключатель, так как, будучиgit
новичком, у меня были некоторые проблемы с пониманием этого - поэтому я хотел бы «запомнить на потом»:)
; и я также использую,--no-pager
чтобы подавить нерестless
при использованииgit log
.Итак, если вы находитесь в каталоге с подпапкой,
myrepo_git
которая являетсяgit
репозиторием; можно сделать:Таким образом, по крайней мере, в моем конкретном случае полностью линейной истории без ветвей номера ревизий, кажется, совпадают с этим подходом - и, кроме того, кажется, что этот подход позволит использовать
git log
с диапазонами ревизий, в то же время получая правильные номера ревизий - YMMV хотя с другим контекстом ...Надеюсь, это поможет кому-то,
ура!
РЕДАКТИРОВАТЬ: Хорошо, здесь это немного проще, с
git
псевдонимами для вышеуказанных циклов, вызванныхsetlinrev
иunsetlinrev
; в папке git-репозитория выполните командуbash
( обратите внимание на неприятное побег, см. также # 16136745 - Добавьте псевдоним Git, содержащий точку с запятой ):... так что вы можете просто вызвать ее
git setlinrev
перед тем, как попытаться сделать запись, включающую линейные ревизии; иgit unsetlinrev
удалить эти заметки, когда вы закончите; пример из каталога git repo:Время, которое потребуется оболочке для завершения этих псевдонимов, будет зависеть от размера истории хранилища.
источник
Для людей, у которых есть процесс сборки Ant , вы можете сгенерировать номер версии для проекта на git с этой целью:
Результат выглядит так:
Грязный флаг здесь, когда у вас есть файл (-ы), не зафиксированный при создании номера версии. Потому что обычно, когда вы собираете / упаковываете свое приложение, каждая модификация кода должна быть в хранилище.
источник
Наряду с идентификатором SHA-1 фиксации, дата и время серверного времени помогли бы?
Что-то вроде этого:
источник
Из руководства по Git теги - блестящий ответ на этот вопрос:
Ознакомьтесь с 2.6 Git Basics - Tagging
источник
By default, the git push command doesn’t transfer tags to remote servers.
Мы используем эту команду для получения версии и ревизии из git:
Возвращается
gcc7b71f
)v2.1.0
, используется для выпусков)v5.3.0-88-gcc7b71f
)v5.3.0-88-gcc7b71f-dirty
)Смотрите также: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
источник
Событие после сборки для Visual Studio
источник
Подумайте об использовании
git-rev-label
Предоставляет информацию о ревизии Git-репозитория в формате вроде
master-c73-gabc6bec
. Может заполнить строку шаблона или файл переменными окружения и информацией из Git. Полезно для предоставления информации о версии программы: ветка, тег, хеш коммита, количество коммитов, грязный статус, дата и время. Одна из самых полезных вещей - это количество коммитов, без учета объединенных ветвей - только первый родитель.источник