Развертывать информацию Git SHA1 в регистрацию без архивирования?

Есть ли способ включить хеш git commit в файл каждый раз, когда я фиксирую? Я могу только узнать, как это сделать во время архивации, но я не смог выяснить, как это сделать для каждого коммита.

Я занимаюсь научным программированием с использованием git в качестве контроля версий, поэтому этот вид функциональности был бы очень полезен по причинам воспроизводимости (т. Е. Чтобы хэш git автоматически включался во все файлы результатов и рисунки).

5 ответов

Решение

Вы можете легко поместить SHA-1 файла (точнее, SHA-1 блоба, т.е. SHA-1 содержимого файла), используя $Id$ клавиатура и ident Gitattribute.

Если вы хотите поставить SHA-1 коммита, нет готового решения, но вы можете использовать clean а также smudge команды filter Gitattribute. Обратите внимание, что это сильно повлияет на производительность, так как после фиксации каждый файл должен быть изменен, чтобы отразить новый сделанный коммит


Хотя, как уже говорилось в других ответах на этот вопрос, при сборке лучше было бы встроить номер версии в сгенерированные файлы, как, например, это делают ядро ​​Linux и проект git.

Greg Hewgill объяснил в своем ответе, почему это было бы невозможно

ident

Когда атрибут ident установлен для пути, git заменяет $Id$ в объекте BLOB с $Id: за которым следует 40-символьное имя объекта шестнадцатеричного блоба, за которым следует знак доллара $ при оформлении заказа.
Любая последовательность байтов, которая начинается с $Id: и заканчивается $ в файле рабочего дерева заменяется $Id$ при регистрации.

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


В качестве примера отдельного файла Cascabel указывает на VERSION сам файл Git, собранный этим скриптом

elif test -d .git -o -f .git &&
         VN=$(git describe --match "v[0-9]*" --abbrev=4 HEAD 2>/dev/null) &&
         case "$VN" in
         *$LF*) (exit 1) ;;
         v[0-9]*)
                 git update-index -q --refresh
                 test -z "$(git diff-index --name-only HEAD --)" ||
                 VN="$VN-dirty" ;;
         esac
then

Включение хеша коммита в файлы, включенные в коммит, обязательно изменит хеш. Чтобы обеспечить целостность репозитория с помощью механизма хеширования SHA1, Git не поддерживает (и не может) поддерживать такую ​​функцию.

Вы можете просто использовать следующий скрипт bash (сохраните его в.git/hooks/post-commit)

#!/bin/bash

# break self-recursiveness
git log | head -n6 | grep -q 'version.h update' && exit 0

commit_id=`git log | head -n3 | grep commit`
v_date=`git log | head -n3 | grep -i date | sed 's|[dD]ate:\s*\(.*\)|\1|'`

sed -i "s|#define COMMIT.*|#define COMMIT \"${commit_id}\"|" server/version.h
sed -i "s|#define V_DATE.*|#define V_DATE \"${v_date}\"|" server/version.h

git commit -m"version.h update" server/version.h
exit 0

для справки, server/version.h должен выглядеть так, и он будет обновляться после каждого коммита:

#ifndef __version_h__
#define __version_h__

#define COMMIT "commit 2e44e754a9002c99bbf4c09e7827f307d5f0d6f9"
#define V_DATE "Sat Aug 20 19:35:47 2016 +0300"

#endif

иметь git-хэш, автоматически включаемый во все файлы результатов и рисунки.

Вы можете передать хеш как входные данные для программы (например, как переменную окружения).

Это само по себе не гарантирует, что вы передаете правильный хеш.

Возможно, вы можете написать сценарий, который извлекает определенный коммит (по хешу или ref) в специальный (или временный) каталог, выполняет автоматическую сборку, затем запускает программу и передает хеш коммита в качестве входных данных для программы.

Таким образом, у вас будет больше уверенности, что вы получите правильный хеш.

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

Другие вопросы по тегам