Можно ли переписать историю, не оставляя следов?
Я прочитал этот вопрос об изменении временной метки старого коммита.
Что я хотел бы знать, так это то, что такого рода операции являются деструктивными (т.е. не оставляют следов), или можно узнать, что в хранилище была выполнена определенная операция? Если это так, как я мог это сделать?
Спасибо
2 ответа
Если у вас нет доступа к репо, где операция (как правило, git filter-branch
), и где вы можете получить доступ к git reflog
Вы не сможете проверить изменения такого рода.
Это означает, что если вы клонируете этот репо, у клона не будет никаких следов этой операции "перезаписи".
И даже если у вас есть доступ к локальному репо и его журналу, этот журнал ограничен по времени: через 90 дней (по умолчанию) его записи будут удалены.
Как только перезапись выполняется локально, она обычно принудительно отправляется в удаленный репозиторий (git push --force
) и там опять нет никаких следов того, кто сделал этот принудительный толчок ( отсюда и полиграф).
(Нет, если у вас нет ACL - Access Control Level - системы управления, такой как gitolite, которая имеет свой собственный контрольный журнал)
Примечание: чтобы понять "деструктивную" природу переписывания, вам нужно понять, как коммит структурируется в объектной модели Git
Поля автора и коммиттера на самом деле состоят из имени и даты.
Изменение чего-либо изменяет 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
ответом на ваш вопрос будет "нет".