Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: git, автоинкремент версии при коммите  (Прочитано 11000 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 15-10-2018 10:27 » 

поставили мне тут задачу - в при каждом коммите генерить псевдоуникальную циферку билда и сохранять в коммите и в самом экзешнике программы, чтобы была возможность по жалобе юзеров искать коммит, где экзешник породился - для отката и разбора полётов

через использование хука GIT prepare-commit-msg кое-как сделал автоинкремент циферки в отдельном файле (при посредстве батника), заменяю при помощи некоторой утилиты (verpatch) версию в уже собранном экзешнике и вывожу эту версию в комментарий коммита.

Скажем так, это всё работает, но есть вопросы, на которые не могу найти точные ответы:

1) есть ли возможность хранить файл хука не в папке .git , а где угодно (чтобы, например, тоже добавить его под контроль версий) ?

2) файл, хранящий текущую циферку версии (откуда берётся цифра при коммите, инкрементится и сохраняется туда же для создания цифр для следующих коммитов) - его под контроль версий добавлять, по-видимому, нельзя, поскольку откаты будут его перезаписывать. Это ладно. Но как быть в случае, если коммитит другой разработчик у себя на машине - как этот файл синхронизировать? Или нужно просто договориться, что экзешник всегда компилит только один и тот же разработчик?

3) что-то ещё хотел спросить, попозже вспомню  Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 15-10-2018 16:16 » 

Можно хранить метки. Ключевое слово tag. Насколько я знаю, метки не переносятся при удаленном клонировании. Хотя могу и ощибаться. как-то с гитхаба склонировал проект, и хотел посмотреть его метки. Ни одной не было видно. Также у каждого коммита есть свой уникальный хеш. Можно к нему привязать свои версии.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-10-2018 21:09 » 

Метки копируются, просто ими в гите пользоваться неудобно.
Только я понял немного иначе: если версия нужна не снаружи, как идентификатор коммита, а внутри, как значение конфигурации (запись в файл в коммите). Возможно hooks pre-commit поможет, хотя оч. сомневаюсь. Проще сделать скрипт, который сделает все дело и сам же запустит коммит.


Добавлено через 3 минуты и 50 секунд:
Леш,
1) хуки — часть репы, они должны быть под ревизией, если их закоммитить в другую директорию
2) инкремент тут не катит, распределенная суть гита тебе не в помощь

Вариант со скриптом рекомендую. Кстати, (2) тоже реализуемо скриптом: цепочка pull+up, измение, add+commit+push. Но на каждый коммит это перебор и вообще очень плохо. Скорее это подготовка релиза, а значит лучше делать в соотв. ветке и никак не на каждый коммит в других ветках.
« Последнее редактирование: 16-10-2018 23:19 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-10-2018 22:01 » 

https://stackoverflow.com/questions/16831536/can-you-change-a-file-content-during-git-commit
Похоже, можно добавить в коммит из хука.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 16-10-2018 05:43 » 

Finch, у меня немного в другом вопрос, но щас тут пока не углубляюсь, надо с хранением файла версии разобраться

Ром, я как раз в коммите и вызываю хук, который правит экзешник (его версию файла и продукта в ресурсах), затем эту же строку версии кладёт в комментарий коммита. Это всё работает. В отдельном файлике (назовём его VERSION.txt) хранится текущая версия, там хук её инкрементирует перез записью в файл

То, что хук неплохо бы хранить в репозитории - это я понимаю, он и хранится. Но сам вызов GIT позволяет настроить только через поклажу в папку .git/hooks, имена хуков предопределённые. В скрипте я просто вызываю свой батник. Тут ладно, можно договориться, что все себе такой скрипт в папку hooks положат.
Но вот сам файл VERSION.txt - его под контроль версий нельзя добавлять (потому что при откате на какой-то коммит, этот файл непредсказуемо поменяется), поэтому у разных разработчиков он не синхронизирован. Даже в том случае, если он будет лежать на сетевом диске.

В итоге, пока я коммичу один, всё нормально, но если появится второй коммитер, будет бардак с инкрементом

Привязываться к уникальному хешу коммита - в принципе,лично я то могу это сделать, но вот как юзер будет диктовать по телефону эту циферку, я не представляю )

Может, у гита уже есть такой встроенный инкрементный счётчик (например, как у TortoiseSVN - параметр коммита revision)?
« Последнее редактирование: 16-10-2018 05:47 от Алексей++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-10-2018 05:49 » 

Обобщая: веду поиск синхронизированного источника автоинкрементного счётчика для комментария коммита  Улыбаюсь


В принципе, подошёл бы GUID , но тут та же проблема - юзер не сможет его продиктовать по телефону
« Последнее редактирование: 16-10-2018 05:52 от Алексей++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 16-10-2018 07:43 » 

Вариант со скриптом рекомендую. Кстати, (2) тоже реализуемо скриптом: цепочка pull+up, измение, add+commit+push. Но на каждый коммит это перебор и вообще очень плохо. Скорее это подготовка релиза, а значит лучше делать в соотв. ветке и никак не на каждый коммит в других ветках.

Сам файл под ревизией. Скрипт гарантирует, что ревизия всегда самая свежая.
Если очень хочется реализовать лок: создаем отдельную репу, где храним version.txt и lock.txt; скриптом чекаутим/апаем это себе, читаем lock.txt: там должен быть идентификатор локера и время окончания лока; если заблокировано, что-то делаем (ждем и повторяем или ругаемся и останавливаемся); если не блокировано, пишет туда себя и время (UTC), скажем, на минуту вперед и коммитим+пушим (в этом же коммите можно обновить счетчик); если удачно, лок  наш, иначе убиваем коммит и откатывается на чтение lock.txt; тут у нас уже есть лок, обновляем ревизию в основной репе, можем коммитить когда захотим или сразу; локу хорошо бы откатить, если время еще не вышло.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-10-2018 07:56 » 

ну, допустим так усложнять не хочется. Пусть это будет только для релиза - как такую ветку организовать ? И как в хуке узнать, в какую ветку коммитится ?  В гите я не силён, до этого использовал вообще по минимуму, без ветвлений даже

пользуюсь "GUIшным" гитом, вручную команды практически не знаю на данный момент
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 16-10-2018 21:30 » new

https://git-scm.com/book/ru/v1/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%B8-%D0%B2-Git
https://git-scm.com/book/ru/v2/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-Git-Hooks
http://uleming.github.io/gitbook/5_%D0%A5%D1%83%D0%BA%D0%B8_git.html

В переменных окружения есть часть инфы:
GIT_AUTHOR_DATE    "@1539724322 +0000",
GIT_AUTHOR_EMAIL   "rxl@mail.ru",
GIT_AUTHOR_NAME    "Roman Chernyshov",
GIT_DIR            ".git",
GIT_EDITOR         ":",
GIT_INDEX_FILE     ".git/index",
GIT_PREFIX         "",

Прямо в скрипте можно выполнять команды, обращаясь к git.

Все ветки, которые есть у тебя в репе:
$ git branch -lv --no-abbrev --no-color
  br1    079c835bccd0306690674e5eac7c6838f56cd1c2 add a
* master a64afb5b5fddc99eb5bc0a4131efee76eba946b7 a=2
Со звездочкой — текущая. Сперва имя ветки, потом текущий коммит, затем последний комментарий.

У гита встроенный хелп. Если что не понятно, добавь --help. Также часто, если не может выполнить команду, пишет, что можно сделать и дает готовые строки для выполнения.


На счет хуков в репе: https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/
Единственный минус, нужна команда для конфигурирования твоей локальной репы. Мы для Linux используем make.


Под виндой наверняка пользуешься TortoiseGit. Он понимает файл с именем .tgitconfig в корне репы. Считает его локальным конфигом. А хуки у него вообще свои.
« Последнее редактирование: 16-10-2018 23:31 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines