Можно ли переписать историю, не оставляя следов?

Я прочитал этот вопрос об изменении временной метки старого коммита.

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

Спасибо

2 ответа

Решение

Если у вас нет доступа к репо, где операция (как правило, git filter-branch), и где вы можете получить доступ к git reflog Вы не сможете проверить изменения такого рода.

Это означает, что если вы клонируете этот репо, у клона не будет никаких следов этой операции "перезаписи".

И даже если у вас есть доступ к локальному репо и его журналу, этот журнал ограничен по времени: через 90 дней (по умолчанию) его записи будут удалены.

Как только перезапись выполняется локально, она обычно принудительно отправляется в удаленный репозиторий (git push --force) и там опять нет никаких следов того, кто сделал этот принудительный толчок ( отсюда и полиграф).
(Нет, если у вас нет ACL - Access Control Level - системы управления, такой как gitolite, которая имеет свой собственный контрольный журнал)


Примечание: чтобы понять "деструктивную" природу переписывания, вам нужно понять, как коммит структурируется в объектной модели Git

http://schacon.github.io/gitbook/assets/images/figure/object-commit.png

Поля автора и коммиттера на самом деле состоят из имени и даты.

Изменение чего-либо изменяет SHA1 коммита и любых других объектов, ссылающихся на этот коммит. Без какого-либо способа узнать, что этот коммит был другим в какой-то момент (кроме reflog, локально, где была сделана модификация)

Из этой темы, используя git cat-file а также git hash-object:

$ git cat-file -p ee85b05
tree 32e5d1faecbc24b16e078ba42c1ab3e2c6515ab6
parent cef45cd0977f5f3f2baa5a5d2da857aff63ee50b
parent a5c89565fe6ceb7ebeef9794afb57415bd9bf099
author Mike Gerwitz <mikegerwitz@gnu.org> 1407466634 -0400
committer Mike Gerwitz <mikegerwitz@gnu.org> 1407466634 -0400

хеш коммита генерируется из всего вышеперечисленного контента:

(Я опустил подпись GPG и сообщение о коммите здесь)

$ git cat-file -p ee85b05 | git hash-object --stdin -tcommit
ee85b058df783ffaa9f8d5ae58f9eb6d7586b0ca

Вы заметите, что это именно тот хэш, который указан в теге.
Если бы мы изменили содержимое коммита в малейшей степени, мы получили бы другой хеш:

$ cat <( git cat-file -p ee85b05 ) <( echo foo ) | git hash-object --stdin -tcommit
696a73618dd5d0d39f030d19ceab08c14115af4e

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

Для работы со случайными форсировками и тому подобным Git поставляется с документацией и примерами того, как настроить ведение журнала и ограничения, а также все способы настройки других рабочих процессов по умолчанию. hooks каталог.

Для репозитория, настроенного даже с самой простой мерой предосторожности, исполняемый файл

#!/bin/sh
cat >>info/receives

в hooks/post-receiveответом на ваш вопрос будет "нет".

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