git зафиксировать только временную метку изменения файла - PullRequest
1 голос
/ 12 января 2020

У меня есть два файла, file1 и file2. Я изменил file1 и не коснулся file2. После коммита CI начал проверять даты модификации file1 и file2. Если file2 старше, инструмент сборки генерирует свою собственную версию file2 из file1 и сравнивает результаты (сгенерированные file2 и file2, находящиеся в репо). Если совпадений нет, генерируется ошибка.

Я не хочу изменять file2 и не могу изменить конвейер сборки. Вопрос в том, как зафиксировать только временную модификацию file2, чтобы CI ее не трогал? Я хочу сделать file2 новее, чем file1.

Пожалуйста, не спрашивайте, почему CI настроен таким образом. Это большой проект с большим количеством участников.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Git не хранит файл отметки времени.

Единицей хранения в Git является коммит. commit (в целом) имеет временную метку. Фактически, каждый коммит имеет две метки времени, а именно метку времени автора и метку времени коммиттера. Эти две метки времени являются частью метаданных коммита. И, конечно же, коммит сохраняет снимок всех ваших файлов. Но это всех ваших файлов, без отметок времени.

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

Способ, которым базовая операционная система видит обновления отметок времени в ваши файлы в вашем рабочем дереве таковы: когда ваш Git передает git checkout или git switch, чтобы перейти от того, что у вас есть сейчас, к любому другому, который вы делаете ' Хотелось бы, чтобы ваш Git заметил, что это требует замены содержимого некоторых файлов (и, возможно, удаления некоторых файлов и создания некоторых файлов). Таким образом, Git заменяет содержимое этих файлов и / или удаляет и / или создает некоторые файлы по мере необходимости. Это действие заставляет вашу операционную систему изменять временные метки этих файлов.

Система сборки CI может работать или не работать одинаково. Некоторые системы CI могут хранить в рабочем дереве файлы из предыдущей сборки; другие могут этого не делать. 1 В любом случае вы не можете получить Git для установки таких отметок даты. 2 Вам придется найти другой способ иметь дело с вашей системой CI.

(Если ваша система CI имеет стандартное рабочее дерево, вы можете заставить его обновить свою копию рабочего дерева file2, изменив file2 так что Git должен извлечь его при изменении фиксации. Но это то, что вы сказали, что сделали не хотите.)


1 Это кажется довольно распространенным в этих системах сборки не сохраняют рабочее дерево и вместо этого запускают git diff для сравнения содержимого файла с ранее созданным, но давно удаленным, рабочее дерево к этому в предложенной новой сборке, которая была извлечена в рабочее дерево fre sh. Если содержимое файлов определенных файлов изменилось, эти файлы восстанавливаются. Например, некоторые установки Jenkins делают это вручную. Базель, по-видимому, формализует это, вычисляя контрольные суммы ha sh и сравнивая контрольные суммы: если контрольная сумма совпадает с предыдущей сборкой, она просто повторно использует артефакты предыдущей сборки.

2 Люди написали различные Git перехватывают, которые go пересекают и влияют на владение файлом и / или разрешения, например, на основе содержимого зафиксированного файла. Эту технику также можно использовать для установки меток времени ОС. Но такой сценарий в общем случае будет частью системы CI.

0 голосов
/ 12 января 2020

Я даю вам 2 метода:

Первый - следующий и понятный и безопасный :

git rm --cached <file>
git add <file>

Это должно поместить новый файл в индекс независимо от того, что было ранее.

Второе следующее (но обратите внимание, что это только обходной путь) :

touch file.dat
git add file.dat 

в основном, сила git признать, что файл может быть изменен, так что он проверяет, действительно ли он был изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...