Развертывать информацию Git SHA1 в регистрацию без архивирования? - PullRequest
5 голосов
/ 18 мая 2010

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

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

Ответы [ 5 ]

2 голосов
/ 18 мая 2010

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

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


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

2 голосов
/ 18 мая 2010

Грег объяснил в его ответ почему это невозможно

ident

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

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


В качестве примера отдельного файла Jefromi указывает на 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
1 голос
/ 18 мая 2010

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

0 голосов
/ 20 августа 2016

Вы можете просто использовать следующий скрипт 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
0 голосов
/ 18 мая 2010

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

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

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

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

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

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

...