git — выборка ревизии ветки без ее проверки

#git #gitlab #gitlab-ci #versioning

#git #gitlab #gitlab-ci #управление версиями

Вопрос:

В настоящее время я создаю версии сборки, используя

 git rev-list --count --first-parent $BRANCH_NAME
  

как правило, с использованием ревизий ветвей master и dev, например 2.27 . При использовании конвейера cicd (gitlab) Мне пришлось бы снова проверять свой проект, что, по-видимому, излишне.

Есть ли простой способ получить номер редакции ветки, не проверяя ее сначала?


** РЕДАКТИРОВАТЬ **


Я обнаружил, что мой конвейер ci выполняет частичную проверку моего репозитория в качестве первого шага. Затем он проверяет текущую ветку в отсоединенном головном состоянии.

 $ eval "$CI_PRE_CLONE_SCRIPT"

...

$ git branch # if run manually via script
* (HEAD detached at xxxxxx)
  

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

** Временное решение **

После запуска npm build я выполняю скрипт узла для выполнения грязной работы:

 ...

execSync('git checkout -b __headless__'); // to get away from headless state, so we can come back in a sec @jkr
// const current = execSync('git rev-parse --abbrev-ref HEAD').toString();
execSync('git fetch origin master');
execSync('git checkout master');
const master = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync('git fetch origin dev');
execSync('git checkout dev');
const dev = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync(`git checkout __headless__`);

...
  

** Рефакторинг временного решения **

Вот что я в конечном итоге получил

 const check = execSync('git branch').toString();

if(check.indexOf('detached at') > -1) {
    execSync('git checkout -b __headless__'); // to get away from headless state, so we can come back in a sec @jkr
}

const current = execSync('git rev-parse --abbrev-ref HEAD').toString();
execSync('git fetch origin master');
execSync('git checkout master');
const master = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync('git fetch origin dev');
execSync('git checkout dev');
const dev = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync(`git checkout ${current}`);

...
  

В какой-то момент я собираю master dev числа и и вводю их в качестве версии сборки.

Комментарии:

1. Как вы отслеживаете версию, вы используете теги? git rev-list ... В данном контексте это выглядит странно.

2. Системы CI в целом сложны и раздражают. Но, как сказал Марек Р., git rev-parse <expression> обычно простой способ решить конкретную проблему, о которой вы спрашиваете. Может ли ваша система CI действительно сделать это и использовать результат — это отдельный вопрос. 🙂

Ответ №1:

Мой проект использует теги для отслеживания версии. Итак, чтобы увидеть, из какой версии происходит ветка, я делаю:

 git describe --tags "--abbrev=0" "--match=v*.*.*" branchName
  

Что делает то, что мне нужно.

Если информация о версии хранится в отслеживаемом файле, вы можете просмотреть ее таким образом:

 git show branchName:current_version.txt
  

Я вижу, что вы использовали «версию» и «ревизию», и если под этим вы подразумеваете sha-1 фиксации, то это то, что вам нужно:

 git rev-parse branchName