Отслеживание версий кода в исполняемом файле - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть система машинного обучения разумного размера (около 40 тыс. Строк), написанная на C ++. Это все еще в активной разработке, и мне нужно регулярно проводить эксперименты, даже когда я делаю изменения в своем коде.

Вывод моих экспериментов записан в простых текстовых файлах. Когда я смотрю на эти результаты, я хотел бы выяснить точную версию кода, который его создал. Обычно я выполняю от 5 до 6 экспериментов одновременно, каждый из которых имеет свою версию.

Я хотел бы знать, например, что набор результатов был получен путем компиляции версии 1 файла A, версии 2 файла B и т. Д. (Мне просто нужен какой-то идентификатор, и вывод «git description» здесь подойдет) .

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

Любые предложения, как это можно сделать хорошим способом. В частности, есть ли хороший способ сделать это с помощью git?

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

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

static const char version_cstr[] = "93f794f674 (" __DATE__ ")";
const char * version()
{
  return version_cstr;
}

Затем легко запустить версию при запуске.

Я изначально использовалDEFINE в командной строке, но это означало, что при каждом изменении версии все компилировалось системой сборки - не очень хорошо для большого проекта.

Вот фрагмент scons, который я использую для его генерации, возможно, вы сможете адаптироватьэто для ваших нужд.

# Lets get the version from git
# first get the base version
git_sha = subprocess.Popen(["git","rev-parse","--short=10","HEAD"], stdout=subprocess.PIPE ).communicate()[0].strip()
p1 = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE )
p2 = subprocess.Popen(["grep", "Changed but not updated\\|Changes to be committed"], stdin=p1.stdout,stdout=subprocess.PIPE)
result = p2.communicate()[0].strip()

if result!="":
  git_sha += "[MOD]"

print "Building version %s"%git_sha


def version_action(target,source,env):
  """
  Generate file with current version info
  """
  fd=open(target[0].path,'w')
  fd.write( "static const char version_cstr[] = \"%s (\" __DATE__ \")\";\nconst char * version()\n{\n  return version_cstr;\n}\n" % git_sha )
  fd.close()
  return 0

build_version = env.Command( 'src/autogen/version.cpp', [], Action(version_action) )
env.AlwaysBuild(build_version)
1 голос
/ 07 сентября 2011

Вы можете использовать $Id:$ в вашем исходном файле, и Git заменит его хэшем sha1, если вы добавите файл, содержащий эту фразу, в .gitattributes с опцией «ident» (см. gitattributes ).

...