Как вставить обновленный git-хэш в Version.hpp?

Оригинальное название: Как заставить git игнорировать мой файл независимо от ветвления?

У меня есть следующий файл после оформления заказа, который работает как положено:

#!/usr/bin/ruby

cmd = ENV["HOME"] + "/dev/pitbull/cpp/bin/gen_version.rb --write"
`#{cmd}`

Сценарий gen_version.rb вычисляет временную метку, последний главный тег, хэш-заголовок HEAD и записывает вVERSION.hpp файл, который также находится в Git.

Я тогда используюuse git update-index --assume-unchanged VERSION.hpp чтобы мерзавец игнорировал мои изменения.

Теперь это прекрасно работает, если я останусь в своей ветке разработки. Но когда я пытаюсьget checkout masterЯм прикрутил:

git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    cpp/inc/core/util/VERSION.hpp
Please, commit your changes or stash them before you can switch branches.
Aborting

Как правильно настроить git, чтобы я мог обновлять VERSION.hpp при извлечении, но git игнорирует любые изменения этого файла, независимо от моей ветки?

РЕДАКТИРОВАТЬ Я изменил тему, поскольку окончательное решение фактически затрагивает более широкую тему, которая может быть более полезной для большего числа пользователей SO. Таким образом, вы можете прочитать эту тему двумя способами: с оригинальным заголовком и ответом ниже или с более широкой проблемой выше, снова со всем решением ниже.

 kfmfe0417 нояб. 2012 г., 16:23
+1 @MattJenko ты за подтверждение
 Lesstat17 нояб. 2012 г., 07:48
Если я вас правильно понял, вы хотите переписать изменения в этот файл при оформлении заказа. Попробуйте git checkout -f
 Lesstat17 нояб. 2012 г., 07:57
Мм, вы рассматривали игнорирование файла вместе с файлом .gitignore?
 MattJenko17 нояб. 2012 г., 12:52
Да, .gitignore игнорирует только файлы, которые нет уже в индексе. Ваш последний комментарий является правильным способом сделать это, если вы неЯ не хочу, чтобы файл был зарегистрирован.
 kfmfe0417 нояб. 2012 г., 08:11
@Lesstat Да, я тоже пытался, но я все еще получаю ту же ошибку от мастера git checkout выше ...
 kfmfe0417 нояб. 2012 г., 08:15
+1 @Lesstat на самом деле, я попытался удалить его из git в целом, а затем поместил его в .gitignore - думаю, это может сработать. Буду обновлять позже, если это произойдет. TY.
 kfmfe0417 нояб. 2012 г., 07:52
@Lesstat звучит разумно, но когда я попробовал, я получил: error: Entry 'CPP / вкл / ядро / Util / VERSION.hpp» не современно. Не может слиться.

Ответы на вопрос(1)

Решение Вопроса

Для решения моей первоначальной проблемы: Как заставить git игнорировать мой файл независимо от ветвления?

git rm cpp / inc / core / util / VERSION.hppдобавить cpp / inc / core / util / VERSION.hpp в .gitignore

Для решения: Как вставить обновленный git-хэш в Version.hpp?

Частично проблема заключается в проблеме куриного яйца, когда вы не можете узнать свой хэш, пока не будут проверены все файлы, но вы не можете проверить свой обновленный VERSION.hpp, пока не узнаете свой git-хэш. Поэтому я решил оставить VERSION.hpp вне репозитория и в файле .gitignore.

Имейте в виду, что цель встраивания VERSION.hpp в исполняемый файл: если неприятная ошибка обнаруживается в рабочей среде с git-хешем в двоичном файле, мы будем знать, какой код нужно извлечь из git, чтобы мы могли правильно отладить код ,

Вот шаги, которые я предпринял в дополнение к двум шагам выше:

Напишите короткий скрипт ruby, который делает две вещи, в зависимости от того, грязная местность или нет (еслиgit diff --shortstat показывает больше 0 строк, у вас грязная область).git rev-list HEAD | sed -n '1p' | cut -c1-10 даст вам первые 10 символов в качестве git-hash. Если ваша местность грязная, это ПОСЛЕДНЯЯ ГОЛОВАs git-hash (я вставил строку LAST в VERSION.hpp). Если это чисто, то это ваш настоящий текущий хэш.Скрипт ruby проверит результат в 1. против фактического файла VERSION.hpp. Если результат изменился, запишите новый результат в VERSION.hpp.Измените мой .bashrc, добавив два небольших псевдонима -cmakerel а такжеcmakedbg для вызова cmake в моих локальных каталогах и каталогах выпусков, но перед тем, как я сделаю cmake и make в псевдониме, я вызываю скрипт ruby в 1., чтобы обновить мой VERSION.hpp при необходимости.

Если я позвоню cmakerel и cmakedbg после git checkout и если я неизменить код перед сборкой (что я не долженв любом случае, я буду иметь VERSION.hpp, который мне нужен, со всей необходимой информацией.

НОТА Альтернативное решение для модификации .bashrc с помощью псевдонимов - использовать gitкрюк после оформления заказа (теоретически). Однако я не могЭто не сработало, и я уже потратил слишком много времени на эту проблему, но вам, возможно, повезет больше.

Ваш ответ на вопрос